bpo-37672: Switch Windows Store package to use pip.ini for user mode (GH-14939)

This commit is contained in:
Steve Dower 2019-07-24 15:13:22 -07:00 committed by GitHub
parent e018dc52d1
commit 123536fdab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 35 deletions

View file

@ -0,0 +1,2 @@
Switch Windows Store package's pip to use bundled :file:`pip.ini` instead of
:envvar:`PIP_USER` variable.

View file

@ -228,7 +228,7 @@ def get_layout(ns):
if ns.include_pip: if ns.include_pip:
for dest, src in get_pip_layout(ns): for dest, src in get_pip_layout(ns):
if isinstance(src, tuple) or not ( if not isinstance(src, tuple) and (
src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB src in EXCLUDE_FROM_LIB or src in EXCLUDE_FROM_PACKAGED_LIB
): ):
continue continue

View file

@ -33,7 +33,11 @@ def get_pip_layout(ns):
pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}" pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}"
for dest, src in rglob(pip_dir, "**/*"): for dest, src in rglob(pip_dir, "**/*"):
yield pkg_root.format(dest), src yield pkg_root.format(dest), src
yield "pip.ini", ("pip.ini", b"[global]\nuser=yes") content = "\n".join(
"[{}]\nuser=yes".format(n)
for n in ["install", "uninstall", "freeze", "list"]
)
yield "pip.ini", ("pip.ini", content.encode())
def extract_pip_files(ns): def extract_pip_files(ns):

View file

@ -122,6 +122,12 @@ set_process_name(PyConfig *config)
break; break;
} }
} }
size_t i = executable.find_last_of(L"/\\");
if (i == std::wstring::npos) {
executable = PROGNAME;
} else {
executable.replace(i + 1, std::wstring::npos, PROGNAME);
}
} }
if (!home.empty()) { if (!home.empty()) {
@ -163,10 +169,29 @@ wmain(int argc, wchar_t **argv)
PyPreConfig preconfig; PyPreConfig preconfig;
PyConfig config; PyConfig config;
const wchar_t *moduleName = NULL;
const wchar_t *p = wcsrchr(argv[0], L'\\');
if (!p) {
p = argv[0];
}
if (p) {
if (*p == L'\\') {
p++;
}
if (wcsnicmp(p, L"pip", 3) == 0) {
moduleName = L"pip";
} else if (wcsnicmp(p, L"idle", 4) == 0) {
moduleName = L"idlelib";
}
}
PyPreConfig_InitPythonConfig(&preconfig); PyPreConfig_InitPythonConfig(&preconfig);
status = Py_PreInitializeFromArgs(&preconfig, argc, argv); if (!moduleName) {
if (PyStatus_Exception(status)) { status = Py_PreInitializeFromArgs(&preconfig, argc, argv);
goto fail_without_config; if (PyStatus_Exception(status)) {
goto fail_without_config;
}
} }
status = PyConfig_InitPythonConfig(&config); status = PyConfig_InitPythonConfig(&config);
@ -178,48 +203,32 @@ wmain(int argc, wchar_t **argv)
if (PyStatus_Exception(status)) { if (PyStatus_Exception(status)) {
goto fail; goto fail;
} }
if (moduleName) {
config.parse_argv = 0;
}
status = set_process_name(&config); status = set_process_name(&config);
if (PyStatus_Exception(status)) { if (PyStatus_Exception(status)) {
goto fail; goto fail;
} }
const wchar_t *p = _wgetenv(L"PYTHONUSERBASE"); p = _wgetenv(L"PYTHONUSERBASE");
if (!p || !*p) { if (!p || !*p) {
_wputenv_s(L"PYTHONUSERBASE", get_user_base().c_str()); _wputenv_s(L"PYTHONUSERBASE", get_user_base().c_str());
} }
p = wcsrchr(argv[0], L'\\'); if (moduleName) {
if (!p) { status = PyConfig_SetString(&config, &config.run_module, moduleName);
p = argv[0]; if (PyStatus_Exception(status)) {
} goto fail;
if (p) {
if (*p == L'\\') {
p++;
} }
status = PyConfig_SetString(&config, &config.run_filename, NULL);
const wchar_t *moduleName = NULL; if (PyStatus_Exception(status)) {
if (wcsnicmp(p, L"pip", 3) == 0) { goto fail;
moduleName = L"pip";
/* No longer required when pip 19.1 is added */
_wputenv_s(L"PIP_USER", L"true");
} else if (wcsnicmp(p, L"idle", 4) == 0) {
moduleName = L"idlelib";
} }
status = PyConfig_SetString(&config, &config.run_command, NULL);
if (moduleName) { if (PyStatus_Exception(status)) {
status = PyConfig_SetString(&config, &config.run_module, moduleName); goto fail;
if (PyStatus_Exception(status)) {
goto fail;
}
status = PyConfig_SetString(&config, &config.run_filename, NULL);
if (PyStatus_Exception(status)) {
goto fail;
}
status = PyConfig_SetString(&config, &config.run_command, NULL);
if (PyStatus_Exception(status)) {
goto fail;
}
} }
} }