[PATCH 3 of 6 import-refactor V3] setup: refactor handling of modules with C/Python implementations

Yuya Nishihara yuya at tcha.org
Fri Dec 4 07:02:19 CST 2015


On Thu, 03 Dec 2015 21:51:09 -0800, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1449208092 28800
> #      Thu Dec 03 21:48:12 2015 -0800
> # Node ID c5cea2ce781221a791697d0f8c98c24ca083c071
> # Parent  e7f2cafddb61f893011f19927778eec255df4805
> setup: refactor handling of modules with C/Python implementations

> --- a/setup.py
> +++ b/setup.py
> @@ -308,36 +308,45 @@ class hgbuildpy(build_py):
>      if convert2to3:
>          fixer_names = sorted(set(getfixers("lib2to3.fixes") +
>                                   getfixers("hgfixes")))
>  
>      def finalize_options(self):
>          build_py.finalize_options(self)
>  
>          if self.distribution.pure:
> -            if self.py_modules is None:
> -                self.py_modules = []
> -            for ext in self.distribution.ext_modules:
> -                if ext.name.startswith("mercurial."):
> -                    self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
>              self.distribution.ext_modules = []
>          else:
>              h = os.path.join(get_python_inc(), 'Python.h')
>              if not os.path.exists(h):
>                  raise SystemExit('Python headers are required to build '
>                                   'Mercurial but weren\'t found in %s' % h)
>  
> -    def find_modules(self):
> -        modules = build_py.find_modules(self)
> -        for module in modules:
> -            if module[0] == "mercurial.pure":
> -                if module[1] != "__init__":
> -                    yield ("mercurial", module[1], module[2])
> -            else:
> -                yield module
> +    def run(self):
> +        if self.distribution.pure:
> +            modulepolicy = 'py'
> +        else:
> +            modulepolicy = 'c'
> +
> +        realcopyfile = file_util.copy_file
> +        def replacemodulepolicycopy(*args, **kwargs):
> +            dst, copied = realcopyfile(*args, **kwargs)
> +
> +            if dst.endswith('__init__.py'):
> +                content = open(dst, 'rb').read()
> +                content = content.replace(b'@MODULELOADPOLICY@',
> +                                          modulepolicy.encode(libdir_escape))
> +                with open(dst, 'wb') as fh:
> +                    fh.write(content)

"make local" overwrites mercurial/__init__.py. I'll make a couple of tweaks
on this patch and push the series to the clowncopter.

 - fix the overwrite issue
 - return dst, copied
 - override self.copy_file instead of patching file_util.copy_file


More information about the Mercurial-devel mailing list