[PATCH v2] exewrapper: prefer HackableMercurial python if availbale

Augie Fackler raf at durin42.com
Thu Mar 16 13:17:41 EDT 2017


On Mon, Mar 13, 2017 at 01:06:41PM -0700, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1489434253 25200
> #      Mon Mar 13 12:44:13 2017 -0700
> # Node ID 83925d3a3306e7023b4b43757812285b40fcd90b
> # Parent  7548522742b5f4f9f5c0881ae4a2783ecda2f969
> exewrapper: prefer HackableMercurial python if availbale

Sure, queued. Seems like the right choice.

>
> 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 --git a/mercurial/exewrapper.c b/mercurial/exewrapper.c
> --- a/mercurial/exewrapper.c
> +++ b/mercurial/exewrapper.c
> @@ -67,51 +67,35 @@ int main(int argc, char *argv[])
>       }
>
>       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) {
> _______________________________________________
> 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