diff --git a/python-pip.spec b/python-pip.spec index d4aaf51c5d4847c8b09980f1a483ff6b124901de..9de056761a6ad621afe471c41075e983e6d3d902 100644 --- a/python-pip.spec +++ b/python-pip.spec @@ -6,7 +6,7 @@ pip is the package installer for Python. You can use pip to install packages fro %global bashcompdir %(b=$(pkg-config --variable=completionsdir bash-completion 2>/dev/null); echo ${b:-%{_sysconfdir}/bash_completion.d}) Name: python-%{srcname} Version: 21.3.1 -Release: 1 +Release: 2 Summary: A tool for installing and managing Python packages License: MIT and Python and ASL 2.0 and BSD and ISC and LGPLv2 and MPLv2.0 and (ASL 2.0 or BSD) URL: http://www.pip-installer.org @@ -14,6 +14,7 @@ Source0: %{pypi_source} BuildArch: noarch Patch1: allow-stripping-given-prefix-from-wheel-RECORD-files.patch Patch2: emit-a-warning-when-running-with-root-privileges.patch +Patch3: remove-existing-dist-only-if-path-conflicts.patch Patch6000: dummy-certifi.patch Source10: pip-allow-older-versions.patch @@ -117,6 +118,9 @@ install -p dist/%{python_wheelname} -t %{buildroot}%{python_wheeldir} %{python_wheeldir}/%{python_wheelname} %changelog +* Fri Jul 01 2022 dongyuzhen - 21.3.1-2 +- Add patches that are deleted during the upgrade + * Mon Dec 20 2021 renhongxun - 21.3.1-1 - upgrade version to 21.3.1 diff --git a/remove-existing-dist-only-if-path-conflicts.patch b/remove-existing-dist-only-if-path-conflicts.patch new file mode 100644 index 0000000000000000000000000000000000000000..7ff95e55db1c7c286e36c9b17d338142aaf50266 --- /dev/null +++ b/remove-existing-dist-only-if-path-conflicts.patch @@ -0,0 +1,147 @@ +From 517656ed4520b09ac6365467e459778f94ca2f0c Mon Sep 17 00:00:00 2001 +From: Karolina Surma +Date: Mon, 10 May 2021 18:16:20 +0200 +Subject: [PATCH] Prevent removing of the system packages installed under + /usr/lib +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +when pip install --upgrade is executed. + +Resolves: rhbz#1550368 + +Co-Authored-By: Michal Cyprian +Co-Authored-By: Victor Stinner +Co-Authored-By: Petr Viktorin +Co-Authored-By: Lumir Balhar +Co-Authored-By: Miro HronĨok +--- + src/pip/_internal/req/req_install.py | 3 ++- + src/pip/_internal/resolution/legacy/resolver.py | 5 ++++- + src/pip/_internal/resolution/resolvelib/factory.py | 13 +++++++++++++ + src/pip/_internal/utils/misc.py | 11 +++++++++++ + 4 files changed, 30 insertions(+), 2 deletions(-) + +diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py +index ff0dd2f..a72aec8 100644 +--- a/src/pip/_internal/req/req_install.py ++++ b/src/pip/_internal/req/req_install.py +@@ -46,6 +46,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, +@@ -433,7 +434,7 @@ class InstallRequirement: + 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 09caaa6..c1542ec 100644 +--- a/src/pip/_internal/resolution/legacy/resolver.py ++++ b/src/pip/_internal/resolution/legacy/resolver.py +@@ -44,6 +44,7 @@ from pip._internal.resolution.base import BaseResolver, InstallRequirementProvid + 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 + + logger = logging.getLogger(__name__) +@@ -203,7 +204,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/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py +index 766dc26..c8c1cd8 100644 +--- a/src/pip/_internal/resolution/resolvelib/factory.py ++++ b/src/pip/_internal/resolution/resolvelib/factory.py +@@ -1,6 +1,8 @@ + import contextlib + import functools + import logging ++import sys ++import sysconfig + from typing import ( + TYPE_CHECKING, + Dict, +@@ -33,6 +34,7 @@ from pip._internal.exceptions import ( + UnsupportedWheel, + ) + from pip._internal.index.package_finder import PackageFinder ++from pip._internal.locations import get_scheme + from pip._internal.metadata import BaseDistribution, get_default_environment + from pip._internal.models.link import Link + from pip._internal.models.wheel import Wheel +@@ -45,6 +47,7 @@ from pip._internal.req.req_install import ( + from pip._internal.resolution.base import InstallRequirementProvider + from pip._internal.utils.compatibility_tags import get_supported + from pip._internal.utils.hashes import Hashes ++from pip._internal.utils.misc import dist_location + from pip._internal.utils.packaging import get_requirement + from pip._internal.utils.virtualenv import running_under_virtualenv + +@@ -526,6 +529,16 @@ class Factory: + if dist is None: # Not installed, no uninstallation required. + return None + ++ # Prevent uninstalling packages from /usr ++ try: ++ if dist_location(dist._dist) in ( ++ sysconfig.get_path('purelib', scheme='rpm_prefix', vars={'base': sys.base_prefix}), ++ sysconfig.get_path('platlib', scheme='rpm_prefix', vars={'base': sys.base_prefix}), ++ ): ++ return None ++ except KeyError: # this Python doesn't have 'rpm_prefix' scheme yet ++ pass ++ + # We're installing into global site. The current installation must + # be uninstalled, no matter it's in global or user site, because the + # user site installation has precedence over global. +diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py +index d3e9053..d25d1c3 100644 +--- a/src/pip/_internal/utils/misc.py ++++ b/src/pip/_internal/utils/misc.py +@@ -38,6 +38,7 @@ from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed + from pip import __version__ + from pip._internal.exceptions import CommandError + from pip._internal.locations import get_major_minor_version, site_packages, user_site ++from pip._internal.locations import get_scheme + from pip._internal.utils.compat import WINDOWS + from pip._internal.utils.egg_link import egg_link_path_from_location + from pip._internal.utils.virtualenv import running_under_virtualenv +@@ -354,6 +355,16 @@ def dist_in_site_packages(dist: Distribution) -> bool: + 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( ++ get_scheme("").purelib.split('python')[0])) ++ ++ + def get_distribution(req_name: str) -> Optional[Distribution]: + """Given a requirement name, return the installed Distribution object. + +-- +2.32.0 +