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.
--- 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) {