Compare commits
36 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
728b4e49d0 | ||
|
21fe0a233c | ||
|
159feb818e | ||
|
e195c51818 | ||
|
8253bfab57 | ||
|
acf982e208 | ||
|
230ac9caa8 | ||
|
97bba91589 | ||
|
5ef43e57f4 | ||
|
0e2a444500 | ||
|
55406531cf | ||
|
e858da1425 | ||
|
9d1451298e | ||
|
46e383d546 | ||
|
db4c30e311 | ||
|
f6c63603fb | ||
|
903b01b22d | ||
|
542eb0faf8 | ||
|
4347c1397d | ||
|
7913cd9edf | ||
|
eb1cbbd764 | ||
|
abb97d98f6 | ||
|
f994ff1cc7 | ||
|
c9ae810483 | ||
|
184dcf3cac | ||
|
af087f8054 | ||
|
f6e9c0640b | ||
|
3bced42530 | ||
|
add791f1d5 | ||
|
a0ac853b8c | ||
|
9a8a1ef98e | ||
|
ef07805c26 | ||
|
1e1292bcb1 | ||
|
0f902d1fc0 | ||
|
07e4cb7088 | ||
|
30557cd2a5 |
45
.gitignore
vendored
45
.gitignore
vendored
@ -1,38 +1,7 @@
|
||||
pip-0.7.2.tar.gz
|
||||
/pip-0.8.tar.gz
|
||||
/pip-0.8.2.tar.gz
|
||||
/pip-0.8.3.tar.gz
|
||||
/pip-1.0.2.tar.gz
|
||||
/pip-1.1.tar.gz
|
||||
/pip-1.3.1.tar.gz
|
||||
/pip-1.4.1.tar.gz
|
||||
/pip-1.5.4.tar.gz
|
||||
/pip-1.5.6.tar.gz
|
||||
/pip-1.5.6-tests.tar.gz
|
||||
/pip-6.0.8.tar.gz
|
||||
/pip-7.0.3.tar.gz
|
||||
/pip-7.1.0.tar.gz
|
||||
/pip-7.1.0-tests.tar.gz
|
||||
/pip-8.0.2.tar.gz
|
||||
/pip-8.1.2.tar.gz
|
||||
/pip-8.1.2-tests.tar.gz
|
||||
/pip-9.0.1.tar.gz
|
||||
/pip-9.0.1-tests.tar.gz
|
||||
/pip-9.0.3.tar.gz
|
||||
/pip-9.0.3-tests.tar.gz
|
||||
/pip-10.0.1.tar.gz
|
||||
/pip-18.0.tar.gz
|
||||
/d2e63fbfc62af3b7050f619b2f5bb8658985b931.zip
|
||||
/2018.2.tar.gz
|
||||
/pip-18.0-tests.tar.gz
|
||||
/d2e63fbfc62af3b7050f619b2f5bb8658985b931.tar.gz
|
||||
/pip-18.1.tar.gz
|
||||
/pip-18.1-tests.tar.gz
|
||||
/pip-19.0.2.tar.gz
|
||||
/pip-19.0.2-tests.tar.gz
|
||||
/pip-19.0.3.tar.gz
|
||||
/pip-19.0.3-tests.tar.gz
|
||||
/pip-19.1.tar.gz
|
||||
/pip-19.1-tests.tar.gz
|
||||
/pip-19.1.1.tar.gz
|
||||
/pip-19.1.1-tests.tar.gz
|
||||
/*.tar.gz
|
||||
/*.zip
|
||||
/pip-*/
|
||||
/pip/
|
||||
/results_python-pip/
|
||||
*.rpm
|
||||
|
||||
|
168
7873.patch
168
7873.patch
@ -1,168 +0,0 @@
|
||||
From b64c5c433af2edc38f9b69c9e331653be16085a0 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Hrnciar <thrnciar@redhat.com>
|
||||
Date: Mon, 20 Apr 2020 14:14:05 +0200
|
||||
Subject: [PATCH 1/2] Backport of necessary changes from PR #6770, needed for
|
||||
backport of PR #7872
|
||||
|
||||
https://github.com/pypa/pip/pull/6770
|
||||
---
|
||||
src/pip/_internal/download.py | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/pip/_internal/download.py b/src/pip/_internal/download.py
|
||||
index 2683cf08..d5a94350 100644
|
||||
--- a/src/pip/_internal/download.py
|
||||
+++ b/src/pip/_internal/download.py
|
||||
@@ -773,9 +773,20 @@ def unpack_file_url(
|
||||
|
||||
# If it's a url to a local directory
|
||||
if is_dir_url(link):
|
||||
+
|
||||
+ def ignore(d, names):
|
||||
+ # Pulling in those directories can potentially be very slow,
|
||||
+ # exclude the following directories if they appear in the top
|
||||
+ # level dir (and only it).
|
||||
+ # See discussion at https://github.com/pypa/pip/pull/6770
|
||||
+ return ['.tox', '.nox'] if d == link_path else []
|
||||
if os.path.isdir(location):
|
||||
rmtree(location)
|
||||
- shutil.copytree(link_path, location, symlinks=True)
|
||||
+ shutil.copytree(link_path,
|
||||
+ location,
|
||||
+ symlinks=True,
|
||||
+ ignore=ignore)
|
||||
+
|
||||
if download_dir:
|
||||
logger.info('Link is a directory, ignoring download_dir')
|
||||
return
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
||||
From 3ce83f36f5f33a76ff6a0451cd7001dc00971ef2 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Hrnciar <thrnciar@redhat.com>
|
||||
Date: Mon, 20 Apr 2020 14:46:49 +0200
|
||||
Subject: [PATCH 2/2] Prevent infinite recursion with pip wheel with $TMPDIR in
|
||||
$PWD
|
||||
|
||||
During a build of extension module within `pip wheel` the source directory is
|
||||
recursively copied in a temporary directory.
|
||||
|
||||
See https://github.com/pypa/pip/issues/7555
|
||||
|
||||
When the temporary directory is inside the source directory
|
||||
(for example by setting `TMPDIR=$PWD/tmp`) this caused an infinite recursion
|
||||
that ended in:
|
||||
|
||||
[Errno 36] File name too long
|
||||
|
||||
We prevent that buy never copying the target to the target in _copy_source_tree.
|
||||
|
||||
Fixes https://github.com/pypa/pip/issues/7872
|
||||
|
||||
Avoid a test dependency on a C compiler, skip the test on Windows
|
||||
---
|
||||
news/7872.bugfix | 1 +
|
||||
src/pip/_internal/download.py | 23 ++++++++++++++++++-----
|
||||
tests/data/src/extension/extension.c | 0
|
||||
tests/data/src/extension/setup.py | 4 ++++
|
||||
tests/functional/test_wheel.py | 18 ++++++++++++++++++
|
||||
5 files changed, 41 insertions(+), 5 deletions(-)
|
||||
create mode 100644 news/7872.bugfix
|
||||
create mode 100644 tests/data/src/extension/extension.c
|
||||
create mode 100644 tests/data/src/extension/setup.py
|
||||
|
||||
diff --git a/news/7872.bugfix b/news/7872.bugfix
|
||||
new file mode 100644
|
||||
index 00000000..3550d573
|
||||
--- /dev/null
|
||||
+++ b/news/7872.bugfix
|
||||
@@ -0,0 +1 @@
|
||||
+Prevent an infinite recursion with ``pip wheel`` when ``$TMPDIR`` is within the source directory.
|
||||
diff --git a/src/pip/_internal/download.py b/src/pip/_internal/download.py
|
||||
index d5a94350..f589d42f 100644
|
||||
--- a/src/pip/_internal/download.py
|
||||
+++ b/src/pip/_internal/download.py
|
||||
@@ -773,13 +773,26 @@ def unpack_file_url(
|
||||
|
||||
# If it's a url to a local directory
|
||||
if is_dir_url(link):
|
||||
+ target_abspath = os.path.abspath(location)
|
||||
+ target_basename = os.path.basename(target_abspath)
|
||||
+ target_dirname = os.path.dirname(target_abspath)
|
||||
|
||||
def ignore(d, names):
|
||||
- # Pulling in those directories can potentially be very slow,
|
||||
- # exclude the following directories if they appear in the top
|
||||
- # level dir (and only it).
|
||||
- # See discussion at https://github.com/pypa/pip/pull/6770
|
||||
- return ['.tox', '.nox'] if d == link_path else []
|
||||
+ # type: (str, List[str]) -> List[str]
|
||||
+ skipped = [] # type: List[str]
|
||||
+ if d == link_path:
|
||||
+ # Pulling in those directories can potentially be very slow,
|
||||
+ # exclude the following directories if they appear in the top
|
||||
+ # level dir (and only it).
|
||||
+ # See discussion at https://github.com/pypa/pip/pull/6770
|
||||
+ skipped += ['.tox', '.nox']
|
||||
+ if os.path.abspath(d) == target_dirname:
|
||||
+ # Prevent an infinite recursion if the target is in source.
|
||||
+ # This can happen when TMPDIR is set to ${PWD}/...
|
||||
+ # and we copy PWD to TMPDIR.
|
||||
+ skipped += [target_basename]
|
||||
+ return skipped
|
||||
+
|
||||
if os.path.isdir(location):
|
||||
rmtree(location)
|
||||
shutil.copytree(link_path,
|
||||
diff --git a/tests/data/src/extension/extension.c b/tests/data/src/extension/extension.c
|
||||
new file mode 100644
|
||||
index 00000000..e69de29b
|
||||
diff --git a/tests/data/src/extension/setup.py b/tests/data/src/extension/setup.py
|
||||
new file mode 100644
|
||||
index 00000000..b26302b0
|
||||
--- /dev/null
|
||||
+++ b/tests/data/src/extension/setup.py
|
||||
@@ -0,0 +1,4 @@
|
||||
+from setuptools import Extension, setup
|
||||
+
|
||||
+module = Extension('extension', sources=['extension.c'])
|
||||
+setup(name='extension', version='0.0.1', ext_modules = [module])
|
||||
diff --git a/tests/functional/test_wheel.py b/tests/functional/test_wheel.py
|
||||
index f67720f1..6cb87a4c 100644
|
||||
--- a/tests/functional/test_wheel.py
|
||||
+++ b/tests/functional/test_wheel.py
|
||||
@@ -1,5 +1,6 @@
|
||||
"""'pip wheel' tests"""
|
||||
import os
|
||||
+import sys
|
||||
from os.path import exists
|
||||
|
||||
import pytest
|
||||
@@ -218,6 +219,23 @@ def test_pip_wheel_with_user_set_in_config(script, data, common_wheels):
|
||||
)
|
||||
assert "Successfully built withpyproject" in result.stdout, result.stdout
|
||||
|
||||
+@pytest.mark.skipif(sys.platform.startswith('win'),
|
||||
+ reason='The empty extension module does not work on Win')
|
||||
+def test_pip_wheel_ext_module_with_tmpdir_inside(script, data, common_wheels):
|
||||
+ tmpdir = data.src / 'extension/tmp'
|
||||
+ tmpdir.mkdir()
|
||||
+ script.environ['TMPDIR'] = str(tmpdir)
|
||||
+
|
||||
+ # To avoid a test dependency on a C compiler, we set the env vars to "noop"
|
||||
+ # The .c source is empty anyway
|
||||
+ script.environ['CC'] = script.environ['LDSHARED'] = str('true')
|
||||
+
|
||||
+ result = script.pip(
|
||||
+ 'wheel', data.src / 'extension',
|
||||
+ '--no-index', '-f', common_wheels
|
||||
+ )
|
||||
+ assert "Successfully built extension" in result.stdout, result.stdout
|
||||
+
|
||||
|
||||
@pytest.mark.network
|
||||
def test_pep517_wheels_are_not_confused_with_other_files(script, tmpdir, data):
|
||||
--
|
||||
2.23.0
|
||||
|
@ -1,110 +0,0 @@
|
||||
diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py
|
||||
index 1c244d23..4b07ec0f 100644
|
||||
--- a/src/pip/_internal/commands/install.py
|
||||
+++ b/src/pip/_internal/commands/install.py
|
||||
@@ -109,6 +109,14 @@ class InstallCommand(RequirementCommand):
|
||||
default=None,
|
||||
help="Installation prefix where lib, bin and other top-level "
|
||||
"folders are placed")
|
||||
+ cmd_opts.add_option(
|
||||
+ '--strip-file-prefix',
|
||||
+ dest='strip_file_prefix',
|
||||
+ metavar='prefix',
|
||||
+ default=None,
|
||||
+ help="Strip given prefix from script paths in wheel RECORD."
|
||||
+ )
|
||||
+
|
||||
|
||||
cmd_opts.add_option(cmdoptions.build_dir())
|
||||
|
||||
@@ -391,6 +399,7 @@ class InstallCommand(RequirementCommand):
|
||||
pycompile=options.compile,
|
||||
warn_script_location=warn_script_location,
|
||||
use_user_site=options.use_user_site,
|
||||
+ strip_file_prefix=options.strip_file_prefix,
|
||||
)
|
||||
|
||||
lib_locations = get_lib_location_guesses(
|
||||
diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py
|
||||
index a4834b00..d21530ac 100644
|
||||
--- a/src/pip/_internal/req/req_install.py
|
||||
+++ b/src/pip/_internal/req/req_install.py
|
||||
@@ -431,7 +431,8 @@ class InstallRequirement(object):
|
||||
prefix=None, # type: Optional[str]
|
||||
warn_script_location=True, # type: bool
|
||||
use_user_site=False, # type: bool
|
||||
- pycompile=True # type: bool
|
||||
+ pycompile=True, # type: bool
|
||||
+ strip_file_prefix=None # type: Optional[str]
|
||||
):
|
||||
# type: (...) -> None
|
||||
move_wheel_files(
|
||||
@@ -443,6 +444,7 @@ class InstallRequirement(object):
|
||||
pycompile=pycompile,
|
||||
isolated=self.isolated,
|
||||
warn_script_location=warn_script_location,
|
||||
+ strip_file_prefix=strip_file_prefix,
|
||||
)
|
||||
|
||||
# Things valid for sdists
|
||||
@@ -894,7 +896,8 @@ class InstallRequirement(object):
|
||||
prefix=None, # type: Optional[str]
|
||||
warn_script_location=True, # type: bool
|
||||
use_user_site=False, # type: bool
|
||||
- pycompile=True # type: bool
|
||||
+ pycompile=True, # type: bool
|
||||
+ strip_file_prefix=None # type: Optional[str]
|
||||
):
|
||||
# type: (...) -> None
|
||||
global_options = global_options if global_options is not None else []
|
||||
@@ -911,6 +914,7 @@ class InstallRequirement(object):
|
||||
self.source_dir, root=root, prefix=prefix, home=home,
|
||||
warn_script_location=warn_script_location,
|
||||
use_user_site=use_user_site, pycompile=pycompile,
|
||||
+ strip_file_prefix=strip_file_prefix,
|
||||
)
|
||||
self.install_succeeded = True
|
||||
return
|
||||
diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py
|
||||
index 67bcc7f7..6470576b 100644
|
||||
--- a/src/pip/_internal/wheel.py
|
||||
+++ b/src/pip/_internal/wheel.py
|
||||
@@ -265,6 +265,7 @@ def get_csv_rows_for_installed(
|
||||
changed, # type: set
|
||||
generated, # type: List[str]
|
||||
lib_dir, # type: str
|
||||
+ strip_file_prefix=None, # type: Optional[str]
|
||||
):
|
||||
# type: (...) -> List[InstalledCSVRow]
|
||||
"""
|
||||
@@ -289,7 +290,11 @@ def get_csv_rows_for_installed(
|
||||
installed_rows.append(tuple(row))
|
||||
for f in generated:
|
||||
digest, length = rehash(f)
|
||||
- installed_rows.append((normpath(f, lib_dir), digest, str(length)))
|
||||
+ final_path = normpath(f, lib_dir)
|
||||
+ if strip_file_prefix and final_path.startswith(strip_file_prefix):
|
||||
+ final_path = os.path.join(os.sep,
|
||||
+ os.path.relpath(final_path, strip_file_prefix))
|
||||
+ installed_rows.append((final_path, digest, str(length)))
|
||||
for f in installed:
|
||||
installed_rows.append((installed[f], '', ''))
|
||||
return installed_rows
|
||||
@@ -306,7 +311,8 @@ def move_wheel_files(
|
||||
scheme=None, # type: Optional[Mapping[str, str]]
|
||||
isolated=False, # type: bool
|
||||
prefix=None, # type: Optional[str]
|
||||
- warn_script_location=True # type: bool
|
||||
+ warn_script_location=True, # type: bool
|
||||
+ strip_file_prefix=None # type: Optional[str]
|
||||
):
|
||||
# type: (...) -> None
|
||||
"""Install a wheel"""
|
||||
@@ -605,6 +611,7 @@ if __name__ == '__main__':
|
||||
outrows = get_csv_rows_for_installed(
|
||||
reader, installed=installed, changed=changed,
|
||||
generated=generated, lib_dir=lib_dir,
|
||||
+ strip_file_prefix=strip_file_prefix
|
||||
)
|
||||
writer = csv.writer(record_out)
|
||||
# Sort to simplify testing.
|
75
b30dd1e04e.patch
Normal file
75
b30dd1e04e.patch
Normal file
@ -0,0 +1,75 @@
|
||||
From b30dd1e04e1f37901733f1be0a5a1e02c466ad0c Mon Sep 17 00:00:00 2001
|
||||
From: gutsytechster <prashantsharma161198@gmail.com>
|
||||
Date: Wed, 15 Apr 2020 19:54:48 +0530
|
||||
Subject: [PATCH] fix(tests/unit): Update tests to be endian safe
|
||||
|
||||
This updates `test_path_to_display` and `test_str_to_display__encoding`
|
||||
to use the endian safe expected result instead of the hardcoded one.
|
||||
|
||||
This fixes https://github.com/pypa/pip/issues/7921
|
||||
---
|
||||
tests/unit/test_compat.py | 8 +++++++-
|
||||
tests/unit/test_utils.py | 16 +++++++++++++---
|
||||
2 files changed, 20 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/tests/unit/test_compat.py b/tests/unit/test_compat.py
|
||||
index 1f31bc5ce8..b13087a1dd 100644
|
||||
--- a/tests/unit/test_compat.py
|
||||
+++ b/tests/unit/test_compat.py
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import locale
|
||||
import os
|
||||
+import sys
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -91,8 +92,13 @@ def test_str_to_display__decode_error(monkeypatch, caplog):
|
||||
# Encode with an incompatible encoding.
|
||||
data = u'ab'.encode('utf-16')
|
||||
actual = str_to_display(data)
|
||||
+ # Keep the expected value endian safe
|
||||
+ if sys.byteorder == "little":
|
||||
+ expected = "\\xff\\xfea\x00b\x00"
|
||||
+ elif sys.byteorder == "big":
|
||||
+ expected = "\\xfe\\xff\x00a\x00b"
|
||||
|
||||
- assert actual == u'\\xff\\xfea\x00b\x00', (
|
||||
+ assert actual == expected, (
|
||||
# Show the encoding for easier troubleshooting.
|
||||
'encoding: {!r}'.format(locale.getpreferredencoding())
|
||||
)
|
||||
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
|
||||
index 7d74a66498..ebabd29e26 100644
|
||||
--- a/tests/unit/test_utils.py
|
||||
+++ b/tests/unit/test_utils.py
|
||||
@@ -375,6 +375,18 @@ def test_rmtree_retries_for_3sec(tmpdir, monkeypatch):
|
||||
rmtree('foo')
|
||||
|
||||
|
||||
+if sys.byteorder == "little":
|
||||
+ expected_byte_string = (
|
||||
+ u"b'\\xff\\xfe/\\x00p\\x00a\\x00t\\x00h\\x00/"
|
||||
+ "\\x00d\\x00\\xe9\\x00f\\x00'"
|
||||
+ )
|
||||
+elif sys.byteorder == "big":
|
||||
+ expected_byte_string = (
|
||||
+ u"b'\\xfe\\xff\\x00/\\x00p\\x00a\\x00t\\x00h\\"
|
||||
+ "x00/\\x00d\\x00\\xe9\\x00f'"
|
||||
+ )
|
||||
+
|
||||
+
|
||||
@pytest.mark.parametrize('path, fs_encoding, expected', [
|
||||
(None, None, None),
|
||||
# Test passing a text (unicode) string.
|
||||
@@ -383,9 +395,7 @@ def test_rmtree_retries_for_3sec(tmpdir, monkeypatch):
|
||||
(u'/path/déf'.encode('utf-8'), 'utf-8', u'/path/déf'),
|
||||
# Test a bytes object with a character that can't be decoded.
|
||||
(u'/path/déf'.encode('utf-8'), 'ascii', u"b'/path/d\\xc3\\xa9f'"),
|
||||
- (u'/path/déf'.encode('utf-16'), 'utf-8',
|
||||
- u"b'\\xff\\xfe/\\x00p\\x00a\\x00t\\x00h\\x00/"
|
||||
- "\\x00d\\x00\\xe9\\x00f\\x00'"),
|
||||
+ (u'/path/déf'.encode('utf-16'), 'utf-8', expected_byte_string),
|
||||
])
|
||||
def test_path_to_display(monkeypatch, path, fs_encoding, expected):
|
||||
monkeypatch.setattr(sys, 'getfilesystemencoding', lambda: fs_encoding)
|
@ -1,12 +1,27 @@
|
||||
From 09bf87d33141a5c06a1d410839d162262baa16c4 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Hrnciar <thrnciar@redhat.com>
|
||||
Date: Sun, 26 Apr 2020 21:38:44 +0200
|
||||
Subject: [PATCH] Dummy certifi patch
|
||||
|
||||
---
|
||||
src/pip/_vendor/certifi/core.py | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/pip/_vendor/certifi/core.py b/src/pip/_vendor/certifi/core.py
|
||||
index 7271acf..9f0dc20 100644
|
||||
index 56b52a3c..e99043f0 100644
|
||||
--- a/src/pip/_vendor/certifi/core.py
|
||||
+++ b/src/pip/_vendor/certifi/core.py
|
||||
@@ -10,6 +10,4 @@ import os
|
||||
@@ -21,9 +21,7 @@ except ImportError:
|
||||
|
||||
|
||||
def where():
|
||||
- f = os.path.dirname(__file__)
|
||||
-
|
||||
- return os.path.join(f, 'cacert.pem')
|
||||
- return os.path.join(f, "cacert.pem")
|
||||
+ return '/etc/pki/tls/certs/ca-bundle.crt'
|
||||
|
||||
|
||||
def contents():
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
@ -1,19 +1,30 @@
|
||||
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 1279d4a..aeb9d26 100644
|
||||
index 70bda2e2..1e750ae1 100644
|
||||
--- a/src/pip/_internal/commands/install.py
|
||||
+++ b/src/pip/_internal/commands/install.py
|
||||
@@ -5,6 +5,8 @@ import logging
|
||||
import operator
|
||||
@@ -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
|
||||
@@ -217,6 +219,23 @@ class InstallCommand(RequirementCommand):
|
||||
@@ -241,6 +243,23 @@ class InstallCommand(RequirementCommand):
|
||||
raise CommandError("Can not combine '--user' and '--target'")
|
||||
|
||||
def run(self, options, args):
|
||||
cmdoptions.check_install_build_global(options)
|
||||
+
|
||||
+ def is_venv():
|
||||
@ -22,7 +33,7 @@ index 1279d4a..aeb9d26 100644
|
||||
+ 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():
|
||||
+ 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"
|
||||
@ -35,3 +46,6 @@ index 1279d4a..aeb9d26 100644
|
||||
upgrade_strategy = "to-satisfy-only"
|
||||
if options.upgrade:
|
||||
upgrade_strategy = options.upgrade_strategy
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
683
network-tests.patch
Normal file
683
network-tests.patch
Normal file
@ -0,0 +1,683 @@
|
||||
From 621800d5c65aea36c6a1d9b685ff88f35cfce476 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Orsava <torsava@redhat.com>
|
||||
Date: Fri, 15 Nov 2019 19:44:54 +0100
|
||||
Subject: [PATCH] Mark 6 tests as network tests
|
||||
|
||||
=================================== FAILURES ===================================
|
||||
_______________________________ test_freeze_path _______________________________
|
||||
tmpdir = Path('/tmp/pytest-of-mockbuild/pytest-0/test_freeze_path0')
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe950a4caf0>
|
||||
data = <tests.lib.TestData object at 0x7fe950a4cc10>
|
||||
def test_freeze_path(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with --path.
|
||||
"""
|
||||
> script.pip('install', '--find-links', data.find_links,
|
||||
'--target', tmpdir, 'simple==2.0')
|
||||
tests/functional/test_freeze.py:712:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/lib/__init__.py:593: in run
|
||||
_check_stderr(
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
stderr = "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'N...t at 0x7fe6435ef280>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/\n"
|
||||
allow_stderr_warning = False, allow_stderr_error = False
|
||||
def _check_stderr(
|
||||
stderr, allow_stderr_warning, allow_stderr_error,
|
||||
):
|
||||
"""
|
||||
Check the given stderr for logged warnings and errors.
|
||||
|
||||
:param stderr: stderr output as a string.
|
||||
:param allow_stderr_warning: whether a logged warning (or deprecation
|
||||
message) is allowed. Must be True if allow_stderr_error is True.
|
||||
:param allow_stderr_error: whether a logged error is allowed.
|
||||
"""
|
||||
assert not (allow_stderr_error and not allow_stderr_warning)
|
||||
|
||||
lines = stderr.splitlines()
|
||||
for line in lines:
|
||||
# First check for logging errors, which we don't allow during
|
||||
# tests even if allow_stderr_error=True (since a logging error
|
||||
# would signal a bug in pip's code).
|
||||
# Unlike errors logged with logger.error(), these errors are
|
||||
# sent directly to stderr and so bypass any configured log formatter.
|
||||
# The "--- Logging error ---" string is used in Python 3.4+, and
|
||||
# "Logged from file " is used in Python 2.
|
||||
if (line.startswith('--- Logging error ---') or
|
||||
line.startswith('Logged from file ')):
|
||||
reason = 'stderr has a logging error, which is never allowed'
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_error:
|
||||
continue
|
||||
|
||||
if line.startswith('ERROR: '):
|
||||
reason = (
|
||||
'stderr has an unexpected error '
|
||||
'(pass allow_stderr_error=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_warning:
|
||||
continue
|
||||
|
||||
if (line.startswith('WARNING: ') or
|
||||
line.startswith(DEPRECATION_MSG_PREFIX)):
|
||||
reason = (
|
||||
'stderr has an unexpected warning '
|
||||
'(pass allow_stderr_warning=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
> raise RuntimeError(msg)
|
||||
E RuntimeError: stderr has an unexpected warning (pass allow_stderr_warning=True to permit this):
|
||||
E Caused by line: "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe64364c850>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/"
|
||||
E Complete stderr: WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe64364c850>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe64364cdc0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe64364cf70>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe6435ef130>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fe6435ef280>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
tests/lib/__init__.py:404: RuntimeError
|
||||
________________________ test_freeze_path_exclude_user _________________________
|
||||
tmpdir = Path('/tmp/pytest-of-mockbuild/pytest-0/test_freeze_path_exclude_user0')
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe950ec8fa0>
|
||||
data = <tests.lib.TestData object at 0x7fe950ec8a30>
|
||||
def test_freeze_path_exclude_user(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with --path and make sure packages from --user are not picked
|
||||
up.
|
||||
"""
|
||||
script.pip_install_local('--find-links', data.find_links,
|
||||
'--user', 'simple2')
|
||||
> script.pip('install', '--find-links', data.find_links,
|
||||
'--target', tmpdir, 'simple==1.0')
|
||||
tests/functional/test_freeze.py:728:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/lib/__init__.py:593: in run
|
||||
_check_stderr(
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
stderr = "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'N...t at 0x7f87ae751310>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/\n"
|
||||
allow_stderr_warning = False, allow_stderr_error = False
|
||||
def _check_stderr(
|
||||
stderr, allow_stderr_warning, allow_stderr_error,
|
||||
):
|
||||
"""
|
||||
Check the given stderr for logged warnings and errors.
|
||||
|
||||
:param stderr: stderr output as a string.
|
||||
:param allow_stderr_warning: whether a logged warning (or deprecation
|
||||
message) is allowed. Must be True if allow_stderr_error is True.
|
||||
:param allow_stderr_error: whether a logged error is allowed.
|
||||
"""
|
||||
assert not (allow_stderr_error and not allow_stderr_warning)
|
||||
|
||||
lines = stderr.splitlines()
|
||||
for line in lines:
|
||||
# First check for logging errors, which we don't allow during
|
||||
# tests even if allow_stderr_error=True (since a logging error
|
||||
# would signal a bug in pip's code).
|
||||
# Unlike errors logged with logger.error(), these errors are
|
||||
# sent directly to stderr and so bypass any configured log formatter.
|
||||
# The "--- Logging error ---" string is used in Python 3.4+, and
|
||||
# "Logged from file " is used in Python 2.
|
||||
if (line.startswith('--- Logging error ---') or
|
||||
line.startswith('Logged from file ')):
|
||||
reason = 'stderr has a logging error, which is never allowed'
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_error:
|
||||
continue
|
||||
|
||||
if line.startswith('ERROR: '):
|
||||
reason = (
|
||||
'stderr has an unexpected error '
|
||||
'(pass allow_stderr_error=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_warning:
|
||||
continue
|
||||
|
||||
if (line.startswith('WARNING: ') or
|
||||
line.startswith(DEPRECATION_MSG_PREFIX)):
|
||||
reason = (
|
||||
'stderr has an unexpected warning '
|
||||
'(pass allow_stderr_warning=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
> raise RuntimeError(msg)
|
||||
E RuntimeError: stderr has an unexpected warning (pass allow_stderr_warning=True to permit this):
|
||||
E Caused by line: "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae7aa8e0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/"
|
||||
E Complete stderr: WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae7aa8e0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae7aae50>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae751040>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae7511c0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f87ae751310>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
tests/lib/__init__.py:404: RuntimeError
|
||||
__________________________ test_freeze_path_multiple ___________________________
|
||||
tmpdir = Path('/tmp/pytest-of-mockbuild/pytest-0/test_freeze_path_multiple0')
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe950b43fd0>
|
||||
data = <tests.lib.TestData object at 0x7fe950b43df0>
|
||||
def test_freeze_path_multiple(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with multiple --path arguments.
|
||||
"""
|
||||
path1 = tmpdir / "path1"
|
||||
os.mkdir(path1)
|
||||
path2 = tmpdir / "path2"
|
||||
os.mkdir(path2)
|
||||
> script.pip('install', '--find-links', data.find_links,
|
||||
'--target', path1, 'simple==2.0')
|
||||
tests/functional/test_freeze.py:750:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/lib/__init__.py:593: in run
|
||||
_check_stderr(
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
stderr = "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'N...t at 0x7f07e6253280>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/\n"
|
||||
allow_stderr_warning = False, allow_stderr_error = False
|
||||
def _check_stderr(
|
||||
stderr, allow_stderr_warning, allow_stderr_error,
|
||||
):
|
||||
"""
|
||||
Check the given stderr for logged warnings and errors.
|
||||
|
||||
:param stderr: stderr output as a string.
|
||||
:param allow_stderr_warning: whether a logged warning (or deprecation
|
||||
message) is allowed. Must be True if allow_stderr_error is True.
|
||||
:param allow_stderr_error: whether a logged error is allowed.
|
||||
"""
|
||||
assert not (allow_stderr_error and not allow_stderr_warning)
|
||||
|
||||
lines = stderr.splitlines()
|
||||
for line in lines:
|
||||
# First check for logging errors, which we don't allow during
|
||||
# tests even if allow_stderr_error=True (since a logging error
|
||||
# would signal a bug in pip's code).
|
||||
# Unlike errors logged with logger.error(), these errors are
|
||||
# sent directly to stderr and so bypass any configured log formatter.
|
||||
# The "--- Logging error ---" string is used in Python 3.4+, and
|
||||
# "Logged from file " is used in Python 2.
|
||||
if (line.startswith('--- Logging error ---') or
|
||||
line.startswith('Logged from file ')):
|
||||
reason = 'stderr has a logging error, which is never allowed'
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_error:
|
||||
continue
|
||||
|
||||
if line.startswith('ERROR: '):
|
||||
reason = (
|
||||
'stderr has an unexpected error '
|
||||
'(pass allow_stderr_error=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
raise RuntimeError(msg)
|
||||
if allow_stderr_warning:
|
||||
continue
|
||||
|
||||
if (line.startswith('WARNING: ') or
|
||||
line.startswith(DEPRECATION_MSG_PREFIX)):
|
||||
reason = (
|
||||
'stderr has an unexpected warning '
|
||||
'(pass allow_stderr_warning=True to permit this)'
|
||||
)
|
||||
msg = make_check_stderr_message(stderr, line=line, reason=reason)
|
||||
> raise RuntimeError(msg)
|
||||
E RuntimeError: stderr has an unexpected warning (pass allow_stderr_warning=True to permit this):
|
||||
E Caused by line: "WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e62ae850>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/"
|
||||
E Complete stderr: WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e62ae850>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e62aedc0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e62aef70>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e6253130>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
E WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f07e6253280>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/simple/
|
||||
tests/lib/__init__.py:404: RuntimeError
|
||||
_________________ test_install_no_binary_builds_pep_517_wheel __________________
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe9509f4e20>
|
||||
data = <tests.lib.TestData object at 0x7fe9509f4640>, with_wheel = None
|
||||
def test_install_no_binary_builds_pep_517_wheel(script, data, with_wheel):
|
||||
to_install = data.packages.joinpath('pep517_setup_and_pyproject')
|
||||
> res = script.pip(
|
||||
'install', '--no-binary=:all:', '-f', data.find_links, to_install
|
||||
)
|
||||
tests/functional/test_install.py:1279:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
self = <tests.lib.PipTestEnvironment object at 0x7fe9509f4e20>
|
||||
args = ('python', '-m', 'pip', 'install', '--no-binary=:all:', '-f', ...)
|
||||
kw = {'expect_stderr': True}
|
||||
cwd = Path('/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/scratch')
|
||||
run_from = None, allow_stderr_error = False, allow_stderr_warning = False
|
||||
expect_error = None
|
||||
def run(self, *args, **kw):
|
||||
"""
|
||||
:param allow_stderr_error: whether a logged error is allowed in
|
||||
stderr. Passing True for this argument implies
|
||||
`allow_stderr_warning` since warnings are weaker than errors.
|
||||
:param allow_stderr_warning: whether a logged warning (or
|
||||
deprecation message) is allowed in stderr.
|
||||
:param expect_error: if False (the default), asserts that the command
|
||||
exits with 0. Otherwise, asserts that the command exits with a
|
||||
non-zero exit code. Passing True also implies allow_stderr_error
|
||||
and allow_stderr_warning.
|
||||
:param expect_stderr: whether to allow warnings in stderr (equivalent
|
||||
to `allow_stderr_warning`). This argument is an abbreviated
|
||||
version of `allow_stderr_warning` and is also kept for backwards
|
||||
compatibility.
|
||||
"""
|
||||
if self.verbose:
|
||||
print('>> running %s %s' % (args, kw))
|
||||
|
||||
cwd = kw.pop('cwd', None)
|
||||
run_from = kw.pop('run_from', None)
|
||||
assert not cwd or not run_from, "Don't use run_from; it's going away"
|
||||
cwd = cwd or run_from or self.cwd
|
||||
if sys.platform == 'win32':
|
||||
# Partial fix for ScriptTest.run using `shell=True` on Windows.
|
||||
args = [str(a).replace('^', '^^').replace('&', '^&') for a in args]
|
||||
|
||||
# Remove `allow_stderr_error` and `allow_stderr_warning` before
|
||||
# calling run() because PipTestEnvironment doesn't support them.
|
||||
allow_stderr_error = kw.pop('allow_stderr_error', None)
|
||||
allow_stderr_warning = kw.pop('allow_stderr_warning', None)
|
||||
|
||||
# Propagate default values.
|
||||
expect_error = kw.get('expect_error')
|
||||
if expect_error:
|
||||
# Then default to allowing logged errors.
|
||||
if allow_stderr_error is not None and not allow_stderr_error:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_error=False with '
|
||||
'expect_error=True'
|
||||
)
|
||||
allow_stderr_error = True
|
||||
|
||||
elif kw.get('expect_stderr'):
|
||||
# Then default to allowing logged warnings.
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'expect_stderr=True'
|
||||
)
|
||||
allow_stderr_warning = True
|
||||
|
||||
if allow_stderr_error:
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'allow_stderr_error=True'
|
||||
)
|
||||
|
||||
# Default values if not set.
|
||||
if allow_stderr_error is None:
|
||||
allow_stderr_error = False
|
||||
if allow_stderr_warning is None:
|
||||
allow_stderr_warning = allow_stderr_error
|
||||
|
||||
# Pass expect_stderr=True to allow any stderr. We do this because
|
||||
# we do our checking of stderr further on in check_stderr().
|
||||
kw['expect_stderr'] = True
|
||||
> result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw)
|
||||
E AssertionError: Script returned code: 1
|
||||
tests/lib/__init__.py:586: AssertionError
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
Script result: python -m pip install --no-binary=:all: -f file:///tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages/pep517_setup_and_pyproject
|
||||
return code: 1
|
||||
-- stderr: --------------------
|
||||
ERROR: Command errored out with exit status 1:
|
||||
command: /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/venv/bin/python /builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-build-env-ntp1m4dh/overlay --no-warn-script-location --no-binary :all: --only-binary :none: -i https://pypi.org/simple --find-links file:///tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages -- setuptools
|
||||
cwd: None
|
||||
Complete output (28 lines):
|
||||
Looking in links: file:///tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages
|
||||
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f7234ef1e50>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/setuptools/
|
||||
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f7234e92040>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/setuptools/
|
||||
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f7234e921c0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/setuptools/
|
||||
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f7234e92340>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/setuptools/
|
||||
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f7234e924c0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/setuptools/
|
||||
Processing /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages/setuptools-0.9.6.tar.gz
|
||||
ERROR: Command errored out with exit status 1:
|
||||
command: /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/venv/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setup.py'"'"'; __file__='"'"'/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/pip-egg-info
|
||||
cwd: /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/
|
||||
Complete output (15 lines):
|
||||
Traceback (most recent call last):
|
||||
File "<string>", line 1, in <module>
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setuptools/__init__.py", line 2, in <module>
|
||||
from setuptools.extension import Extension, Library
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setuptools/extension.py", line 5, in <module>
|
||||
from setuptools.dist import _get_unpatched
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setuptools/dist.py", line 7, in <module>
|
||||
from setuptools.command.install import install
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setuptools/command/__init__.py", line 8, in <module>
|
||||
from setuptools.command import install_scripts
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/setuptools/command/install_scripts.py", line 3, in <module>
|
||||
from pkg_resources import Distribution, PathMetadata, ensure_directory
|
||||
File "/tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-install-b_6lf4z6/setuptools/pkg_resources.py", line 1545, in <module>
|
||||
register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
|
||||
AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader'
|
||||
----------------------------------------
|
||||
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
|
||||
----------------------------------------
|
||||
ERROR: Command errored out with exit status 1: /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/venv/bin/python /builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip install --ignore-installed --no-user --prefix /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/workspace/tmp/pip-build-env-ntp1m4dh/overlay --no-warn-script-location --no-binary :all: --only-binary :none: -i https://pypi.org/simple --find-links file:///tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages -- setuptools Check the logs for full command output.
|
||||
-- stdout: --------------------
|
||||
Looking in links: file:///tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages
|
||||
Processing /tmp/pytest-of-mockbuild/pytest-0/test_install_no_binary_builds_0/data/packages/pep517_setup_and_pyproject
|
||||
Installing build dependencies: started
|
||||
Installing build dependencies: finished with status 'error'
|
||||
_______________________ test_config_file_override_stack ________________________
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe950d9b7f0>
|
||||
virtualenv = <VirtualEnvironment /tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/venv>
|
||||
def test_config_file_override_stack(script, virtualenv):
|
||||
"""
|
||||
Test config files (global, overriding a global config with a
|
||||
local, overriding all with a command line flag).
|
||||
|
||||
"""
|
||||
fd, config_file = tempfile.mkstemp('-pip.cfg', 'test-')
|
||||
try:
|
||||
> _test_config_file_override_stack(script, virtualenv, config_file)
|
||||
tests/functional/test_install_config.py:144:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
tests/functional/test_install_config.py:172: in _test_config_file_override_stack
|
||||
result = script.pip(
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
self = <tests.lib.PipTestEnvironment object at 0x7fe950d9b7f0>
|
||||
args = ('python', '-m', 'pip', 'install', '-vvv', '--index-url', ...)
|
||||
kw = {'expect_stderr': True}
|
||||
cwd = Path('/tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/scratch')
|
||||
run_from = None, allow_stderr_error = False, allow_stderr_warning = False
|
||||
expect_error = None
|
||||
def run(self, *args, **kw):
|
||||
"""
|
||||
:param allow_stderr_error: whether a logged error is allowed in
|
||||
stderr. Passing True for this argument implies
|
||||
`allow_stderr_warning` since warnings are weaker than errors.
|
||||
:param allow_stderr_warning: whether a logged warning (or
|
||||
deprecation message) is allowed in stderr.
|
||||
:param expect_error: if False (the default), asserts that the command
|
||||
exits with 0. Otherwise, asserts that the command exits with a
|
||||
non-zero exit code. Passing True also implies allow_stderr_error
|
||||
and allow_stderr_warning.
|
||||
:param expect_stderr: whether to allow warnings in stderr (equivalent
|
||||
to `allow_stderr_warning`). This argument is an abbreviated
|
||||
version of `allow_stderr_warning` and is also kept for backwards
|
||||
compatibility.
|
||||
"""
|
||||
if self.verbose:
|
||||
print('>> running %s %s' % (args, kw))
|
||||
|
||||
cwd = kw.pop('cwd', None)
|
||||
run_from = kw.pop('run_from', None)
|
||||
assert not cwd or not run_from, "Don't use run_from; it's going away"
|
||||
cwd = cwd or run_from or self.cwd
|
||||
if sys.platform == 'win32':
|
||||
# Partial fix for ScriptTest.run using `shell=True` on Windows.
|
||||
args = [str(a).replace('^', '^^').replace('&', '^&') for a in args]
|
||||
|
||||
# Remove `allow_stderr_error` and `allow_stderr_warning` before
|
||||
# calling run() because PipTestEnvironment doesn't support them.
|
||||
allow_stderr_error = kw.pop('allow_stderr_error', None)
|
||||
allow_stderr_warning = kw.pop('allow_stderr_warning', None)
|
||||
|
||||
# Propagate default values.
|
||||
expect_error = kw.get('expect_error')
|
||||
if expect_error:
|
||||
# Then default to allowing logged errors.
|
||||
if allow_stderr_error is not None and not allow_stderr_error:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_error=False with '
|
||||
'expect_error=True'
|
||||
)
|
||||
allow_stderr_error = True
|
||||
|
||||
elif kw.get('expect_stderr'):
|
||||
# Then default to allowing logged warnings.
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'expect_stderr=True'
|
||||
)
|
||||
allow_stderr_warning = True
|
||||
|
||||
if allow_stderr_error:
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'allow_stderr_error=True'
|
||||
)
|
||||
|
||||
# Default values if not set.
|
||||
if allow_stderr_error is None:
|
||||
allow_stderr_error = False
|
||||
if allow_stderr_warning is None:
|
||||
allow_stderr_warning = allow_stderr_error
|
||||
|
||||
# Pass expect_stderr=True to allow any stderr. We do this because
|
||||
# we do our checking of stderr further on in check_stderr().
|
||||
kw['expect_stderr'] = True
|
||||
> result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw)
|
||||
E AssertionError: Script returned code: 1
|
||||
tests/lib/__init__.py:586: AssertionError
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
Script result: python -m pip install -vvv --index-url https://pypi.org/simple/ INITools
|
||||
return code: 1
|
||||
-- stderr: --------------------
|
||||
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9669c3d8b0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9669c3da60>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9669c3dbe0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9669c3dd60>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f966900f490>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
ERROR: Could not find a version that satisfies the requirement INITools (from versions: none)
|
||||
ERROR: No matching distribution found for INITools
|
||||
-- stdout: --------------------
|
||||
Created temporary directory: /tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/tmp/pip-ephem-wheel-cache-6gj33ens
|
||||
Created temporary directory: /tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/tmp/pip-req-tracker-s7_2cwgc
|
||||
Created requirements tracker '/tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/tmp/pip-req-tracker-s7_2cwgc'
|
||||
Created temporary directory: /tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/tmp/pip-install-_91mh3df
|
||||
Looking in indexes: https://pypi.org/simple/
|
||||
1 location(s) to search for versions of INITools:
|
||||
* https://pypi.org/simple/initools/
|
||||
Getting page https://pypi.org/simple/initools/
|
||||
Found index url https://pypi.org/simple/
|
||||
Looking up "https://pypi.org/simple/initools/" in the cache
|
||||
Request header has "max_age" as 0, cache bypassed
|
||||
Starting new HTTPS connection (1): pypi.org:443
|
||||
Incremented Retry for (url='/simple/initools/'): Retry(total=4, connect=None, read=None, redirect=None, status=None)
|
||||
Starting new HTTPS connection (2): pypi.org:443
|
||||
Incremented Retry for (url='/simple/initools/'): Retry(total=3, connect=None, read=None, redirect=None, status=None)
|
||||
Starting new HTTPS connection (3): pypi.org:443
|
||||
Incremented Retry for (url='/simple/initools/'): Retry(total=2, connect=None, read=None, redirect=None, status=None)
|
||||
Starting new HTTPS connection (4): pypi.org:443
|
||||
Incremented Retry for (url='/simple/initools/'): Retry(total=1, connect=None, read=None, redirect=None, status=None)
|
||||
Starting new HTTPS connection (5): pypi.org:443
|
||||
Incremented Retry for (url='/simple/initools/'): Retry(total=0, connect=None, read=None, redirect=None, status=None)
|
||||
Starting new HTTPS connection (6): pypi.org:443
|
||||
Could not fetch URL https://pypi.org/simple/initools/: connection error: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/initools/ (Caused by NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f9669c15b50>: Failed to establish a new connection: [Errno -2] Name or service not known')) - skipping
|
||||
Given no hashes to check 0 links for project 'INITools': discarding no candidates
|
||||
Cleaning up...
|
||||
Removed build tracker '/tmp/pytest-of-mockbuild/pytest-0/test_config_file_override_stac0/workspace/tmp/pip-req-tracker-s7_2cwgc'
|
||||
Exception information:
|
||||
Traceback (most recent call last):
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 153, in _main
|
||||
status = self.run(options, args)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 401, in run
|
||||
resolver.resolve(requirement_set)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 202, in resolve
|
||||
self._resolve_one(requirement_set, req)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 368, in _resolve_one
|
||||
abstract_dist = self._get_abstract_dist_for(req_to_install)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py", line 314, in _get_abstract_dist_for
|
||||
req.populate_link(self.finder, upgrade_allowed, self.require_hashes)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/req/req_install.py", line 226, in populate_link
|
||||
self.link = finder.find_requirement(self, upgrade)
|
||||
File "/builddir/build/BUILDROOT/python-pip-19.3.1-1.fc32.noarch/usr/lib/python3.8/site-packages/pip/_internal/index.py", line 905, in find_requirement
|
||||
raise DistributionNotFound(
|
||||
pip._internal.exceptions.DistributionNotFound: No matching distribution found for INITools
|
||||
_______________________ test_no_upgrade_unless_requested _______________________
|
||||
script = <tests.lib.PipTestEnvironment object at 0x7fe950d86070>
|
||||
def test_no_upgrade_unless_requested(script):
|
||||
"""
|
||||
No upgrade if not specifically requested.
|
||||
|
||||
"""
|
||||
> script.pip('install', 'INITools==0.1')
|
||||
tests/functional/test_install_upgrade.py:16:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
self = <tests.lib.PipTestEnvironment object at 0x7fe950d86070>
|
||||
args = ('python', '-m', 'pip', 'install', 'INITools==0.1')
|
||||
kw = {'expect_stderr': True}
|
||||
cwd = Path('/tmp/pytest-of-mockbuild/pytest-0/test_no_upgrade_unless_request0/workspace/scratch')
|
||||
run_from = None, allow_stderr_error = False, allow_stderr_warning = False
|
||||
expect_error = None
|
||||
def run(self, *args, **kw):
|
||||
"""
|
||||
:param allow_stderr_error: whether a logged error is allowed in
|
||||
stderr. Passing True for this argument implies
|
||||
`allow_stderr_warning` since warnings are weaker than errors.
|
||||
:param allow_stderr_warning: whether a logged warning (or
|
||||
deprecation message) is allowed in stderr.
|
||||
:param expect_error: if False (the default), asserts that the command
|
||||
exits with 0. Otherwise, asserts that the command exits with a
|
||||
non-zero exit code. Passing True also implies allow_stderr_error
|
||||
and allow_stderr_warning.
|
||||
:param expect_stderr: whether to allow warnings in stderr (equivalent
|
||||
to `allow_stderr_warning`). This argument is an abbreviated
|
||||
version of `allow_stderr_warning` and is also kept for backwards
|
||||
compatibility.
|
||||
"""
|
||||
if self.verbose:
|
||||
print('>> running %s %s' % (args, kw))
|
||||
|
||||
cwd = kw.pop('cwd', None)
|
||||
run_from = kw.pop('run_from', None)
|
||||
assert not cwd or not run_from, "Don't use run_from; it's going away"
|
||||
cwd = cwd or run_from or self.cwd
|
||||
if sys.platform == 'win32':
|
||||
# Partial fix for ScriptTest.run using `shell=True` on Windows.
|
||||
args = [str(a).replace('^', '^^').replace('&', '^&') for a in args]
|
||||
|
||||
# Remove `allow_stderr_error` and `allow_stderr_warning` before
|
||||
# calling run() because PipTestEnvironment doesn't support them.
|
||||
allow_stderr_error = kw.pop('allow_stderr_error', None)
|
||||
allow_stderr_warning = kw.pop('allow_stderr_warning', None)
|
||||
|
||||
# Propagate default values.
|
||||
expect_error = kw.get('expect_error')
|
||||
if expect_error:
|
||||
# Then default to allowing logged errors.
|
||||
if allow_stderr_error is not None and not allow_stderr_error:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_error=False with '
|
||||
'expect_error=True'
|
||||
)
|
||||
allow_stderr_error = True
|
||||
|
||||
elif kw.get('expect_stderr'):
|
||||
# Then default to allowing logged warnings.
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'expect_stderr=True'
|
||||
)
|
||||
allow_stderr_warning = True
|
||||
|
||||
if allow_stderr_error:
|
||||
if allow_stderr_warning is not None and not allow_stderr_warning:
|
||||
raise RuntimeError(
|
||||
'cannot pass allow_stderr_warning=False with '
|
||||
'allow_stderr_error=True'
|
||||
)
|
||||
|
||||
# Default values if not set.
|
||||
if allow_stderr_error is None:
|
||||
allow_stderr_error = False
|
||||
if allow_stderr_warning is None:
|
||||
allow_stderr_warning = allow_stderr_error
|
||||
|
||||
# Pass expect_stderr=True to allow any stderr. We do this because
|
||||
# we do our checking of stderr further on in check_stderr().
|
||||
kw['expect_stderr'] = True
|
||||
> result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw)
|
||||
E AssertionError: Script returned code: 1
|
||||
tests/lib/__init__.py:586: AssertionError
|
||||
----------------------------- Captured stdout call -----------------------------
|
||||
Script result: python -m pip install INITools==0.1
|
||||
return code: 1
|
||||
-- stderr: --------------------
|
||||
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fd66cc36700>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fd66cc36c40>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fd66cc36dc0>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fd66cc36f40>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7fd66be48100>: Failed to establish a new connection: [Errno -2] Name or service not known')': /simple/initools/
|
||||
ERROR: Could not find a version that satisfies the requirement INITools==0.1 (from versions: none)
|
||||
ERROR: No matching distribution found for INITools==0.1
|
||||
---
|
||||
tests/functional/test_freeze.py | 3 +++
|
||||
tests/functional/test_install.py | 1 +
|
||||
tests/functional/test_install_config.py | 1 +
|
||||
tests/functional/test_install_upgrade.py | 1 +
|
||||
4 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py
|
||||
index 546a482..aabb0ca 100644
|
||||
--- a/tests/functional/test_freeze.py
|
||||
+++ b/tests/functional/test_freeze.py
|
||||
@@ -705,6 +705,7 @@ def test_freeze_user(script, virtualenv, data):
|
||||
assert 'simple2' not in result.stdout
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_freeze_path(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with --path.
|
||||
@@ -718,6 +719,7 @@ def test_freeze_path(tmpdir, script, data):
|
||||
_check_output(result.stdout, expected)
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_freeze_path_exclude_user(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with --path and make sure packages from --user are not picked
|
||||
@@ -739,6 +741,7 @@ def test_freeze_path_exclude_user(tmpdir, script, data):
|
||||
_check_output(result.stdout, expected)
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_freeze_path_multiple(tmpdir, script, data):
|
||||
"""
|
||||
Test freeze with multiple --path arguments.
|
||||
diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py
|
||||
index 0bea054..b816df6 100644
|
||||
--- a/tests/functional/test_install.py
|
||||
+++ b/tests/functional/test_install.py
|
||||
@@ -1274,6 +1274,7 @@ def test_install_no_binary_disables_building_wheels(script, data, with_wheel):
|
||||
assert "Running setup.py install for upper" in str(res), str(res)
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_install_no_binary_builds_pep_517_wheel(script, data, with_wheel):
|
||||
to_install = data.packages.joinpath('pep517_setup_and_pyproject')
|
||||
res = script.pip(
|
||||
diff --git a/tests/functional/test_install_config.py b/tests/functional/test_install_config.py
|
||||
index bcf83f1..c9c60a2 100644
|
||||
--- a/tests/functional/test_install_config.py
|
||||
+++ b/tests/functional/test_install_config.py
|
||||
@@ -133,6 +133,7 @@ def test_command_line_appends_correctly(script, data):
|
||||
), 'stdout: {}'.format(result.stdout)
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_config_file_override_stack(script, virtualenv):
|
||||
"""
|
||||
Test config files (global, overriding a global config with a
|
||||
diff --git a/tests/functional/test_install_upgrade.py b/tests/functional/test_install_upgrade.py
|
||||
index 36b518b..c34a961 100644
|
||||
--- a/tests/functional/test_install_upgrade.py
|
||||
+++ b/tests/functional/test_install_upgrade.py
|
||||
@@ -8,6 +8,7 @@ from tests.lib import assert_all_changes, pyversion
|
||||
from tests.lib.local_repos import local_checkout
|
||||
|
||||
|
||||
+@pytest.mark.network
|
||||
def test_no_upgrade_unless_requested(script):
|
||||
"""
|
||||
No upgrade if not specifically requested.
|
||||
--
|
||||
2.20.1
|
||||
|
72
nowarn-pip._internal.main.patch
Normal file
72
nowarn-pip._internal.main.patch
Normal file
@ -0,0 +1,72 @@
|
||||
From 7c36cb21910b415e0eb171d0f6c4dbf72382fdaf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||
Date: Tue, 10 Mar 2020 11:03:22 +0100
|
||||
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,
|
||||
this warning is juts moot. Also, the warning breaks CPython test suite.
|
||||
---
|
||||
src/pip/_internal/__init__.py | 2 +-
|
||||
src/pip/_internal/utils/entrypoints.py | 19 ++++++++++---------
|
||||
tests/functional/test_cli.py | 3 ++-
|
||||
3 files changed, 13 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/src/pip/_internal/__init__.py b/src/pip/_internal/__init__.py
|
||||
index 3aa8a46..0ec017b 100755
|
||||
--- a/src/pip/_internal/__init__.py
|
||||
+++ b/src/pip/_internal/__init__.py
|
||||
@@ -15,4 +15,4 @@ def main(args=None):
|
||||
"""
|
||||
from pip._internal.utils.entrypoints import _wrapper
|
||||
|
||||
- return _wrapper(args)
|
||||
+ return _wrapper(args, _nowarn=True)
|
||||
diff --git a/src/pip/_internal/utils/entrypoints.py b/src/pip/_internal/utils/entrypoints.py
|
||||
index befd01c..d6f3632 100644
|
||||
--- a/src/pip/_internal/utils/entrypoints.py
|
||||
+++ b/src/pip/_internal/utils/entrypoints.py
|
||||
@@ -7,7 +7,7 @@ if MYPY_CHECK_RUNNING:
|
||||
from typing import Optional, List
|
||||
|
||||
|
||||
-def _wrapper(args=None):
|
||||
+def _wrapper(args=None, _nowarn=False):
|
||||
# type: (Optional[List[str]]) -> int
|
||||
"""Central wrapper for all old entrypoints.
|
||||
|
||||
@@ -20,12 +20,13 @@ def _wrapper(args=None):
|
||||
directing them to an appropriate place for help, we now define all of
|
||||
our old entrypoints as wrappers for the current one.
|
||||
"""
|
||||
- sys.stderr.write(
|
||||
- "WARNING: pip is being invoked by an old script wrapper. This will "
|
||||
- "fail in a future version of pip.\n"
|
||||
- "Please see https://github.com/pypa/pip/issues/5599 for advice on "
|
||||
- "fixing the underlying issue.\n"
|
||||
- "To avoid this problem you can invoke Python with '-m pip' instead of "
|
||||
- "running pip directly.\n"
|
||||
- )
|
||||
+ if not _nowarn:
|
||||
+ sys.stderr.write(
|
||||
+ "WARNING: pip is being invoked by an old script wrapper. This will "
|
||||
+ "fail in a future version of pip.\n"
|
||||
+ "Please see https://github.com/pypa/pip/issues/5599 for advice on "
|
||||
+ "fixing the underlying issue.\n"
|
||||
+ "To avoid this problem you can invoke Python with '-m pip' instead of "
|
||||
+ "running pip directly.\n"
|
||||
+ )
|
||||
return main(args)
|
||||
diff --git a/tests/functional/test_cli.py b/tests/functional/test_cli.py
|
||||
index e416315..7f57f67 100644
|
||||
--- a/tests/functional/test_cli.py
|
||||
+++ b/tests/functional/test_cli.py
|
||||
@@ -31,4 +31,5 @@ def test_entrypoints_work(entrypoint, script):
|
||||
result = script.pip("-V")
|
||||
result2 = script.run("fake_pip", "-V", allow_stderr_warning=True)
|
||||
assert result.stdout == result2.stdout
|
||||
- assert "old script wrapper" in result2.stderr
|
||||
+ if entrypoint[0] != "fake_pip = pip._internal:main":
|
||||
+ assert "old script wrapper" in result2.stderr
|
||||
--
|
||||
2.24.1
|
||||
|
@ -1,20 +1,27 @@
|
||||
--- /usr/bin/pip3 2018-03-29 15:22:13.000000000 +0200
|
||||
+++ pip3 2018-05-04 11:49:08.098821010 +0200
|
||||
@@ -4,7 +4,16 @@
|
||||
--- /usr/bin/pip3 2019-11-12 17:37:34.793131862 +0100
|
||||
+++ pip3 2019-11-12 17:40:42.014107134 +0100
|
||||
@@ -2,7 +2,23 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import sys
|
||||
|
||||
-from pip._internal import main
|
||||
-from pip._internal.cli.main import main
|
||||
+
|
||||
+try:
|
||||
+ from pip._internal import main
|
||||
+ from pip._internal.cli.main import main
|
||||
+except ImportError:
|
||||
+ # user has most probably downgraded pip in their home
|
||||
+ # so let them run it anyway until ~/.local/bin makes it in front of the PATH
|
||||
+ from pip import main
|
||||
+else:
|
||||
+ # user might also upgraded pip...
|
||||
+ if hasattr(main, 'main'):
|
||||
+ main = main.main
|
||||
|
||||
+ try:
|
||||
+ from pip._internal.main import main
|
||||
+ except ImportError:
|
||||
+ try:
|
||||
+ # If the user has downgraded pip, the above import will fail.
|
||||
+ # Let's try older methods of invoking it:
|
||||
+
|
||||
+ # pip 19 uses this
|
||||
+ from pip._internal import main
|
||||
+ except ImportError:
|
||||
+ # older pip versions use this
|
||||
+ from pip import main
|
||||
+
|
||||
if __name__ == '__main__':
|
||||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
||||
sys.exit(main())
|
||||
|
432
python-pip.spec
432
python-pip.spec
@ -1,62 +1,56 @@
|
||||
%bcond_with bootstrap
|
||||
%bcond_without tests
|
||||
|
||||
%bcond_without python2
|
||||
%bcond_without doc
|
||||
|
||||
%global srcname pip
|
||||
%global python_wheelname %{srcname}-%{version}-py2.py3-none-any.whl
|
||||
%global base_version 20.1.1
|
||||
%global upstream_version %{base_version}%{?prerel}
|
||||
%global python_wheelname %{srcname}-%{upstream_version}-py2.py3-none-any.whl
|
||||
%global python_wheeldir %{_datadir}/python-wheels
|
||||
|
||||
%if %{with doc}
|
||||
%global pypa_theme_commit_hash d2e63fbfc62af3b7050f619b2f5bb8658985b931
|
||||
%endif
|
||||
|
||||
# Note that with disabled python3, bashcomp2 will be disabled as well because
|
||||
# bashcompdir will point to a different path than with python3 enabled.
|
||||
%global bashcompdir %(b=$(pkg-config --variable=completionsdir bash-completion 2>/dev/null); echo ${b:-%{_sysconfdir}/bash_completion.d})
|
||||
%if "%{bashcompdir}" != "%{_sysconfdir}/bash_completion.d"
|
||||
%global bashcomp2 1
|
||||
%endif
|
||||
%global bashcompdir %(pkg-config --variable=completionsdir bash-completion 2>/dev/null)
|
||||
|
||||
Name: python-%{srcname}
|
||||
# When updating, update the bundled libraries versions bellow!
|
||||
# You can use vendor_meta.sh in the dist git repo
|
||||
Version: 19.1.1
|
||||
Release: 8%{?dist}
|
||||
Version: %{base_version}%{?prerel:~%{prerel}}
|
||||
Release: 6%{?dist}
|
||||
Summary: A tool for installing and managing Python packages
|
||||
|
||||
# We bundle a lot of libraries with pip, which itself is under MIT license.
|
||||
# Here is the list of the libraries with corresponding licenses:
|
||||
|
||||
# appdirs: MIT
|
||||
# certifi: MPLv2.0
|
||||
# chardet: LGPLv2
|
||||
# colorama: BSD
|
||||
# CacheControl: ASL 2.0
|
||||
# contextlib2: Python
|
||||
# distlib: Python
|
||||
# distro: ASL 2.0
|
||||
# html5lib: MIT
|
||||
# six: MIT
|
||||
# colorama: BSD
|
||||
# CacheControl: ASL 2.0
|
||||
# msgpack-python: ASL 2.0
|
||||
# lockfile: MIT
|
||||
# progress: ISC
|
||||
# idna: BSD
|
||||
# ipaddress: Python
|
||||
# msgpack: ASL 2.0
|
||||
# packaging: ASL 2.0 or BSD
|
||||
# pep517: MIT
|
||||
# progress: ISC
|
||||
# pyparsing: MIT
|
||||
# pytoml: MIT
|
||||
# retrying: ASL 2.0
|
||||
# requests: ASL 2.0
|
||||
# chardet: LGPLv2
|
||||
# idna: BSD
|
||||
# urllib3: MIT
|
||||
# certifi: MPLv2.0
|
||||
# rfc3986: ASL 2.0
|
||||
# retrying: ASL 2.0
|
||||
# setuptools: MIT
|
||||
# six: MIT
|
||||
# urllib3: MIT
|
||||
# webencodings: BSD
|
||||
|
||||
License: MIT and Python and ASL 2.0 and BSD and ISC and LGPLv2 and MPLv2.0 and (ASL 2.0 or BSD)
|
||||
URL: https://pip.pypa.io/
|
||||
Source0: https://github.com/pypa/pip/archive/%{version}/%{srcname}-%{version}.tar.gz
|
||||
Source0: https://github.com/pypa/pip/archive/%{upstream_version}/%{srcname}-%{upstream_version}.tar.gz
|
||||
|
||||
BuildArch: noarch
|
||||
|
||||
@ -74,10 +68,6 @@ Source1: https://github.com/pypa/pypa-docs-theme/archive/%{pypa_theme_com
|
||||
Source2: https://github.com/python/python-docs-theme/archive/2018.2.tar.gz
|
||||
%endif
|
||||
|
||||
# Patch until the following issue gets implemented upstream:
|
||||
# https://github.com/pypa/pip/issues/1351
|
||||
Patch0: allow-stripping-given-prefix-from-wheel-RECORD-files.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
|
||||
@ -95,32 +85,16 @@ Patch3: remove-existing-dist-only-if-path-conflicts.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1655253
|
||||
Patch4: dummy-certifi.patch
|
||||
|
||||
# When virtualenv is not available, skip the tests instead of failing
|
||||
# Once we no longer ship or test python2-pip, remove this patch
|
||||
Patch5: skip-virtualenv-tests.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,
|
||||
# this warning is juts moot. Also, the warning breaks CPython test suite.
|
||||
Patch5: nowarn-pip._internal.main.patch
|
||||
|
||||
# Make pip compatible with Python 3.9, backported from pip 19.2+
|
||||
# https://github.com/pypa/pip/pull/6728
|
||||
Patch6: python39.patch
|
||||
|
||||
# Upgrade urllib3 to 1.25.3
|
||||
# This bundles rfc3986
|
||||
# https://github.com/pypa/pip/commit/0d620c4a03a8b3765ec45785299244e1a494d750
|
||||
# CVE-2019-11324: Certification mishandle when error should be thrown
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1774595
|
||||
# CVE-2019-11236: CRLF injection due to not encoding the '\r\n' sequence
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1775363
|
||||
Patch7: urllib3-1.25.3.patch
|
||||
|
||||
# Upgrade requests to 2.22.0 (needed for urllib3 1.25.3)
|
||||
# https://github.com/pypa/pip/commit/8e8d28dd8ecc9226ea4e0f75d54151df90f4d78e
|
||||
Patch8: requests-2.22.0.patch
|
||||
|
||||
# Allow setting $TMPDIR to $PWD/... during pip wheel
|
||||
# This is needed to have proper debugsource packages with pyproject-rpm-macros
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1806625
|
||||
# Backported from https://github.com/pypa/pip/pull/7873
|
||||
Patch9: 7873.patch
|
||||
# Backport: Update tests to be endian safe
|
||||
# This updates `test_path_to_display` and `test_str_to_display__encoding`
|
||||
# to use the endian safe expected result instead of the hardcoded one.
|
||||
# This fixes https://github.com/pypa/pip/issues/7921
|
||||
Patch6: https://github.com/pypa/pip/commit/b30dd1e04e.patch
|
||||
|
||||
# Downstream only patch
|
||||
# Users might have local installations of pip from using
|
||||
@ -139,6 +113,10 @@ Patch9: 7873.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1767212
|
||||
# WARNING: /usr/bin/pip* are entrypoints, this cannot be applied in %%prep!
|
||||
# %%patch10 doesn't work outside of %%prep, so we add it as a source
|
||||
# Note that since pip 20, old main() import paths are preserved for backwards
|
||||
# compatibility: https://github.com/pypa/pip/issues/7498
|
||||
# Meaning we don't need to update any of the older pips to support 20+
|
||||
# We also don't need to update Pythons to use new import path in ensurepip
|
||||
Source10: pip-allow-different-versions.patch
|
||||
|
||||
%description
|
||||
@ -150,31 +128,32 @@ Packages" or "Pip Installs Python".
|
||||
|
||||
|
||||
# Virtual provides for the packages bundled by pip.
|
||||
# You can find the versions in src/pip/_vendor/vendor.txt file.
|
||||
# You can generate it with:
|
||||
# %%{_rpmconfigdir}/pythonbundles.py --namespace 'python%%{1}dist' src/pip/_vendor/vendor.txt
|
||||
%global bundled() %{expand:
|
||||
Provides: bundled(python%{1}dist(appdirs)) = 1.4.3
|
||||
Provides: bundled(python%{1}dist(CacheControl)) = 0.12.5
|
||||
Provides: bundled(python%{1}dist(certifi)) = 2019.3.9
|
||||
Provides: bundled(python%{1}dist(cachecontrol)) = 0.12.6
|
||||
Provides: bundled(python%{1}dist(certifi)) = 2020.4.5.1
|
||||
Provides: bundled(python%{1}dist(chardet)) = 3.0.4
|
||||
Provides: bundled(python%{1}dist(colorama)) = 0.4.1
|
||||
Provides: bundled(python%{1}dist(distlib)) = 0.2.8
|
||||
Provides: bundled(python%{1}dist(distro)) = 1.4.0
|
||||
Provides: bundled(python%{1}dist(colorama)) = 0.4.3
|
||||
Provides: bundled(python%{1}dist(contextlib2)) = 0.6^post1
|
||||
Provides: bundled(python%{1}dist(distlib)) = 0.3
|
||||
Provides: bundled(python%{1}dist(distro)) = 1.5
|
||||
Provides: bundled(python%{1}dist(html5lib)) = 1.0.1
|
||||
Provides: bundled(python%{1}dist(idna)) = 2.8
|
||||
Provides: bundled(python%{1}dist(ipaddress)) = 1.0.22
|
||||
Provides: bundled(python%{1}dist(lockfile)) = 0.12.2
|
||||
Provides: bundled(python%{1}dist(msgpack)) = 0.5.6
|
||||
Provides: bundled(python%{1}dist(packaging)) = 19.0
|
||||
Provides: bundled(python%{1}dist(pep517)) = 0.5.0
|
||||
Provides: bundled(python%{1}dist(idna)) = 2.9
|
||||
Provides: bundled(python%{1}dist(ipaddress)) = 1.0.23
|
||||
Provides: bundled(python%{1}dist(msgpack)) = 1
|
||||
Provides: bundled(python%{1}dist(packaging)) = 20.3
|
||||
Provides: bundled(python%{1}dist(pep517)) = 0.8.2
|
||||
Provides: bundled(python%{1}dist(progress)) = 1.5
|
||||
Provides: bundled(python%{1}dist(pyparsing)) = 2.4.0
|
||||
Provides: bundled(python%{1}dist(pytoml)) = 0.1.20
|
||||
Provides: bundled(python%{1}dist(requests)) = 2.22.0
|
||||
Provides: bundled(python%{1}dist(pyparsing)) = 2.4.7
|
||||
Provides: bundled(python%{1}dist(requests)) = 2.23
|
||||
Provides: bundled(python%{1}dist(resolvelib)) = 0.3
|
||||
Provides: bundled(python%{1}dist(retrying)) = 1.3.3
|
||||
Provides: bundled(python%{1}dist(setuptools)) = 41.0.1
|
||||
Provides: bundled(python%{1}dist(six)) = 1.12.0
|
||||
Provides: bundled(python%{1}dist(urllib3)) = 1.25.3
|
||||
Provides: bundled(python%{1}dist(rfc3986)) = 1.3.2
|
||||
Provides: bundled(python%{1}dist(setuptools)) = 44
|
||||
Provides: bundled(python%{1}dist(six)) = 1.14
|
||||
Provides: bundled(python%{1}dist(toml)) = 0.10
|
||||
Provides: bundled(python%{1}dist(urllib3)) = 1.25.8
|
||||
Provides: bundled(python%{1}dist(webencodings)) = 0.5.1
|
||||
}
|
||||
|
||||
@ -195,42 +174,6 @@ Recommends: (libcrypt.so.1 if python%{1}(x86-32))
|
||||
}
|
||||
|
||||
|
||||
%if %{with python2}
|
||||
%package -n python2-%{srcname}
|
||||
Summary: A tool for installing and managing Python 2 packages
|
||||
BuildRequires: python2-devel
|
||||
BuildRequires: python2-setuptools
|
||||
%if %{with tests}
|
||||
BuildRequires: python2-mock
|
||||
BuildRequires: python2-pytest
|
||||
BuildRequires: python2-pretend
|
||||
BuildRequires: python2-freezegun
|
||||
BuildRequires: python2-scripttest
|
||||
BuildRequires: python2-pyyaml
|
||||
%endif
|
||||
%if %{without bootstrap}
|
||||
BuildRequires: python2-pip
|
||||
BuildRequires: python2-wheel
|
||||
%endif
|
||||
BuildRequires: ca-certificates
|
||||
Requires: ca-certificates
|
||||
Requires: python2-setuptools
|
||||
|
||||
# Virtual provides for the packages bundled by pip:
|
||||
%{bundled 2}
|
||||
|
||||
%{?python_provide:%python_provide python2-%{srcname}}
|
||||
|
||||
%{crypt_compat_recommends 2}
|
||||
|
||||
%description -n python2-%{srcname}
|
||||
pip is a package management system used to install and manage software packages
|
||||
written in Python. Many packages can be found in the Python Package Index
|
||||
(PyPI). pip is a recursive acronym that can stand for either "Pip Installs
|
||||
Packages" or "Pip Installs Python".
|
||||
|
||||
%endif # with python2
|
||||
|
||||
|
||||
%package -n python%{python3_pkgversion}-%{srcname}
|
||||
Summary: A tool for installing and managing Python3 packages
|
||||
@ -238,7 +181,9 @@ Summary: A tool for installing and managing Python3 packages
|
||||
BuildRequires: python%{python3_pkgversion}-devel
|
||||
# python3 bootstrap: this is rebuilt before the final build of python3, which
|
||||
# adds the dependency on python3-rpm-generators, so we require it manually
|
||||
BuildRequires: python%{python3_pkgversion}-rpm-generators
|
||||
# Note that the package prefix is always python3-, even if we build for 3.X
|
||||
# The minimal version is for bundled provides verification script
|
||||
BuildRequires: python3-rpm-generators >= 11-8
|
||||
BuildRequires: python%{python3_pkgversion}-setuptools
|
||||
BuildRequires: bash-completion
|
||||
%if %{with tests}
|
||||
@ -248,20 +193,24 @@ BuildRequires: python%{python3_pkgversion}-pretend
|
||||
BuildRequires: python%{python3_pkgversion}-freezegun
|
||||
BuildRequires: python%{python3_pkgversion}-scripttest
|
||||
BuildRequires: python%{python3_pkgversion}-virtualenv
|
||||
BuildRequires: python%{python3_pkgversion}-werkzeug
|
||||
BuildRequires: python%{python3_pkgversion}-pyyaml
|
||||
%endif
|
||||
%if %{without bootstrap}
|
||||
BuildRequires: python%{python3_pkgversion}-pip
|
||||
BuildRequires: python%{python3_pkgversion}-wheel
|
||||
%endif
|
||||
BuildRequires: ca-certificates
|
||||
Requires: ca-certificates
|
||||
Requires: python%{python3_pkgversion}-setuptools
|
||||
|
||||
# This was previously required and we keep it recommended because a lot of
|
||||
# sdists installed via pip will try to import setuptools.
|
||||
# But pip doesn't actually require setuptools.
|
||||
# It can install wheels without them and it can build wheels in isolation mode
|
||||
# (using setuptools/flit/poetry/... installed from PyPI).
|
||||
# Side note: pip bundles pkg_resources from setuptools for internal usage.
|
||||
Recommends: python%{python3_pkgversion}-setuptools
|
||||
|
||||
# Virtual provides for the packages bundled by pip:
|
||||
%{bundled 3}
|
||||
|
||||
%{?python_provide:%python_provide python%{python3_pkgversion}-%{srcname}}
|
||||
Provides: pip = %{version}-%{release}
|
||||
Conflicts: python-pip < %{version}-%{release}
|
||||
|
||||
@ -284,7 +233,6 @@ A documentation for a tool for installing and managing Python packages
|
||||
|
||||
%endif
|
||||
|
||||
%if %{without bootstrap}
|
||||
%package wheel
|
||||
Summary: The pip wheel
|
||||
Requires: ca-certificates
|
||||
@ -298,10 +246,9 @@ Requires: ca-certificates
|
||||
|
||||
%description wheel
|
||||
A Python wheel of pip to use with venv.
|
||||
%endif
|
||||
|
||||
%prep
|
||||
%setup -q -n %{srcname}-%{version}
|
||||
%setup -q -n %{srcname}-%{upstream_version}
|
||||
|
||||
%if %{with doc}
|
||||
pushd docs/html
|
||||
@ -312,16 +259,7 @@ mv python-docs-theme-2018.2 python-docs-theme
|
||||
popd
|
||||
%endif
|
||||
|
||||
%patch0 -p1
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
%autopatch -p1
|
||||
|
||||
# this goes together with patch4
|
||||
rm src/pip/_vendor/certifi/*.pem
|
||||
@ -329,17 +267,14 @@ rm src/pip/_vendor/certifi/*.pem
|
||||
# tests expect wheels in here
|
||||
ln -s %{python_wheeldir} tests/data/common_wheels
|
||||
|
||||
# Upstream uses a Python 2/3 compatibility library for csv with Python 3 semantics in tests
|
||||
# We only target Python 3 and csv23 is not (yet) packaged
|
||||
# As of 20.1b1, this workaround was sufficient to get around the missing dependency
|
||||
sed -i -e 's/csv23/csv/g' tests/lib/wheel.py
|
||||
|
||||
|
||||
%build
|
||||
%if %{with python2} && %{with bootstrap}
|
||||
%py2_build
|
||||
%endif
|
||||
|
||||
%if %{without bootstrap}
|
||||
%py3_build_wheel
|
||||
%else
|
||||
%py3_build
|
||||
%endif
|
||||
|
||||
%if %{with doc}
|
||||
export PYTHONPATH=./src/
|
||||
@ -351,169 +286,101 @@ rm -rf docs/build/html/{.doctrees,.buildinfo}
|
||||
|
||||
|
||||
%install
|
||||
%if %{with python2}
|
||||
%if %{without bootstrap}
|
||||
%py2_install_wheel %{python_wheelname}
|
||||
%else
|
||||
%py2_install
|
||||
%endif
|
||||
|
||||
# TODO: we have to remove this by hand now, but it'd be nice if we wouldn't have to
|
||||
# (pip install wheel doesn't overwrite)
|
||||
rm %{buildroot}%{_bindir}/pip
|
||||
%endif # with python2
|
||||
|
||||
%if %{without bootstrap}
|
||||
%py3_install_wheel %{python_wheelname}
|
||||
%else
|
||||
%py3_install
|
||||
%endif
|
||||
# The following is similar to %%py3_install_wheel, but we don't have
|
||||
# /usr/bin/pip yet, so we install using the wheel directly.
|
||||
# (This is not standard wheel usage, but the pip wheel supports it -- see
|
||||
# pip/__main__.py)
|
||||
%{__python3} dist/%{python_wheelname}/pip install \
|
||||
--root %{buildroot} \
|
||||
--no-deps \
|
||||
--no-cache-dir \
|
||||
--no-index \
|
||||
--ignore-installed \
|
||||
--find-links dist \
|
||||
'pip==%{upstream_version}'
|
||||
|
||||
%if %{with doc}
|
||||
pushd docs/build/man
|
||||
install -d %{buildroot}%{_mandir}/man1
|
||||
for MAN in *1; do
|
||||
install -pm0644 $MAN %{buildroot}%{_mandir}/man1/$MAN
|
||||
%if %{with python2}
|
||||
install -pm0644 $MAN %{buildroot}%{_mandir}/man1/${MAN/pip/pip2}
|
||||
%endif
|
||||
for pip in "pip3" "pip-3" "pip%{python3_version}" "pip-%{python3_version}"; do
|
||||
echo ".so $MAN" > %{buildroot}%{_mandir}/man1/${MAN/pip/$pip}
|
||||
done
|
||||
done
|
||||
popd
|
||||
%endif # with doc
|
||||
%endif
|
||||
|
||||
# before we ln -s anything, we apply Source10 patch to all pips:
|
||||
# we don't do this when bootstrapping because the entrypoints look different
|
||||
# this is not worth dealing with because we'll rebuild once more anyway
|
||||
%if %{without bootstrap}
|
||||
for PIP in %{buildroot}%{_bindir}/pip*; do
|
||||
patch -p1 --no-backup-if-mismatch $PIP < %{SOURCE10}
|
||||
done
|
||||
%endif
|
||||
|
||||
mkdir -p %{buildroot}%{bashcompdir}
|
||||
%if %{with python2}
|
||||
PYTHONPATH=%{buildroot}%{python2_sitelib} \
|
||||
%{buildroot}%{_bindir}/pip2 completion --bash \
|
||||
> %{buildroot}%{bashcompdir}/pip2
|
||||
%endif
|
||||
PYTHONPATH=%{buildroot}%{python3_sitelib} \
|
||||
%{buildroot}%{_bindir}/pip completion --bash \
|
||||
> %{buildroot}%{bashcompdir}/pip
|
||||
pips2=pip2
|
||||
pips3=pip
|
||||
for pip in %{buildroot}%{_bindir}/pip*; do
|
||||
pip=$(basename $pip)
|
||||
case $pip in
|
||||
pip3*)
|
||||
pips3="$pips3 $pip"
|
||||
%if 0%{?bashcomp2}
|
||||
ln -s pip %{buildroot}%{bashcompdir}/$pip
|
||||
%endif
|
||||
;;
|
||||
%if %{with python2}
|
||||
pip2?*)
|
||||
pips2="$pips2 $pip"
|
||||
%if 0%{?bashcomp2}
|
||||
ln -s pip2 %{buildroot}%{bashcompdir}/$pip
|
||||
%endif
|
||||
;;
|
||||
%endif
|
||||
esac
|
||||
done
|
||||
sed -i -e "s/^\\(complete.*\\) pip\$/\\1 $pips3/" \
|
||||
-e s/_pip_completion/_pip3_completion/ \
|
||||
%{buildroot}%{bashcompdir}/pip
|
||||
> %{buildroot}%{bashcompdir}/pip3
|
||||
|
||||
# Make bash completion apply to all the 5 symlinks we install
|
||||
sed -i -e "s/^\\(complete.*\\) pip\$/\\1 pip pip{,-}{3,%{python3_version}}/" \
|
||||
-e s/_pip_completion/_pip3_completion/ \
|
||||
%{buildroot}%{bashcompdir}/pip3
|
||||
|
||||
%if %{with python2}
|
||||
sed -i -e "s/^\\(complete.*\\) pip\$/\\1 $pips2/" \
|
||||
%{buildroot}%{bashcompdir}/pip2
|
||||
%endif
|
||||
|
||||
# Provide symlinks to executables to comply with Fedora guidelines for Python
|
||||
%if %{with python2}
|
||||
ln -s ./pip%{python2_version} %{buildroot}%{_bindir}/pip-%{python2_version}
|
||||
ln -s ./pip-%{python2_version} %{buildroot}%{_bindir}/pip-2
|
||||
%endif
|
||||
|
||||
ln -s ./pip%{python3_version} %{buildroot}%{_bindir}/pip-%{python3_version}
|
||||
ln -s ./pip-%{python3_version} %{buildroot}%{_bindir}/pip-3
|
||||
|
||||
|
||||
# Make sure the INSTALLER is not pip, otherwise Patch2 won't work
|
||||
# TODO Maybe we should make all our python packages have this?
|
||||
%if %{without bootstrap}
|
||||
%if %{with python2}
|
||||
echo rpm > %{buildroot}%{python2_sitelib}/pip-%{version}.dist-info/INSTALLER
|
||||
%endif
|
||||
# %%pyproject macros do this for all packages
|
||||
echo rpm > %{buildroot}%{python3_sitelib}/pip-%{upstream_version}.dist-info/INSTALLER
|
||||
|
||||
echo rpm > %{buildroot}%{python3_sitelib}/pip-%{version}.dist-info/INSTALLER
|
||||
%endif
|
||||
|
||||
%if %{without bootstrap}
|
||||
mkdir -p %{buildroot}%{python_wheeldir}
|
||||
install -p dist/%{python_wheelname} -t %{buildroot}%{python_wheeldir}
|
||||
%endif
|
||||
|
||||
|
||||
%if %{with tests}
|
||||
%check
|
||||
# Verify bundled provides are up to date
|
||||
%{_rpmconfigdir}/pythonbundles.py src/pip/_vendor/vendor.txt --compare-with '%{bundled 3}'
|
||||
|
||||
# Upstream tests
|
||||
# bash completion tests only work from installed package
|
||||
# needs unaltered sys.path and we cannot do that in %%check
|
||||
# test_pep517_and_build_options
|
||||
# test_config_file_venv_option
|
||||
# TODO investigate failures
|
||||
# test_uninstall_non_local_distutils
|
||||
# Incompatible with the latest virtualenv
|
||||
# test_from_link_vcs_with_source_dir_obtains_commit_id
|
||||
# test_from_link_vcs_without_source_dir
|
||||
# test_should_cache_git_sha
|
||||
pytest_k='not completion and
|
||||
not test_pep517_and_build_options and
|
||||
not test_config_file_venv_option and
|
||||
not test_uninstall_non_local_distutils'
|
||||
not test_uninstall_non_local_distutils and
|
||||
not test_from_link_vcs_with_source_dir_obtains_commit_id and
|
||||
not test_from_link_vcs_without_source_dir and
|
||||
not test_should_cache_git_sha'
|
||||
|
||||
mkdir _bin
|
||||
export PATH="$PWD/_bin:$PATH"
|
||||
|
||||
%if %{with python2}
|
||||
export PYTHONPATH=%{buildroot}%{python2_sitelib}
|
||||
ln -s %{buildroot}%{_bindir}/pip2 _bin/pip
|
||||
# test_more_than_one_package assumes virtualenv is present
|
||||
%{__python2} -m pytest -m 'not network' -k "$(echo $pytest_k) and not test_more_than_one_package"
|
||||
# --deselect'ed tests are not compatible with the latest virtualenv
|
||||
# These files contain almost 500 tests so we should enable them back
|
||||
# as soon as pip will be compatible upstream
|
||||
# https://github.com/pypa/pip/pull/8441
|
||||
%pytest -m 'not network' -k "$(echo $pytest_k)" \
|
||||
--deselect tests/functional --deselect tests/lib/test_lib.py --deselect tests/unit/test_build_env.py
|
||||
%endif
|
||||
|
||||
|
||||
export PYTHONPATH=%{buildroot}%{python3_sitelib}
|
||||
ln -sf %{buildroot}%{_bindir}/pip3 _bin/pip
|
||||
%{__python3} -m pytest -m 'not network' -k "$(echo $pytest_k)"
|
||||
%endif
|
||||
|
||||
|
||||
%if %{with python2}
|
||||
%files -n python2-%{srcname}
|
||||
%license LICENSE.txt
|
||||
%doc README.rst
|
||||
%if %{with doc}
|
||||
%{_mandir}/man1/pip2.*
|
||||
%endif
|
||||
%{_bindir}/pip2
|
||||
%{_bindir}/pip-2
|
||||
%{_bindir}/pip%{python2_version}
|
||||
%{_bindir}/pip-%{python2_version}
|
||||
%{python2_sitelib}/pip*
|
||||
%dir %{bashcompdir}
|
||||
%if 0%{?bashcomp2}
|
||||
%{bashcompdir}/pip2*
|
||||
%dir %(dirname %{bashcompdir})
|
||||
%endif
|
||||
%endif # with python2
|
||||
|
||||
%files -n python%{python3_pkgversion}-%{srcname}
|
||||
%license LICENSE.txt
|
||||
%doc README.rst
|
||||
%if %{with doc}
|
||||
%{_mandir}/man1/pip.*
|
||||
%{_mandir}/man1/pip-*.*
|
||||
%{_mandir}/man1/pip3.*
|
||||
%{_mandir}/man1/pip-*
|
||||
%{_mandir}/man1/pip3-*.*
|
||||
%endif
|
||||
%{_bindir}/pip
|
||||
%{_bindir}/pip3
|
||||
@ -522,41 +389,84 @@ ln -sf %{buildroot}%{_bindir}/pip3 _bin/pip
|
||||
%{_bindir}/pip-%{python3_version}
|
||||
%{python3_sitelib}/pip*
|
||||
%dir %{bashcompdir}
|
||||
%{bashcompdir}/pip
|
||||
%{bashcompdir}/pip3*
|
||||
%if 0%{?bashcomp2}
|
||||
%dir %(dirname %{bashcompdir})
|
||||
%endif
|
||||
%{bashcompdir}/pip3
|
||||
|
||||
%if %{with doc}
|
||||
%files doc
|
||||
%license LICENSE.txt
|
||||
%doc README.rst
|
||||
%doc docs/build/html
|
||||
%endif # with doc
|
||||
%endif
|
||||
|
||||
%if %{without bootstrap}
|
||||
%files wheel
|
||||
%license LICENSE.txt
|
||||
# we own the dir for simplicity
|
||||
%dir %{python_wheeldir}/
|
||||
%{python_wheeldir}/%{python_wheelname}
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Apr 10 2020 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-8
|
||||
* Fri Jul 10 2020 Lumír Balhar <lbalhar@redhat.com> - 20.1.1-6
|
||||
- Do not emit a warning about root privileges when --root is used
|
||||
|
||||
* Wed Jul 08 2020 Miro Hrončok <mhroncok@redhat.com> - 20.1.1-5
|
||||
- Update bundled provides to match 20.1.1
|
||||
|
||||
* Tue Jun 16 2020 Lumír Balhar <lbalhar@redhat.com> - 20.1.1-4
|
||||
- Deselect tests incompatible with the latest virtualenv
|
||||
|
||||
* Sun May 24 2020 Miro Hrončok <mhroncok@redhat.com> - 20.1.1-3
|
||||
- Rebuilt for Python 3.9
|
||||
|
||||
* Thu May 21 2020 Miro Hrončok <mhroncok@redhat.com> - 20.1.1-2
|
||||
- Bootstrap for Python 3.9
|
||||
|
||||
* Wed May 20 2020 Tomas Hrnciar <thrnciar@redhat.com> - 20.1.1-1
|
||||
- Update to 20.1.1
|
||||
|
||||
* Wed Apr 29 2020 Tomas Hrnciar <thrnciar@redhat.com> - 20.1-1
|
||||
- Update to 20.1
|
||||
|
||||
* Mon Apr 27 2020 Tomas Hrnciar <thrnciar@redhat.com> - 20.1~b1-1
|
||||
- Update to 20.1~b1
|
||||
|
||||
* Wed Apr 15 2020 Miro Hrončok <mhroncok@redhat.com> - 20.0.2-4
|
||||
- Only recommend setuptools, don't require them
|
||||
|
||||
* Fri Apr 10 2020 Miro Hrončok <mhroncok@redhat.com> - 20.0.2-3
|
||||
- Allow setting $TMPDIR to $PWD/... during pip wheel (#1806625)
|
||||
|
||||
* Thu Jan 02 2020 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-7
|
||||
- Upgrade urllib3 to 1.25.3, requests to 2.22.0
|
||||
- Fix urllib3 CVE-2019-11324 (#1774595)
|
||||
- Fix urllib3 CVE-2019-11236 (#1775363)
|
||||
* Tue Mar 10 2020 Miro Hrončok <mhroncok@redhat.com> - 20.0.2-2
|
||||
- Don't warn the user about pip._internal.main() entrypoint to fix ensurepip
|
||||
|
||||
* Mon Nov 25 2019 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-6
|
||||
- Make python-pip-wheel work with Python 3.9
|
||||
* Mon Mar 02 2020 Miro Hrončok <mhroncok@redhat.com> - 20.0.2-1
|
||||
- Update to 20.0.2 (#1793456)
|
||||
|
||||
* Mon Nov 11 2019 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-5
|
||||
- Make /usr/bin/pip(2|3) work with user-installed pip 19.3+ (#1767212)
|
||||
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 19.3.1-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Mon Nov 04 2019 Tomas Orsava <torsava@redhat.com> - 19.3.1-1
|
||||
- Update to 19.3.1 (#1761508)
|
||||
- Drop upstreamed patch that fixed expected output in test to not break with alpha/beta/rc Python versions
|
||||
|
||||
* Wed Oct 30 2019 Miro Hrončok <mhroncok@redhat.com> - 19.2.3-2
|
||||
- Make /usr/bin/pip(3) work with user-installed pip 19.3+ (#1767212)
|
||||
|
||||
* Mon Sep 02 2019 Miro Hrončok <mhroncok@redhat.com> - 19.2.3-1
|
||||
- Update to 19.2.3 (#1742230)
|
||||
- Drop patch that should strip path prefixes from RECORD files, the paths are relative
|
||||
|
||||
* Wed Aug 21 2019 Petr Viktorin <pviktori@redhat.com> - 19.1.1-8
|
||||
- Remove python2-pip
|
||||
- Make pip bootstrap itself, rather than with an extra bootstrap RPM build
|
||||
|
||||
* Sat Aug 17 2019 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-7
|
||||
- Rebuilt for Python 3.8
|
||||
|
||||
* Wed Aug 14 2019 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-6
|
||||
- Bootstrap for Python 3.8
|
||||
|
||||
* Wed Aug 14 2019 Miro Hrončok <mhroncok@redhat.com> - 19.1.1-5
|
||||
- Bootstrap for Python 3.8
|
||||
|
||||
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 19.1.1-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
@ -1,45 +0,0 @@
|
||||
From ef7ca1472c1fdd085cffb8183b7ce8abbe9e2800 Mon Sep 17 00:00:00 2001
|
||||
From: Chih-Hsuan Yen <yan12125@gmail.com>
|
||||
Date: Thu, 18 Jul 2019 12:45:15 +0800
|
||||
Subject: [PATCH] Add an html5lib patch for Python 3.9 compatibility
|
||||
|
||||
The patch is adapted from https://github.com/html5lib/html5lib-python/commit/4f9235752cea29c5a31721440578b430823a1e69
|
||||
|
||||
Closes https://github.com/pypa/pip/issues/6407
|
||||
Closes https://github.com/pypa/pip/issues/6237
|
||||
---
|
||||
src/pip/_vendor/html5lib/_trie/_base.py | 5 +++-
|
||||
src/pip/_vendor/html5lib/treebuilders/dom.py | 5 +++-
|
||||
4 files changed, 40 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/pip/_vendor/html5lib/_trie/_base.py b/src/pip/_vendor/html5lib/_trie/_base.py
|
||||
index a1158bbbf..6b71975f0 100644
|
||||
--- a/src/pip/_vendor/html5lib/_trie/_base.py
|
||||
+++ b/src/pip/_vendor/html5lib/_trie/_base.py
|
||||
@@ -1,6 +1,9 @@
|
||||
from __future__ import absolute_import, division, unicode_literals
|
||||
|
||||
-from collections import Mapping
|
||||
+try:
|
||||
+ from collections.abc import Mapping
|
||||
+except ImportError: # Python 2.7
|
||||
+ from collections import Mapping
|
||||
|
||||
|
||||
class Trie(Mapping):
|
||||
diff --git a/src/pip/_vendor/html5lib/treebuilders/dom.py b/src/pip/_vendor/html5lib/treebuilders/dom.py
|
||||
index dcfac220b..d8b530046 100644
|
||||
--- a/src/pip/_vendor/html5lib/treebuilders/dom.py
|
||||
+++ b/src/pip/_vendor/html5lib/treebuilders/dom.py
|
||||
@@ -1,7 +1,10 @@
|
||||
from __future__ import absolute_import, division, unicode_literals
|
||||
|
||||
|
||||
-from collections import MutableMapping
|
||||
+try:
|
||||
+ from collections.abc import MutableMapping
|
||||
+except ImportError: # Python 2.7
|
||||
+ from collections import MutableMapping
|
||||
from xml.dom import minidom, Node
|
||||
import weakref
|
||||
|
@ -1,51 +1,55 @@
|
||||
commit b6d5da6796801862eb751a93d507c343af0604d6
|
||||
Author: Victor Stinner <vstinner@redhat.com>
|
||||
Date: Tue Sep 18 17:13:51 2018 +0200
|
||||
From d381c59fdc15949c4dc293bd92bbccb60289a703 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
|
||||
|
||||
Subject: 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>
|
||||
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 d21530a..0023a35 100644
|
||||
index 3b28209b..d14217e9 100644
|
||||
--- a/src/pip/_internal/req/req_install.py
|
||||
+++ b/src/pip/_internal/req/req_install.py
|
||||
@@ -29,7 +29,7 @@ from pip._internal.utils.hashes import Hashes
|
||||
from pip._internal.utils.logging import indent_log
|
||||
from pip._internal.utils.misc import (
|
||||
_make_build_dir, ask_path_exists, backup_dir, call_subprocess,
|
||||
- display_path, dist_in_site_packages, dist_in_usersite, ensure_dir,
|
||||
+ display_path, dist_in_install_path, dist_in_site_packages, dist_in_usersite, ensure_dir,
|
||||
get_installed_version, redact_password_from_url, rmtree,
|
||||
)
|
||||
from pip._internal.utils.packaging import get_metadata
|
||||
@@ -411,7 +411,7 @@ class InstallRequirement(object):
|
||||
"lack sys.path precedence to %s in %s" %
|
||||
(existing_dist.project_name, existing_dist.location)
|
||||
@@ -38,6 +38,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_installed_version,
|
||||
@@ -444,7 +445,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.conflicts_with = existing_dist
|
||||
return True
|
||||
|
||||
diff --git a/src/pip/_internal/resolve.py b/src/pip/_internal/resolve.py
|
||||
index 33f572f..88b68e1 100644
|
||||
--- a/src/pip/_internal/resolve.py
|
||||
+++ b/src/pip/_internal/resolve.py
|
||||
@@ -20,7 +20,7 @@ from pip._internal.exceptions import (
|
||||
)
|
||||
from pip._internal.req.constructors import install_req_from_req_string
|
||||
self.should_reinstall = True
|
||||
else:
|
||||
if self.editable and self.satisfied_by:
|
||||
diff --git a/src/pip/_internal/resolution/legacy/resolver.py b/src/pip/_internal/resolution/legacy/resolver.py
|
||||
index cdb44d19..52e122c6 100644
|
||||
--- a/src/pip/_internal/resolution/legacy/resolver.py
|
||||
+++ b/src/pip/_internal/resolution/legacy/resolver.py
|
||||
@@ -33,6 +33,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, ensure_dir
|
||||
+from pip._internal.utils.misc import dist_in_install_path, dist_in_usersite, ensure_dir
|
||||
from pip._internal.utils.packaging import check_dist_requires_python
|
||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||
|
||||
@@ -154,7 +154,9 @@ class Resolver(object):
|
||||
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,
|
||||
@@ -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.
|
||||
@ -53,24 +57,23 @@ index 33f572f..88b68e1 100644
|
||||
+ if ((not self.use_user_site
|
||||
+ or dist_in_usersite(req.satisfied_by))
|
||||
+ and dist_in_install_path(req.satisfied_by)):
|
||||
req.conflicts_with = 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 84605ee..0e4ba93 100644
|
||||
index 09031825..3c064f8f 100644
|
||||
--- a/src/pip/_internal/utils/misc.py
|
||||
+++ b/src/pip/_internal/utils/misc.py
|
||||
@@ -30,7 +30,7 @@ from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote
|
||||
from pip._internal.exceptions import CommandError, InstallationError
|
||||
@@ -29,6 +29,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 (
|
||||
running_under_virtualenv, site_packages, user_site, virtualenv_no_global,
|
||||
- write_delete_marker_file,
|
||||
+ write_delete_marker_file, distutils_scheme,
|
||||
)
|
||||
from pip._internal.utils.compat import (
|
||||
WINDOWS, console_to_str, expanduser, stdlib_pkgs,
|
||||
@@ -355,6 +355,16 @@ def dist_in_site_packages(dist):
|
||||
).startswith(normalize_path(site_packages))
|
||||
+ distutils_scheme,
|
||||
get_major_minor_version,
|
||||
site_packages,
|
||||
user_site,
|
||||
@@ -400,6 +401,16 @@ def dist_in_site_packages(dist):
|
||||
return dist_location(dist).startswith(normalize_path(site_packages))
|
||||
|
||||
|
||||
+def dist_in_install_path(dist):
|
||||
@ -86,3 +89,7 @@ index 84605ee..0e4ba93 100644
|
||||
def dist_is_editable(dist):
|
||||
# type: (Distribution) -> bool
|
||||
"""
|
||||
--
|
||||
2.23.0
|
||||
|
||||
|
||||
|
@ -1,91 +0,0 @@
|
||||
From 8e8d28dd8ecc9226ea4e0f75d54151df90f4d78e Mon Sep 17 00:00:00 2001
|
||||
From: Pradyun Gedam <pradyunsg@gmail.com>
|
||||
Date: Sat, 20 Jul 2019 09:31:48 +0530
|
||||
Subject: [PATCH] Upgrade requests to 2.22.0
|
||||
|
||||
---
|
||||
news/requests.vendor | 1 +
|
||||
src/pip/_vendor/requests/__init__.py | 4 ++--
|
||||
src/pip/_vendor/requests/__version__.py | 6 +++---
|
||||
src/pip/_vendor/requests/api.py | 4 ++--
|
||||
src/pip/_vendor/vendor.txt | 1 +
|
||||
5 files changed, 9 insertions(+), 7 deletions(-)
|
||||
create mode 100644 news/requests.vendor
|
||||
|
||||
diff --git a/news/requests.vendor b/news/requests.vendor
|
||||
new file mode 100644
|
||||
index 0000000000..aac729b0e1
|
||||
--- /dev/null
|
||||
+++ b/news/requests.vendor
|
||||
@@ -0,0 +1 @@
|
||||
+Upgrade requests to 2.22.0
|
||||
diff --git a/src/pip/_vendor/requests/__init__.py b/src/pip/_vendor/requests/__init__.py
|
||||
index 80c4ce1d21..1d30e3e063 100644
|
||||
--- a/src/pip/_vendor/requests/__init__.py
|
||||
+++ b/src/pip/_vendor/requests/__init__.py
|
||||
@@ -57,10 +57,10 @@ def check_compatibility(urllib3_version, chardet_version):
|
||||
# Check urllib3 for compatibility.
|
||||
major, minor, patch = urllib3_version # noqa: F811
|
||||
major, minor, patch = int(major), int(minor), int(patch)
|
||||
- # urllib3 >= 1.21.1, <= 1.24
|
||||
+ # urllib3 >= 1.21.1, <= 1.25
|
||||
assert major == 1
|
||||
assert minor >= 21
|
||||
- assert minor <= 24
|
||||
+ assert minor <= 25
|
||||
|
||||
# Check chardet for compatibility.
|
||||
major, minor, patch = chardet_version.split('.')[:3]
|
||||
diff --git a/src/pip/_vendor/requests/__version__.py b/src/pip/_vendor/requests/__version__.py
|
||||
index f5b5d03671..9844f740ab 100644
|
||||
--- a/src/pip/_vendor/requests/__version__.py
|
||||
+++ b/src/pip/_vendor/requests/__version__.py
|
||||
@@ -5,10 +5,10 @@
|
||||
__title__ = 'requests'
|
||||
__description__ = 'Python HTTP for Humans.'
|
||||
__url__ = 'http://python-requests.org'
|
||||
-__version__ = '2.21.0'
|
||||
-__build__ = 0x022100
|
||||
+__version__ = '2.22.0'
|
||||
+__build__ = 0x022200
|
||||
__author__ = 'Kenneth Reitz'
|
||||
__author_email__ = 'me@kennethreitz.org'
|
||||
__license__ = 'Apache 2.0'
|
||||
-__copyright__ = 'Copyright 2018 Kenneth Reitz'
|
||||
+__copyright__ = 'Copyright 2019 Kenneth Reitz'
|
||||
__cake__ = u'\u2728 \U0001f370 \u2728'
|
||||
diff --git a/src/pip/_vendor/requests/api.py b/src/pip/_vendor/requests/api.py
|
||||
index abada96d46..ef71d0759e 100644
|
||||
--- a/src/pip/_vendor/requests/api.py
|
||||
+++ b/src/pip/_vendor/requests/api.py
|
||||
@@ -19,7 +19,7 @@ def request(method, url, **kwargs):
|
||||
:param method: method for the new :class:`Request` object.
|
||||
:param url: URL for the new :class:`Request` object.
|
||||
:param params: (optional) Dictionary, list of tuples or bytes to send
|
||||
- in the body of the :class:`Request`.
|
||||
+ in the query string for the :class:`Request`.
|
||||
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
|
||||
object to send in the body of the :class:`Request`.
|
||||
:param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
|
||||
@@ -65,7 +65,7 @@ def get(url, params=None, **kwargs):
|
||||
|
||||
:param url: URL for the new :class:`Request` object.
|
||||
:param params: (optional) Dictionary, list of tuples or bytes to send
|
||||
- in the body of the :class:`Request`.
|
||||
+ in the query string for the :class:`Request`.
|
||||
:param \*\*kwargs: Optional arguments that ``request`` takes.
|
||||
:return: :class:`Response <Response>` object
|
||||
:rtype: requests.Response
|
||||
diff --git a/src/pip/_vendor/vendor.txt b/src/pip/_vendor/vendor.txt
|
||||
index bcf579515e..e5542fbc5e 100644
|
||||
--- a/src/pip/_vendor/vendor.txt
|
||||
+++ b/src/pip/_vendor/vendor.txt
|
||||
@@ -12,7 +12,7 @@ pep517==0.5.0
|
||||
progress==1.5
|
||||
pyparsing==2.4.0
|
||||
pytoml==0.1.20
|
||||
-requests==2.21.0
|
||||
+requests==2.22.0
|
||||
certifi==2019.3.9
|
||||
chardet==3.0.4
|
||||
idna==2.8
|
File diff suppressed because it is too large
Load Diff
@ -1,27 +0,0 @@
|
||||
diff --git a/tests/lib/venv.py b/tests/lib/venv.py
|
||||
index 6b63391..126db5b 100644
|
||||
--- a/tests/lib/venv.py
|
||||
+++ b/tests/lib/venv.py
|
||||
@@ -4,8 +4,12 @@ import compileall
|
||||
import sys
|
||||
import textwrap
|
||||
|
||||
+import pytest
|
||||
import six
|
||||
-import virtualenv as _virtualenv
|
||||
+try:
|
||||
+ import virtualenv as _virtualenv
|
||||
+except ImportError:
|
||||
+ _virtualenv = None
|
||||
|
||||
from .path import Path
|
||||
|
||||
@@ -20,6 +24,8 @@ class VirtualEnvironment(object):
|
||||
"""
|
||||
|
||||
def __init__(self, location, template=None, venv_type=None):
|
||||
+ if _virtualenv is None:
|
||||
+ pytest.skip('virtualenv not available')
|
||||
assert template is None or venv_type is None
|
||||
assert venv_type in (None, 'virtualenv', 'venv')
|
||||
self.location = Path(location)
|
2
sources
2
sources
@ -1,3 +1,3 @@
|
||||
SHA512 (pip-19.1.1.tar.gz) = 91cd07118d2f7a39b0ecc5f26ae18de3778ebdde90a40f5fa8cf543dfc8e006647ee2f0f6574db1e102e421962db0d725b0ce7ac75f2bb9591cf4754604c9b1a
|
||||
SHA512 (pip-20.1.1.tar.gz) = ee7b0345c08fbe0215811d07b4c57c1ceece826871842f6d1c174d82e8eee0ad810aa5413d6763ecd5a513e151792a53c36623ab99d2049555ef2542d32d1658
|
||||
SHA512 (d2e63fbfc62af3b7050f619b2f5bb8658985b931.tar.gz) = fc7b11c5cbf6322469ce2eaca2a8d7eb60b17398d316f7465ab5d3d38dabd00ee22a3da7437a28f6312f0115f77f2df0d8bf0abc671e055eef06356c94283409
|
||||
SHA512 (2018.2.tar.gz) = 4c09c43a70ecb3ca3bc9445b01bf209eb382e41d9c969145696dea38551992ed88fd9b725a1264380f3dbdf8acdaf5ada3ef86b44255cdfbdbe4a01a1630912d
|
||||
|
@ -25,6 +25,9 @@
|
||||
- smoke38:
|
||||
dir: python/smoke
|
||||
run: VERSION=3.8 ./venv.sh
|
||||
- smoke39:
|
||||
dir: python/smoke
|
||||
run: VERSION=3.9 ./venv.sh
|
||||
- smoke27:
|
||||
dir: python/smoke
|
||||
run: VERSION=2.7 METHOD=virtualenv ./venv.sh
|
||||
@ -43,6 +46,9 @@
|
||||
- smoke38_virtualenv:
|
||||
dir: python/smoke
|
||||
run: VERSION=3.8 METHOD=virtualenv ./venv.sh
|
||||
- smoke39_virtualenv:
|
||||
dir: python/smoke
|
||||
run: VERSION=3.9 METHOD=virtualenv ./venv.sh
|
||||
- pipenv:
|
||||
run: pipenv --three && pipenv install six
|
||||
- pyproject_pytest:
|
||||
@ -66,6 +72,7 @@
|
||||
- python36
|
||||
- python37
|
||||
- python38
|
||||
- python39
|
||||
- python2-devel
|
||||
- python3-devel
|
||||
- python3-tox
|
||||
|
4621
urllib3-1.25.3.patch
4621
urllib3-1.25.3.patch
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user