# HG changeset patch # User Kostia Balytskyi # Date 1489434253 25200 # Node ID 0241dd94ed386b3c68cc6883413a359270587925 # Parent d3a56bb268ee9bf2317f2698282d8c1ca60becb8 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. diff -r d3a56bb268ee -r 0241dd94ed38 mercurial/exewrapper.c --- 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) {