[PATCH] exewrapper: add an ability to always load python from hg-python subdir
Mads Kiilerich
mads at kiilerich.com
Sun Mar 12 20:39:00 EDT 2017
On 03/12/2017 04:02 PM, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1489359573 25200
> # Sun Mar 12 15:59:33 2017 -0700
> # Node ID bdd61a3470df08b09bd18bbb40e33a8f7cabe188
> # Parent 7548522742b5f4f9f5c0881ae4a2783ecda2f969
> exewrapper: add an ability to always load python from hg-python subdir
>
> Currently hg.exe will only try to load python27.dll from hg-python
> subdir if PYTHONHOME environment variable is not set and if this
> approach fails, proceed to load it from whereever possible. I want
> to be able to compile a version of hg.exe which will only use
> hg-python and not other options, regardless of its environment. This
> patch makes it so running 'python setup.py build_hgexe --usehgpython'
> builds such version.
It would be nice if we didn't need this compile flag.
I guess the opposite search order would be perfectly fine: *if* there is
a hg-python sub folder, then use it. If not, use PYTHONHOME ... or
search in $PATH.
Do you think that would work?
> It also breaks test-check-commit.t becuase it introduces a function
> named 'initialize_options', but that is a function from parent class,
> so there's not much we can do about it.
Breaks ... how?
And if it breaks it, then it must be fixed or "fixed". That doesn't seem
to be a part of this.
> diff --git a/mercurial/exewrapper.c b/mercurial/exewrapper.c
> --- a/mercurial/exewrapper.c
> +++ b/mercurial/exewrapper.c
> @@ -29,6 +29,14 @@ static char pyhome[MAX_PATH + 10];
> static char envpyhome[MAX_PATH + 10];
> static char pydllfile[MAX_PATH + 10];
>
> +/* Compiling with /DUSEHGPYTHON makes Mercurial load Python from hg-python
> +subdir regardless of environment in which hg.exe is ran. */
> +#ifdef USEHGPYTHON
> +static int usehgpython = 1;
> +#else
> +static int usehgpython = 0;
> +#endif
> +
> int main(int argc, char *argv[])
> {
> char *p;
> @@ -71,15 +79,13 @@ int main(int argc, char *argv[])
> We first check, that environment variable PYTHONHOME is *not* set.
> This just mimicks the behavior of the regular python.exe, which uses
> PYTHONHOME to find its installation directory (if it has been set).
> - Note: Users of HackableMercurial are expected to *not* set PYTHONHOME!
> + Note: Users of HackableMercurial are expected to *not* set PYTHONHOME
> + or compile exewrapper.c with /DUSEHGPYTHON.
> */
> - if (GetEnvironmentVariable("PYTHONHOME", envpyhome,
> - sizeof(envpyhome)) == 0)
> + if (usehgpython || (GetEnvironmentVariable("PYTHONHOME", envpyhome,
> + sizeof(envpyhome)) == 0))
> {
> - /*
> - Environment var PYTHONHOME is *not* set. Let's see if we are
> - running inside a HackableMercurial.
> - */
> + /* We should try to load Python from hg-python subdir */
>
> p = strrchr(pyhome, '\\');
> if (p == NULL) {
> @@ -112,6 +118,14 @@ int main(int argc, char *argv[])
> }
> Py_SetPythonHome(pyhome);
> }
> + else
> + {
> + if (pydll == NULL && usehgpython)
> + {
> + err = "can't find hg-python subdir in Mercurial dir";
> + goto bail;
> + }
> + }
> }
>
> if (pydll == NULL) {
> diff --git a/setup.py b/setup.py
> --- a/setup.py
> +++ b/setup.py
> @@ -405,6 +405,17 @@ class buildhgextindex(Command):
> class buildhgexe(build_ext):
> description = 'compile hg.exe from mercurial/exewrapper.c'
>
> + user_options = build_ext.user_options + [
> + ('usehgpython', None, 'always load python dll from hg-python subdir'),
> + ]
> +
> + boolean_options = build_ext.boolean_options + ['usehgpython']
> +
> + def initialize_options(self):
> + self.usehgpython = False
> + return build_ext.initialize_options(self)
> +
> +
> def build_extensions(self):
> if os.name != 'nt':
> return
> @@ -442,8 +453,10 @@ class buildhgexe(build_ext):
> with open('mercurial/hgpythonlib.h', 'wb') as f:
> f.write('/* this file is autogenerated by setup.py */\n')
> f.write('#define HGPYTHONLIB "%s"\n' % pythonlib)
> + extra_preargs = [] if not self.usehgpython else ["/DUSEHGPYTHON"]
> objects = self.compiler.compile(['mercurial/exewrapper.c'],
> - output_dir=self.build_temp)
> + output_dir=self.build_temp,
> + extra_preargs=extra_preargs)
> dir = os.path.dirname(self.get_ext_fullpath('dummy'))
> target = os.path.join(dir, 'hg')
> self.compiler.link_executable(objects, target,
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list