diff --git a/contrib/packaging/hgpackaging/py2exe.py b/contrib/packaging/hgpackaging/py2exe.py --- a/contrib/packaging/hgpackaging/py2exe.py +++ b/contrib/packaging/hgpackaging/py2exe.py @@ -118,6 +118,10 @@ def build_py2exe(source_dir: pathlib.Pat if extra_packages: env['HG_PY2EXE_EXTRA_PACKAGES'] = ' '.join(sorted(extra_packages)) + hgext3rd_extras = sorted( + e for e in extra_packages if e.startswith('hgext3rd.')) + if hgext3rd_extras: + env['HG_PY2EXE_EXTRA_INSTALL_PACKAGES'] = ' '.join(hgext3rd_extras) if extra_excludes: env['HG_PY2EXE_EXTRA_EXCLUDES'] = ' '.join(sorted(extra_excludes)) if extra_dll_excludes: diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -975,6 +975,12 @@ if sys.version_info[0] == 2: packages.extend(['mercurial.thirdparty.concurrent', 'mercurial.thirdparty.concurrent.futures']) +if 'HG_PY2EXE_EXTRA_INSTALL_PACKAGES' in os.environ: + # py2exe can't cope with namespace packages very well, so we have to + # install any hgext3rd.* extensions that we want in the final py2exe + # image here. This is gross, but you gotta do what you gotta do. + packages.extend(os.environ['HG_PY2EXE_EXTRA_INSTALL_PACKAGES'].split(' ')) + common_depends = ['mercurial/bitmanipulation.h', 'mercurial/compat.h', 'mercurial/cext/util.h']