Update to 21.1.1

Changes:
- dropped emit-a-warning-when-running-with-root-privileges.patch (fixed in upstream)
- rebased dummy-certifi.patch, remove-existing-dist-only-if-path-conflicts.patch, nowarn-pip._internal.main.patch
This commit is contained in:
Karolina Surma 2021-05-11 16:58:03 +02:00
parent 695f7debe3
commit 5afdc00b06
7 changed files with 86 additions and 139 deletions

View File

@ -1,25 +1,26 @@
From cf96ff346639d1b9f5efa3fd0976694e04df3f5f Mon Sep 17 00:00:00 2001 From 2c58d7301dd5a47570f782fe2fce7fbb1918f60c Mon Sep 17 00:00:00 2001
From: Tomas Hrnciar <thrnciar@redhat.com> From: Karolina Surma <ksurma@redhat.com>
Date: Sun, 26 Apr 2020 21:38:44 +0200 Date: Mon, 10 May 2021 16:38:50 +0200
Subject: [PATCH] Dummy certifi patch Subject: [PATCH] Dummy certifi patch
Co-Authored-By: Tomas Hrnciar <thrnciar@redhat.com>
--- ---
src/pip/_vendor/certifi/core.py | 5 ++--- src/pip/_vendor/certifi/core.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-) 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/pip/_vendor/certifi/core.py b/src/pip/_vendor/certifi/core.py diff --git a/src/pip/_vendor/certifi/core.py b/src/pip/_vendor/certifi/core.py
index 8987449..d174ced 100644 index b8140cf..f1a0b01 100644
--- a/src/pip/_vendor/certifi/core.py --- a/src/pip/_vendor/certifi/core.py
+++ b/src/pip/_vendor/certifi/core.py +++ b/src/pip/_vendor/certifi/core.py
@@ -9,6 +9,7 @@ This module returns the installation location of cacert.pem or its contents. @@ -14,6 +14,7 @@ class _PipPatchedCertificate(Exception):
import os
try: try:
+ raise ImportError # force fallback + raise ImportError # force fallback
from importlib.resources import path as get_path, read_text # Return a certificate file on disk for a standalone pip zipapp running in
# an isolated build environment to use. Passing --cert to the standalone
_CACERT_CTX = None # pip does not work since requests calls where() unconditionally on import.
@@ -51,9 +52,7 @@ except ImportError: @@ -67,9 +68,7 @@ except ImportError:
# If we don't have importlib.resources, then we will just do the old logic # If we don't have importlib.resources, then we will just do the old logic
# of assuming we're on the filesystem and munge the path directly. # of assuming we're on the filesystem and munge the path directly.
def where(): def where():
@ -27,9 +28,9 @@ index 8987449..d174ced 100644
- -
- return os.path.join(f, "cacert.pem") - return os.path.join(f, "cacert.pem")
+ return '/etc/pki/tls/certs/ca-bundle.crt' + return '/etc/pki/tls/certs/ca-bundle.crt'
def contents(): def contents():
-- --
2.25.4 2.30.2

View File

@ -1,51 +0,0 @@
From 74bb5d26e232493de43adfa1f4b42b66fd701294 Mon Sep 17 00:00:00 2001
From: Tomas Hrnciar <thrnciar@redhat.com>
Date: Sun, 26 Apr 2020 13:52:24 +0200
Subject: [PATCH] Downstream only patch
Emit a warning to the user if pip install is run with root privileges
Issue upstream: https://github.com/pypa/pip/issues/4288
---
src/pip/_internal/commands/install.py | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py
index 70bda2e2..1e750ae1 100644
--- a/src/pip/_internal/commands/install.py
+++ b/src/pip/_internal/commands/install.py
@@ -13,6 +13,8 @@ import operator
import os
import shutil
import site
+import sys
+from os import path
from optparse import SUPPRESS_HELP
from pip._vendor import pkg_resources
@@ -241,6 +243,23 @@ class InstallCommand(RequirementCommand):
raise CommandError("Can not combine '--user' and '--target'")
cmdoptions.check_install_build_global(options)
+
+ def is_venv():
+ return (hasattr(sys, 'real_prefix') or
+ (hasattr(sys, 'base_prefix') and
+ sys.base_prefix != sys.prefix))
+
+ # Check whether we have root privileges and aren't in venv/virtualenv
+ if os.getuid() == 0 and not is_venv() and not options.root_path:
+ command = path.basename(sys.argv[0])
+ if command == "__main__.py":
+ command = path.basename(sys.executable) + " -m pip"
+ logger.warning(
+ "Running pip install with root privileges is "
+ "generally not a good idea. Try `%s install --user` instead."
+ % command
+ )
+
upgrade_strategy = "to-satisfy-only"
if options.upgrade:
upgrade_strategy = options.upgrade_strategy
--
2.23.0

View File

@ -1,10 +1,12 @@
From 7c36cb21910b415e0eb171d0f6c4dbf72382fdaf Mon Sep 17 00:00:00 2001 From 8519679166122b7482a70f6c10d303520e5f83c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz> From: Karolina Surma <ksurma@redhat.com>
Date: Tue, 10 Mar 2020 11:03:22 +0100 Date: Mon, 10 May 2021 16:48:49 +0200
Subject: [PATCH] Don't warn the user about pip._internal.main() entrypoint Subject: [PATCH] Don't warn the user about pip._internal.main() entrypoint
In Fedora, we use that in ensurepip and users cannot do anything about it, In Fedora, we use that in ensurepip and users cannot do anything about it,
this warning is juts moot. Also, the warning breaks CPython test suite. this warning is juts moot. Also, the warning breaks CPython test suite.
Co-Authored-By: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
--- ---
src/pip/_internal/__init__.py | 2 +- src/pip/_internal/__init__.py | 2 +-
src/pip/_internal/utils/entrypoints.py | 19 ++++++++++--------- src/pip/_internal/utils/entrypoints.py | 19 ++++++++++---------
@ -12,29 +14,29 @@ this warning is juts moot. Also, the warning breaks CPython test suite.
3 files changed, 13 insertions(+), 11 deletions(-) 3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py
index 3aa8a46..0ec017b 100755 index 41071cd..c7b4e65 100755
--- a/src/pip/_internal/__init__.py --- a/src/pip/_internal/__init__.py
+++ b/src/pip/_internal/__init__.py +++ b/src/pip/_internal/__init__.py
@@ -15,4 +15,4 @@ def main(args=None): @@ -12,4 +12,4 @@ def main(args=None):
""" """
from pip._internal.utils.entrypoints import _wrapper from pip._internal.utils.entrypoints import _wrapper
- return _wrapper(args) - return _wrapper(args)
+ return _wrapper(args, _nowarn=True) + return _wrapper(args, _nowarn=True)
diff --git a/src/pip/_internal/utils/entrypoints.py b/src/pip/_internal/utils/entrypoints.py diff --git a/src/pip/_internal/utils/entrypoints.py b/src/pip/_internal/utils/entrypoints.py
index befd01c..d6f3632 100644 index 879bf21..584e8b5 100644
--- a/src/pip/_internal/utils/entrypoints.py --- a/src/pip/_internal/utils/entrypoints.py
+++ b/src/pip/_internal/utils/entrypoints.py +++ b/src/pip/_internal/utils/entrypoints.py
@@ -7,7 +7,7 @@ if MYPY_CHECK_RUNNING: @@ -4,7 +4,7 @@ from typing import List, Optional
from typing import List, Optional from pip._internal.cli.main import main
-def _wrapper(args=None): -def _wrapper(args=None):
+def _wrapper(args=None, _nowarn=False): +def _wrapper(args=None, _nowarn=False):
# type: (Optional[List[str]]) -> int # type: (Optional[List[str]]) -> int
"""Central wrapper for all old entrypoints. """Central wrapper for all old entrypoints.
@@ -20,12 +20,13 @@ def _wrapper(args=None): @@ -17,12 +17,13 @@ def _wrapper(args=None):
directing them to an appropriate place for help, we now define all of directing them to an appropriate place for help, we now define all of
our old entrypoints as wrappers for the current one. our old entrypoints as wrappers for the current one.
""" """
@ -67,6 +69,6 @@ index e416315..7f57f67 100644
- assert "old script wrapper" in result2.stderr - assert "old script wrapper" in result2.stderr
+ if entrypoint[0] != "fake_pip = pip._internal:main": + if entrypoint[0] != "fake_pip = pip._internal:main":
+ assert "old script wrapper" in result2.stderr + assert "old script wrapper" in result2.stderr
-- --
2.24.1 2.30.2

View File

@ -1,12 +1,8 @@
# This is just temporary, when upstream merges PRs it can be removed # This is just temporary, when upstream merges PRs it can be removed
# https://github.com/pypa/pip/pull/7959
# https://github.com/ActiveState/appdirs/pull/144 # https://github.com/ActiveState/appdirs/pull/144
# https://github.com/psf/requests/pull/5410 # https://github.com/psf/requests/pull/5410
# https://github.com/chardet/chardet/pull/192
addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_internal/__init__.py\b')
addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_vendor/appdirs.py\b') addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_vendor/appdirs.py\b')
addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_vendor/requests/certs.py\b') addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_vendor/requests/certs.py\b')
addFilter(r'(non-executable-script|wrong-script-interpreter) .+/pip/_vendor/chardet/cli/chardetect.py\b')
# REQUESTED dist-info file is not meant to have any content # REQUESTED dist-info file is not meant to have any content
# Discussion: https://src.fedoraproject.org/rpms/python-pip/pull-request/69#comment-52525 # Discussion: https://src.fedoraproject.org/rpms/python-pip/pull-request/69#comment-52525

View File

@ -13,7 +13,7 @@
%endif %endif
%global srcname pip %global srcname pip
%global base_version 21.0.1 %global base_version 21.1.1
%global upstream_version %{base_version}%{?prerel} %global upstream_version %{base_version}%{?prerel}
%global python_wheelname %{srcname}-%{upstream_version}-py3-none-any.whl %global python_wheelname %{srcname}-%{upstream_version}-py3-none-any.whl
%global python_wheeldir %{_datadir}/python-wheels %global python_wheeldir %{_datadir}/python-wheels
@ -22,7 +22,7 @@
Name: python-%{srcname} Name: python-%{srcname}
Version: %{base_version}%{?prerel:~%{prerel}} Version: %{base_version}%{?prerel:~%{prerel}}
Release: 2%{?dist} Release: 1%{?dist}
Summary: A tool for installing and managing Python packages Summary: A tool for installing and managing Python packages
# We bundle a lot of libraries with pip, which itself is under MIT license. # We bundle a lot of libraries with pip, which itself is under MIT license.
@ -33,7 +33,6 @@ Summary: A tool for installing and managing Python packages
# chardet: LGPLv2 # chardet: LGPLv2
# colorama: BSD # colorama: BSD
# CacheControl: ASL 2.0 # CacheControl: ASL 2.0
# contextlib2: Python
# distlib: Python # distlib: Python
# distro: ASL 2.0 # distro: ASL 2.0
# html5lib: MIT # html5lib: MIT
@ -46,9 +45,9 @@ Summary: A tool for installing and managing Python packages
# pyparsing: MIT # pyparsing: MIT
# requests: ASL 2.0 # requests: ASL 2.0
# resolvelib: ISC # resolvelib: ISC
# retrying: ASL 2.0
# setuptools: MIT # setuptools: MIT
# six: MIT # six: MIT
# tenacity: ASL 2.0
# toml: MIT # toml: MIT
# urllib3: MIT # urllib3: MIT
# webencodings: BSD # webencodings: BSD
@ -68,12 +67,6 @@ BuildRequires: python-setuptools-wheel
BuildRequires: python-wheel-wheel BuildRequires: python-wheel-wheel
%endif %endif
# Downstream only patch
# Emit a warning to the user if pip install is run with root privileges
# Upstream discussion:
# https://discuss.python.org/t/playing-nice-with-external-package-managers/1968/20
Patch1: emit-a-warning-when-running-with-root-privileges.patch
# Prevent removing of the system packages installed under /usr/lib # Prevent removing of the system packages installed under /usr/lib
# when pip install -U is executed. # when pip install -U is executed.
# https://bugzilla.redhat.com/show_bug.cgi?id=1550368#c24 # https://bugzilla.redhat.com/show_bug.cgi?id=1550368#c24
@ -133,23 +126,22 @@ Provides: bundled(python%{1}dist(cachecontrol)) = 0.12.6
Provides: bundled(python%{1}dist(certifi)) = 2020.12.5 Provides: bundled(python%{1}dist(certifi)) = 2020.12.5
Provides: bundled(python%{1}dist(chardet)) = 4 Provides: bundled(python%{1}dist(chardet)) = 4
Provides: bundled(python%{1}dist(colorama)) = 0.4.4 Provides: bundled(python%{1}dist(colorama)) = 0.4.4
Provides: bundled(python%{1}dist(contextlib2)) = 0.6^post1
Provides: bundled(python%{1}dist(distlib)) = 0.3.1 Provides: bundled(python%{1}dist(distlib)) = 0.3.1
Provides: bundled(python%{1}dist(distro)) = 1.5 Provides: bundled(python%{1}dist(distro)) = 1.5
Provides: bundled(python%{1}dist(html5lib)) = 1.1 Provides: bundled(python%{1}dist(html5lib)) = 1.1
Provides: bundled(python%{1}dist(idna)) = 2.10 Provides: bundled(python%{1}dist(idna)) = 3.1
Provides: bundled(python%{1}dist(msgpack)) = 1.0.2 Provides: bundled(python%{1}dist(msgpack)) = 1.0.2
Provides: bundled(python%{1}dist(packaging)) = 20.9 Provides: bundled(python%{1}dist(packaging)) = 20.9
Provides: bundled(python%{1}dist(pep517)) = 0.9.1 Provides: bundled(python%{1}dist(pep517)) = 0.10
Provides: bundled(python%{1}dist(progress)) = 1.5 Provides: bundled(python%{1}dist(progress)) = 1.5
Provides: bundled(python%{1}dist(pyparsing)) = 2.4.7 Provides: bundled(python%{1}dist(pyparsing)) = 2.4.7
Provides: bundled(python%{1}dist(requests)) = 2.25.1 Provides: bundled(python%{1}dist(requests)) = 2.25.1
Provides: bundled(python%{1}dist(resolvelib)) = 0.5.4 Provides: bundled(python%{1}dist(resolvelib)) = 0.7
Provides: bundled(python%{1}dist(retrying)) = 1.3.3
Provides: bundled(python%{1}dist(setuptools)) = 44 Provides: bundled(python%{1}dist(setuptools)) = 44
Provides: bundled(python%{1}dist(six)) = 1.15 Provides: bundled(python%{1}dist(six)) = 1.15
Provides: bundled(python%{1}dist(tenacity)) = 7
Provides: bundled(python%{1}dist(toml)) = 0.10.2 Provides: bundled(python%{1}dist(toml)) = 0.10.2
Provides: bundled(python%{1}dist(urllib3)) = 1.26.2 Provides: bundled(python%{1}dist(urllib3)) = 1.26.4
Provides: bundled(python%{1}dist(webencodings)) = 0.5.1 Provides: bundled(python%{1}dist(webencodings)) = 0.5.1
} }
@ -225,6 +217,8 @@ Summary: A documentation for a tool for installing and managing Python pa
BuildRequires: python%{python3_pkgversion}-sphinx BuildRequires: python%{python3_pkgversion}-sphinx
BuildRequires: python%{python3_pkgversion}-sphinx-inline-tabs BuildRequires: python%{python3_pkgversion}-sphinx-inline-tabs
BuildRequires: python%{python3_pkgversion}-sphinx-copybutton
BuildRequires: python%{python3_pkgversion}-myst-parser
%description doc %description doc
A documentation for a tool for installing and managing Python packages A documentation for a tool for installing and managing Python packages
@ -254,7 +248,7 @@ rm src/pip/_vendor/certifi/*.pem
sed -i '/html_theme = "furo"/d' docs/html/conf.py sed -i '/html_theme = "furo"/d' docs/html/conf.py
# towncrier extension for Sphinx is not yet available in Fedora # towncrier extension for Sphinx is not yet available in Fedora
sed -i "/'sphinxcontrib.towncrier',/d" docs/html/conf.py sed -i '/"sphinxcontrib.towncrier",/d' docs/html/conf.py
# tests expect wheels in here # tests expect wheels in here
ln -s %{python_wheeldir} tests/data/common_wheels ln -s %{python_wheeldir} tests/data/common_wheels
@ -396,6 +390,9 @@ pytest_k='not completion and
%{python_wheeldir}/%{python_wheelname} %{python_wheeldir}/%{python_wheelname}
%changelog %changelog
* Mon May 10 2021 Karolina Surma <ksurma@redhat.com> - 21.1.1-1
- Update to 21.1.1
* Sat Mar 13 2021 Miro Hrončok <mhroncok@redhat.com> - 21.0.1-2 * Sat Mar 13 2021 Miro Hrončok <mhroncok@redhat.com> - 21.0.1-2
- python-pip-wheel: Remove bundled provides and libcrypt recommends for Python 2 - python-pip-wheel: Remove bundled provides and libcrypt recommends for Python 2
(The wheel is Python 3 only for a while) (The wheel is Python 3 only for a while)

View File

@ -1,6 +1,6 @@
From f83eacf40f1506418e74d747906b8f108401f91d Mon Sep 17 00:00:00 2001 From d8df1b9010bc69bfdb606cb51aa3a8a5c6ae6d4c Mon Sep 17 00:00:00 2001
From: Lumir Balhar <lbalhar@redhat.com> From: Karolina Surma <ksurma@redhat.com>
Date: Tue, 26 Jan 2021 09:05:07 +0100 Date: Mon, 10 May 2021 18:16:20 +0200
Subject: [PATCH] Prevent removing of the system packages installed under Subject: [PATCH] Prevent removing of the system packages installed under
/usr/lib /usr/lib
@ -11,6 +11,7 @@ Resolves: rhbz#1550368
Co-Authored-By: Michal Cyprian <m.cyprian@gmail.com> Co-Authored-By: Michal Cyprian <m.cyprian@gmail.com>
Co-Authored-By: Victor Stinner <vstinner@redhat.com> Co-Authored-By: Victor Stinner <vstinner@redhat.com>
Co-Authored-By: Petr Viktorin <pviktori@redhat.com> Co-Authored-By: Petr Viktorin <pviktori@redhat.com>
Co-Authored-By: Lumir Balhar <lbalhar@redhat.com>
--- ---
src/pip/_internal/req/req_install.py | 3 ++- src/pip/_internal/req/req_install.py | 3 ++-
src/pip/_internal/resolution/legacy/resolver.py | 5 ++++- src/pip/_internal/resolution/legacy/resolver.py | 5 ++++-
@ -19,10 +20,10 @@ Co-Authored-By: Petr Viktorin <pviktori@redhat.com>
4 files changed, 27 insertions(+), 2 deletions(-) 4 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py
index 6d0aa30..0a5f8ed 100644 index 55c17ac..9f6ba44 100644
--- a/src/pip/_internal/req/req_install.py --- a/src/pip/_internal/req/req_install.py
+++ b/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py
@@ -39,6 +39,7 @@ from pip._internal.utils.misc import ( @@ -43,6 +43,7 @@ from pip._internal.utils.misc import (
ask_path_exists, ask_path_exists,
backup_dir, backup_dir,
display_path, display_path,
@ -30,7 +31,7 @@ index 6d0aa30..0a5f8ed 100644
dist_in_site_packages, dist_in_site_packages,
dist_in_usersite, dist_in_usersite,
get_distribution, get_distribution,
@@ -445,7 +446,7 @@ class InstallRequirement: @@ -440,7 +441,7 @@ class InstallRequirement:
"lack sys.path precedence to {} in {}".format( "lack sys.path precedence to {} in {}".format(
existing_dist.project_name, existing_dist.location) existing_dist.project_name, existing_dist.location)
) )
@ -40,18 +41,18 @@ index 6d0aa30..0a5f8ed 100644
else: else:
if self.editable: if self.editable:
diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py
index 665dba1..a219e63 100644 index 17de7f0..3dd872d 100644
--- a/src/pip/_internal/resolution/legacy/resolver.py --- a/src/pip/_internal/resolution/legacy/resolver.py
+++ b/src/pip/_internal/resolution/legacy/resolver.py +++ b/src/pip/_internal/resolution/legacy/resolver.py
@@ -34,6 +34,7 @@ from pip._internal.resolution.base import BaseResolver @@ -42,6 +42,7 @@ from pip._internal.resolution.base import BaseResolver, InstallRequirementProvid
from pip._internal.utils.compatibility_tags import get_supported from pip._internal.utils.compatibility_tags import get_supported
from pip._internal.utils.logging import indent_log 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_usersite, normalize_version_info
+from pip._internal.utils.misc import dist_in_install_path +from pip._internal.utils.misc import dist_in_install_path
from pip._internal.utils.packaging import check_requires_python, get_requires_python from pip._internal.utils.packaging import check_requires_python, get_requires_python
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
logger = logging.getLogger(__name__)
@@ -204,7 +205,9 @@ class Resolver(BaseResolver): @@ -199,7 +200,9 @@ class Resolver(BaseResolver):
""" """
# Don't uninstall the conflict if doing a user install and the # Don't uninstall the conflict if doing a user install and the
# conflict is not a user install. # conflict is not a user install.
@ -61,36 +62,37 @@ index 665dba1..a219e63 100644
+ and dist_in_install_path(req.satisfied_by)): + and dist_in_install_path(req.satisfied_by)):
req.should_reinstall = True req.should_reinstall = True
req.satisfied_by = None req.satisfied_by = None
diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py
index be0729e..bc2912b 100644 index 6e3f195..bf07c1b 100644
--- a/src/pip/_internal/resolution/resolvelib/factory.py --- a/src/pip/_internal/resolution/resolvelib/factory.py
+++ b/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py
@@ -1,5 +1,6 @@ @@ -1,6 +1,7 @@
import contextlib
import functools import functools
import logging import logging
+import sys +import sys
from typing import (
from pip._vendor.packaging.utils import canonicalize_name TYPE_CHECKING,
Dict,
@@ -19,7 +20,9 @@ from pip._internal.utils.misc import ( @@ -46,7 +47,9 @@ from pip._internal.utils.misc import (
dist_in_site_packages, dist_in_site_packages,
dist_in_usersite, dist_in_usersite,
get_installed_distributions, get_installed_distributions,
+ dist_location, + dist_location,
) )
+from pip._internal.locations import distutils_scheme +from pip._internal.locations import get_scheme
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from pip._internal.utils.virtualenv import running_under_virtualenv from pip._internal.utils.virtualenv import running_under_virtualenv
@@ -362,6 +365,13 @@ class Factory: from .base import Candidate, CandidateVersion, Constraint, Requirement
@@ -479,6 +482,13 @@ class Factory:
if dist is None: # Not installed, no uninstallation required. if dist is None: # Not installed, no uninstallation required.
return None return None
+ # Prevent uninstalling packages from /usr + # Prevent uninstalling packages from /usr
+ if dist_location(dist) in ( + if dist_location(dist) in (
+ distutils_scheme('', prefix=sys.base_prefix)['purelib'], + get_scheme('', prefix=sys.base_prefix).purelib,
+ distutils_scheme('', prefix=sys.base_prefix)['platlib'], + get_scheme('', prefix=sys.base_prefix).platlib,
+ ): + ):
+ return None + return None
+ +
@ -98,21 +100,21 @@ index be0729e..bc2912b 100644
# be uninstalled, no matter it's in global or user site, because the # be uninstalled, no matter it's in global or user site, because the
# user site installation has precedence over global. # user site installation has precedence over global.
diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py
index 6dd94e2..7925518 100644 index 26037db..11b918d 100644
--- a/src/pip/_internal/utils/misc.py --- a/src/pip/_internal/utils/misc.py
+++ b/src/pip/_internal/utils/misc.py +++ b/src/pip/_internal/utils/misc.py
@@ -27,6 +27,7 @@ from pip._vendor.retrying import retry # type: ignore @@ -40,6 +40,7 @@ from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed
from pip import __version__ from pip import __version__
from pip._internal.exceptions import CommandError 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_major_minor_version, site_packages, user_site
+from pip._internal.locations import distutils_scheme, get_major_minor_version, site_packages, user_site +from pip._internal.locations import get_scheme
from pip._internal.utils.compat import WINDOWS, stdlib_pkgs from pip._internal.utils.compat import WINDOWS, stdlib_pkgs
from pip._internal.utils.typing import MYPY_CHECK_RUNNING, cast
from pip._internal.utils.virtualenv import ( from pip._internal.utils.virtualenv import (
@@ -398,6 +399,16 @@ def dist_in_site_packages(dist): running_under_virtualenv,
@@ -379,6 +380,16 @@ def dist_in_site_packages(dist):
return dist_location(dist).startswith(normalize_path(site_packages)) return dist_location(dist).startswith(normalize_path(site_packages))
+def dist_in_install_path(dist): +def dist_in_install_path(dist):
+ """ + """
+ Return True if given Distribution is installed in + Return True if given Distribution is installed in
@ -120,12 +122,12 @@ index 6dd94e2..7925518 100644
+ """ + """
+ norm_path = normalize_path(dist_location(dist)) + norm_path = normalize_path(dist_location(dist))
+ return norm_path.startswith(normalize_path( + return norm_path.startswith(normalize_path(
+ distutils_scheme("")['purelib'].split('python')[0])) + get_scheme("").purelib.split('python')[0]))
+ +
+ +
def dist_is_editable(dist): def dist_is_editable(dist):
# type: (Distribution) -> bool # type: (Distribution) -> bool
""" """
-- --
2.29.2 2.30.2

View File

@ -1 +1 @@
SHA512 (pip-21.0.1.tar.gz) = 2db5397f4ca3a3f56f5add3f827bf1f0a4296019703438d68498266b9d2559b6baa3132061c5ad4c2a08bec6e76a2768763fdca02d86cf32aadd4640afbf3664 SHA512 (pip-21.1.1.tar.gz) = 05157ed586597f16948afdad43d98cc095803d2d22b1427ac1028ca2a73a26d65e597446808194343ed36f9eb7cb910ac89e73a6a9a90ee868ec822fdbe641c5