Issue #27874: Allows use of pythonXX.zip file as landmark on Windows
This commit is contained in:
parent
2a1f30f681
commit
502893896a
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
* We attempt to locate the "Python Home" - if the PYTHONHOME env var
|
* We attempt to locate the "Python Home" - if the PYTHONHOME env var
|
||||||
is set, we believe it. Otherwise, we use the path of our host .EXE's
|
is set, we believe it. Otherwise, we use the path of our host .EXE's
|
||||||
to try and locate our "landmark" (lib\\os.py) and deduce our home.
|
to try and locate on of our "landmarks" and deduce our home.
|
||||||
- If we DO have a Python Home: The relevant sub-directories (Lib,
|
- If we DO have a Python Home: The relevant sub-directories (Lib,
|
||||||
plat-win, etc) are based on the Python Home
|
plat-win, etc) are based on the Python Home
|
||||||
- If we DO NOT have a Python Home, the core Python Path is
|
- If we DO NOT have a Python Home, the core Python Path is
|
||||||
|
@ -207,7 +207,7 @@ join(wchar_t *buffer, const wchar_t *stuff)
|
||||||
'landmark' can not overflow prefix if too long.
|
'landmark' can not overflow prefix if too long.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
gotlandmark(wchar_t *landmark)
|
gotlandmark(const wchar_t *landmark)
|
||||||
{
|
{
|
||||||
int ok;
|
int ok;
|
||||||
Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN);
|
Py_ssize_t n = wcsnlen_s(prefix, MAXPATHLEN);
|
||||||
|
@ -221,7 +221,7 @@ gotlandmark(wchar_t *landmark)
|
||||||
/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
|
/* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
|
||||||
assumption provided by only caller, calculate_path() */
|
assumption provided by only caller, calculate_path() */
|
||||||
static int
|
static int
|
||||||
search_for_prefix(wchar_t *argv0_path, wchar_t *landmark)
|
search_for_prefix(wchar_t *argv0_path, const wchar_t *landmark)
|
||||||
{
|
{
|
||||||
/* Search from argv0_path, until landmark is found */
|
/* Search from argv0_path, until landmark is found */
|
||||||
wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path);
|
wcscpy_s(prefix, MAXPATHLEN + 1, argv0_path);
|
||||||
|
@ -630,8 +630,24 @@ calculate_path(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calculate zip archive path from DLL or exe path */
|
||||||
|
if (wcscpy_s(zip_path, MAXPATHLEN + 1, dllpath[0] ? dllpath : progpath)) {
|
||||||
|
/* exceeded buffer length - ignore zip_path */
|
||||||
|
zip_path[0] = '\0';
|
||||||
|
} else {
|
||||||
|
wchar_t *dot = wcsrchr(zip_path, '.');
|
||||||
|
if (!dot || wcscpy_s(dot, MAXPATHLEN + 1 - (dot - zip_path), L".zip")) {
|
||||||
|
/* exceeded buffer length - ignore zip_path */
|
||||||
|
zip_path[0] = L'\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pythonhome == NULL || *pythonhome == '\0') {
|
if (pythonhome == NULL || *pythonhome == '\0') {
|
||||||
if (search_for_prefix(argv0_path, LANDMARK))
|
if (zip_path[0] && exists(zip_path)) {
|
||||||
|
wcscpy_s(prefix, MAXPATHLEN+1, zip_path);
|
||||||
|
reduce(prefix);
|
||||||
|
pythonhome = prefix;
|
||||||
|
} else if (search_for_prefix(argv0_path, LANDMARK))
|
||||||
pythonhome = prefix;
|
pythonhome = prefix;
|
||||||
else
|
else
|
||||||
pythonhome = NULL;
|
pythonhome = NULL;
|
||||||
|
@ -643,17 +659,6 @@ calculate_path(void)
|
||||||
envpath = NULL;
|
envpath = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* Calculate zip archive path from DLL or exe path */
|
|
||||||
if (wcscpy_s(zip_path, MAXPATHLEN+1, dllpath[0] ? dllpath : progpath))
|
|
||||||
/* exceeded buffer length - ignore zip_path */
|
|
||||||
zip_path[0] = '\0';
|
|
||||||
else {
|
|
||||||
wchar_t *dot = wcsrchr(zip_path, '.');
|
|
||||||
if (!dot || wcscpy_s(dot, MAXPATHLEN+1 - (dot - zip_path), L".zip"))
|
|
||||||
/* exceeded buffer length - ignore zip_path */
|
|
||||||
zip_path[0] = L'\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
skiphome = pythonhome==NULL ? 0 : 1;
|
skiphome = pythonhome==NULL ? 0 : 1;
|
||||||
#ifdef Py_ENABLE_SHARED
|
#ifdef Py_ENABLE_SHARED
|
||||||
machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);
|
machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);
|
||||||
|
|
Loading…
Reference in New Issue