Patches 383 and 384 were merged upstream. Patch 385 was partially merged upstream, the PR with test is still open.
108 lines
4.5 KiB
Diff
108 lines
4.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Lumir Balhar <lbalhar@redhat.com>
|
|
Date: Mon, 15 Feb 2021 12:19:27 +0100
|
|
Subject: [PATCH] 00251: Change user install location
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Change the values of sysconfig's "posix_prefix" install scheme to /usr/local
|
|
when RPM build or venv/virtualenv is not detected,
|
|
to make pip, sysconfig and distutils install into an isolated location.
|
|
|
|
The original values are saved as an additional "rpm_prefix" install scheme.
|
|
|
|
The site module adds the /usr/local paths to sys.path when site packages are
|
|
enabled and RPM build is not detected.
|
|
|
|
Fedora Change: https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
|
|
|
Rewrote in Fedora 36+ to patch sysconfig instead of distutils,
|
|
see https://discuss.python.org/t/pep-632-deprecate-distutils-module/5134/104
|
|
|
|
Downstream only for now, waiting for https://bugs.python.org/issue43976
|
|
|
|
Co-authored-by: Petr Viktorin <encukou@gmail.com>
|
|
Co-authored-by: Miro Hrončok <miro@hroncok.cz>
|
|
Co-authored-by: Michal Cyprian <m.cyprian@gmail.com>
|
|
Co-authored-by: Lumír Balhar <frenzy.madness@gmail.com>
|
|
---
|
|
Lib/site.py | 9 ++++++++-
|
|
Lib/sysconfig.py | 19 +++++++++++++++++++
|
|
Lib/test/test_sysconfig.py | 4 +++-
|
|
3 files changed, 30 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/Lib/site.py b/Lib/site.py
|
|
index 69670d9d7f..104cb93899 100644
|
|
--- a/Lib/site.py
|
|
+++ b/Lib/site.py
|
|
@@ -377,8 +377,15 @@ def getsitepackages(prefixes=None):
|
|
return sitepackages
|
|
|
|
def addsitepackages(known_paths, prefixes=None):
|
|
- """Add site-packages to sys.path"""
|
|
+ """Add site-packages to sys.path
|
|
+
|
|
+ '/usr/local' is included in PREFIXES if RPM build is not detected
|
|
+ to make packages installed into this location visible.
|
|
+
|
|
+ """
|
|
_trace("Processing global site-packages")
|
|
+ if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ:
|
|
+ PREFIXES.insert(0, "/usr/local")
|
|
for sitedir in getsitepackages(prefixes):
|
|
if os.path.isdir(sitedir):
|
|
addsitedir(sitedir, known_paths)
|
|
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
|
|
index ebe3711827..dca8aa89b6 100644
|
|
--- a/Lib/sysconfig.py
|
|
+++ b/Lib/sysconfig.py
|
|
@@ -103,6 +103,25 @@
|
|
else:
|
|
_INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
|
|
|
|
+# backup the original posix_prefix as rpm_prefix
|
|
+# RPM packages use it and we need to be able to read it even when changed
|
|
+_INSTALL_SCHEMES['rpm_prefix'] = _INSTALL_SCHEMES['posix_prefix']
|
|
+
|
|
+if (not (hasattr(sys, 'real_prefix') or
|
|
+ sys.prefix != sys.base_prefix) and
|
|
+ 'RPM_BUILD_ROOT' not in os.environ):
|
|
+ _INSTALL_SCHEMES['posix_prefix'] = {
|
|
+ 'stdlib': '{installed_base}/{platlibdir}/python{py_version_short}',
|
|
+ 'platstdlib': '{platbase}/{platlibdir}/python{py_version_short}',
|
|
+ 'purelib': '{base}/local/lib/python{py_version_short}/site-packages',
|
|
+ 'platlib': '{platbase}/local/{platlibdir}/python{py_version_short}/site-packages',
|
|
+ 'include':
|
|
+ '{installed_base}/include/python{py_version_short}{abiflags}',
|
|
+ 'platinclude':
|
|
+ '{installed_platbase}/include/python{py_version_short}{abiflags}',
|
|
+ 'scripts': '{base}/local/bin',
|
|
+ 'data': '{base}/local',
|
|
+ }
|
|
|
|
# NOTE: site.py has copy of this function.
|
|
# Sync it when modify this function.
|
|
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
|
|
index 578ac1db50..e78ff15ad3 100644
|
|
--- a/Lib/test/test_sysconfig.py
|
|
+++ b/Lib/test/test_sysconfig.py
|
|
@@ -336,7 +336,7 @@ def test_get_config_h_filename(self):
|
|
self.assertTrue(os.path.isfile(config_h), config_h)
|
|
|
|
def test_get_scheme_names(self):
|
|
- wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv']
|
|
+ wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv', 'rpm_prefix']
|
|
if HAS_USER_BASE:
|
|
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
|
|
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
|
|
@@ -348,6 +348,8 @@ def test_symlink(self): # Issue 7880
|
|
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
|
|
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
|
|
|
|
+ @unittest.skipIf('RPM_BUILD_ROOT' not in os.environ,
|
|
+ "Test doesn't expect Fedora's paths")
|
|
def test_user_similar(self):
|
|
# Issue #8759: make sure the posix scheme for the users
|
|
# is similar to the global posix_prefix one
|