| From 854fd7296bb9306d46ba3cc8bb7c6f18a7960ed6 Mon Sep 17 00:00:00 2001 |
| From: Tomas Hrnciar <thrnciar@redhat.com> |
| Date: Sun, 26 Apr 2020 21:19:03 +0200 |
| Subject: [PATCH] Prevent removing of the system packages installed under |
| /usr/lib |
| |
| when pip install -U is executed. |
| |
| Resolves: rhbz#1550368 |
| |
| Co-Authored-By: Michal Cyprian <m.cyprian@gmail.com> |
| Co-Authored-By: Victor Stinner <vstinner@redhat.com> |
| |
| src/pip/_internal/req/req_install.py | 3 ++- |
| src/pip/_internal/resolution/legacy/resolver.py | 5 ++++- |
| src/pip/_internal/utils/misc.py | 11 +++++++++++ |
| 3 files changed, 17 insertions(+), 2 deletions(-) |
| |
| diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py |
| index 4759f4a..2e76e35 100644 |
| |
| |
| @@ -39,6 +39,7 @@ from pip._internal.utils.misc import ( |
| ask_path_exists, |
| backup_dir, |
| display_path, |
| + dist_in_install_path, |
| dist_in_site_packages, |
| dist_in_usersite, |
| get_distribution, |
| @@ -446,7 +447,7 @@ class InstallRequirement(object): |
| "lack sys.path precedence to {} in {}".format( |
| existing_dist.project_name, existing_dist.location) |
| ) |
| - else: |
| + elif dist_in_install_path(existing_dist): |
| self.should_reinstall = True |
| else: |
| if self.editable: |
| diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py |
| index c9b4c66..ff361d8 100644 |
| |
| |
| @@ -34,6 +34,7 @@ from pip._internal.resolution.base import BaseResolver |
| from pip._internal.utils.compatibility_tags import get_supported |
| from pip._internal.utils.logging import indent_log |
| from pip._internal.utils.misc import dist_in_usersite, normalize_version_info |
| +from pip._internal.utils.misc import dist_in_install_path |
| from pip._internal.utils.packaging import ( |
| check_requires_python, |
| get_requires_python, |
| @@ -207,7 +208,9 @@ class Resolver(BaseResolver): |
| """ |
| # Don't uninstall the conflict if doing a user install and the |
| # conflict is not a user install. |
| - if not self.use_user_site or dist_in_usersite(req.satisfied_by): |
| + if ((not self.use_user_site |
| + or dist_in_usersite(req.satisfied_by)) |
| + and dist_in_install_path(req.satisfied_by)): |
| req.should_reinstall = True |
| req.satisfied_by = None |
| |
| diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py |
| index 24a7455..5fd48d3 100644 |
| |
| |
| @@ -31,6 +31,7 @@ from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote |
| from pip import __version__ |
| from pip._internal.exceptions import CommandError |
| from pip._internal.locations import ( |
| + distutils_scheme, |
| get_major_minor_version, |
| site_packages, |
| user_site, |
| @@ -403,6 +404,16 @@ def dist_in_site_packages(dist): |
| return dist_location(dist).startswith(normalize_path(site_packages)) |
| |
| |
| +def dist_in_install_path(dist): |
| + """ |
| + Return True if given Distribution is installed in |
| + path matching distutils_scheme layout. |
| + """ |
| + norm_path = normalize_path(dist_location(dist)) |
| + return norm_path.startswith(normalize_path( |
| + distutils_scheme("")['purelib'].split('python')[0])) |
| + |
| + |
| def dist_is_editable(dist): |
| # type: (Distribution) -> bool |
| """ |
| -- |
| 2.25.4 |
| |