Mercurial > hg
changeset 31443:0241dd94ed38
exewrapper: prefer HackableMercurial python if availbale
Currently hg.exe will only try to load python27.dll from hg-python
subdir if PYTHONHOME environment variable is not set. I think that
it is better to check whether 'hg-python' subdir exists and load
python from it in that case, regardless of environment. This allows
for reliable approach of distributing Mercurial with its own Python.
author | Kostia Balytskyi <ikostia@fb.com> |
---|---|
date | Mon, 13 Mar 2017 12:44:13 -0700 |
parents | d3a56bb268ee |
children | 55390e97fdd2 |
files | mercurial/exewrapper.c |
diffstat | 1 files changed, 25 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/exewrapper.c Tue Mar 14 23:07:08 2017 -0700 +++ b/mercurial/exewrapper.c Mon Mar 13 12:44:13 2017 -0700 @@ -67,51 +67,35 @@ } pydll = NULL; - /* - 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! - */ - if (GetEnvironmentVariable("PYTHONHOME", envpyhome, - sizeof(envpyhome)) == 0) - { - /* - Environment var PYTHONHOME is *not* set. Let's see if we are - running inside a HackableMercurial. - */ + + p = strrchr(pyhome, '\\'); + if (p == NULL) { + err = "can't find backslash in module filename"; + goto bail; + } + *p = 0; /* cut at directory */ + + /* check for private Python of HackableMercurial */ + strcat_s(pyhome, sizeof(pyhome), "\\hg-python"); - p = strrchr(pyhome, '\\'); - if (p == NULL) { - err = "can't find backslash in module filename"; + hfind = FindFirstFile(pyhome, &fdata); + if (hfind != INVALID_HANDLE_VALUE) { + /* Path .\hg-python exists. We are probably in HackableMercurial + scenario, so let's load python dll from this dir. */ + FindClose(hfind); + strcpy_s(pydllfile, sizeof(pydllfile), pyhome); + strcat_s(pydllfile, sizeof(pydllfile), "\\" HGPYTHONLIB ".dll"); + pydll = LoadLibrary(pydllfile); + if (pydll == NULL) { + err = "failed to load private Python DLL " HGPYTHONLIB ".dll"; goto bail; } - *p = 0; /* cut at directory */ - - /* check for private Python of HackableMercurial */ - strcat_s(pyhome, sizeof(pyhome), "\\hg-python"); - - hfind = FindFirstFile(pyhome, &fdata); - if (hfind != INVALID_HANDLE_VALUE) { - /* path pyhome exists, let's use it */ - FindClose(hfind); - strcpy_s(pydllfile, sizeof(pydllfile), pyhome); - strcat_s(pydllfile, sizeof(pydllfile), - "\\" HGPYTHONLIB ".dll"); - pydll = LoadLibrary(pydllfile); - if (pydll == NULL) { - err = "failed to load private Python DLL " - HGPYTHONLIB ".dll"; - goto bail; - } - Py_SetPythonHome = (void*)GetProcAddress(pydll, - "Py_SetPythonHome"); - if (Py_SetPythonHome == NULL) { - err = "failed to get Py_SetPythonHome"; - goto bail; - } - Py_SetPythonHome(pyhome); + Py_SetPythonHome = (void*)GetProcAddress(pydll, "Py_SetPythonHome"); + if (Py_SetPythonHome == NULL) { + err = "failed to get Py_SetPythonHome"; + goto bail; } + Py_SetPythonHome(pyhome); } if (pydll == NULL) {