[PATCH 3 of 5 import-refactor] setup: rewrite @MODULELOADPOLICY@ during install

Gregory Szorc gregory.szorc at gmail.com
Sun Nov 22 00:14:05 CST 2015


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1448168053 28800
#      Sat Nov 21 20:54:13 2015 -0800
# Node ID b1f0ae9d3abf60a1326e305237c31ce3fee7262b
# Parent  594a8931ee9b1eb82f754a3a4eab3cfc7b3811b1
setup: rewrite @MODULELOADPOLICY@ during install

This patch enforces a sane module load policy by rewriting the "hg" script
to define a policy that is appropriate for the installation settings.

For CPython, the policy will be to require C extensions. This is the
default behavior if "hg" isn't rewritten. But being explicit is nice.

If a pure Python installation is performed, the module load policy
is automatically changed to 'py' so we don't even attempt to load C
extensions.

diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -420,19 +420,18 @@ class hginstalllib(install_lib):
         file_util.copy_file = copyfileandsetmode
         try:
             install_lib.run(self)
         finally:
             file_util.copy_file = realcopyfile
 
 class hginstallscripts(install_scripts):
     '''
-    This is a specialization of install_scripts that replaces the @LIBDIR@ with
-    the configured directory for modules. If possible, the path is made relative
-    to the directory for scripts.
+    This is a specialization of install_scripts that replaces @VAR@ with
+    variables.
     '''
 
     def initialize_options(self):
         install_scripts.initialize_options(self)
 
         self.install_lib = None
 
     def finalize_options(self):
@@ -450,26 +449,33 @@ class hginstallscripts(install_scripts):
             libdir = self.install_lib
         else:
             common = os.path.commonprefix((self.install_dir, self.install_lib))
             rest = self.install_dir[len(common):]
             uplevel = len([n for n in os.path.split(rest) if n])
 
             libdir =  uplevel * ('..' + os.sep) + self.install_lib[len(common):]
 
+        if self.distribution.pure:
+            policy = 'py'
+        else:
+            policy = 'c'
+
         for outfile in self.outfiles:
             fp = open(outfile, 'rb')
             data = fp.read()
             fp.close()
 
             # skip binary files
             if b('\0') in data:
                 continue
 
             data = data.replace(b('@LIBDIR@'), libdir.encode(libdir_escape))
+            data = data.replace(b('@MODULELOADPOLICY@'), policy)
+
             fp = open(outfile, 'wb')
             fp.write(data)
             fp.close()
 
 cmdclass = {'build': hgbuild,
             'build_mo': hgbuildmo,
             'build_ext': hgbuildext,
             'build_py': hgbuildpy,


More information about the Mercurial-devel mailing list