1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
diff --git a/src/pip/_internal/cli/main_parser.py b/src/pip/_internal/cli/main_parser.py
index 136852466..ffec75192 100644
--- a/src/pip/_internal/cli/main_parser.py
+++ b/src/pip/_internal/cli/main_parser.py
@@ -82,6 +82,11 @@ def parse_command(args: list[str]) -> tuple[str, list[str]]:
# --python
if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
+ raise CommandError(
+ "--python option is not supported on Gentoo, as it requires bundled "
+ "dependencies that have been removed to improve security"
+ )
+
# Re-invoke pip using the specified Python interpreter
interpreter = identify_python_interpreter(general_options.python)
if interpreter is None:
diff --git a/src/pip/_internal/commands/debug.py b/src/pip/_internal/commands/debug.py
index 25bc05d0e..a73d6c358 100644
--- a/src/pip/_internal/commands/debug.py
+++ b/src/pip/_internal/commands/debug.py
@@ -8,7 +8,6 @@ from optparse import Values
from types import ModuleType
from typing import Any
-import pip._vendor
from pip._vendor.certifi import where
from pip._vendor.packaging.version import parse as parse_version
@@ -187,9 +186,7 @@ class DebugCommand(Command):
show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE"))
show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE"))
show_value("pip._vendor.certifi.where()", where())
- show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
-
- show_vendor_versions()
+ show_value("pip._vendor.DEBUNDLED", True)
show_tags(options)
diff --git a/tests/conftest.py b/tests/conftest.py
index f8da34376..a98dffdda 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -473,9 +473,6 @@ def virtualenv_template(
tmpdir_factory: pytest.TempPathFactory,
pip_src: Path,
pip_editable_parts: tuple[Path, ...],
- setuptools_install: Path,
- coverage_install: Path,
- socket_install: Path,
) -> VirtualEnvironment:
venv_type: VirtualEnvironmentType
if request.config.getoption("--use-venv"):
@@ -487,13 +484,6 @@ def virtualenv_template(
tmpdir = tmpdir_factory.mktemp("virtualenv")
venv = VirtualEnvironment(tmpdir.joinpath("venv_orig"), venv_type=venv_type)
- # Install setuptools, pytest-subket, and pip.
- install_pth_link(venv, "setuptools", setuptools_install)
- install_pth_link(venv, "pytest_subket", socket_install)
- # Also copy pytest-subket's .pth file so it can intercept socket calls.
- with open(venv.site / "pytest_socket.pth", "w") as f:
- f.write(socket_install.joinpath("pytest_socket.pth").read_text())
-
pth, dist_info = pip_editable_parts
shutil.copy(pth, venv.site)
@@ -505,14 +495,6 @@ def virtualenv_template(
# detects changed files.
venv.site.joinpath("easy-install.pth").touch()
- if request.config.getoption("--cov"):
- # Install coverage and pth file for executing it in any spawned processes
- # in this virtual environment.
- install_pth_link(venv, "coverage", coverage_install)
- # zz prefix ensures the file is after easy-install.pth.
- with open(venv.site / "zz-coverage-helper.pth", "a") as f:
- f.write("import coverage; coverage.process_startup()")
-
# Drop (non-relocatable) launchers.
for exe in os.listdir(venv.bin):
if not exe.startswith(("python", "libpy")): # Don't remove libpypy-c.so...
diff --git a/tests/functional/test_check.py b/tests/functional/test_check.py
index acf99bc13..5425002e7 100644
--- a/tests/functional/test_check.py
+++ b/tests/functional/test_check.py
@@ -10,10 +10,8 @@ from tests.lib import (
def matches_expected_lines(string: str, expected_lines: Collection[str]) -> bool:
# Ignore empty lines
output_lines = list(filter(None, string.splitlines()))
- # We'll match the last n lines, given n lines to match.
- last_few_output_lines = output_lines[-len(expected_lines) :]
# And order does not matter
- return set(last_few_output_lines) == set(expected_lines)
+ return set(expected_lines).issubset(set(output_lines))
def test_basic_check_clean(script: PipTestEnvironment) -> None:
diff --git a/tests/functional/test_freeze.py b/tests/functional/test_freeze.py
index 4e9ae927f..597c33dc2 100644
--- a/tests/functional/test_freeze.py
+++ b/tests/functional/test_freeze.py
@@ -80,8 +80,8 @@ def test_basic_freeze(script: PipTestEnvironment) -> None:
result = script.pip("freeze", expect_stderr=True)
expected = textwrap.dedent(
"""\
- ...simple==2.0
- simple2==3.0...
+ ...simple==2.0...
+ ...simple2==3.0...
<BLANKLINE>"""
)
_check_output(result.stdout, expected)
@@ -998,7 +998,7 @@ def test_freeze_skip_work_dir_pkg(script: PipTestEnvironment) -> None:
# Freeze should not include package simple when run from package directory
result = script.pip("freeze", cwd=pkg_path)
- assert "simple" not in result.stdout
+ assert "\nsimple==" not in result.stdout
def test_freeze_include_work_dir_pkg(script: PipTestEnvironment) -> None:
diff --git a/tests/functional/test_install_check.py b/tests/functional/test_install_check.py
index cb8312b53..174bb8f66 100644
--- a/tests/functional/test_install_check.py
+++ b/tests/functional/test_install_check.py
@@ -61,6 +61,7 @@ def test_check_install_canonicalization(script: PipTestEnvironment) -> None:
)
assert "requires" not in result.stderr
assert result.returncode == 0
+ return
# Double check that all errors are resolved in the end
result = script.pip("check")
diff --git a/tests/functional/test_list.py b/tests/functional/test_list.py
index b70be2dbb..89bbfce18 100644
--- a/tests/functional/test_list.py
+++ b/tests/functional/test_list.py
@@ -1,5 +1,6 @@
import json
import os
+import re
from pathlib import Path
import pytest
@@ -41,8 +42,8 @@ def test_basic_list(simple_script: PipTestEnvironment) -> None:
"""
result = simple_script.pip("list")
- assert "simple 1.0" in result.stdout, str(result)
- assert "simple2 3.0" in result.stdout, str(result)
+ assert re.search(r"simple\s+1\.0", result.stdout), str(result)
+ assert re.search(r"simple2\s+3\.0", result.stdout), str(result)
def test_verbose_flag(simple_script: PipTestEnvironment) -> None:
@@ -54,8 +55,8 @@ def test_verbose_flag(simple_script: PipTestEnvironment) -> None:
assert "Version" in result.stdout, str(result)
assert "Location" in result.stdout, str(result)
assert "Installer" in result.stdout, str(result)
- assert "simple 1.0" in result.stdout, str(result)
- assert "simple2 3.0" in result.stdout, str(result)
+ assert re.search(r"simple\s+1\.0", result.stdout), str(result)
+ assert re.search(r"simple2\s+3\.0", result.stdout), str(result)
def test_columns_flag(simple_script: PipTestEnvironment) -> None:
@@ -66,8 +67,8 @@ def test_columns_flag(simple_script: PipTestEnvironment) -> None:
assert "Package" in result.stdout, str(result)
assert "Version" in result.stdout, str(result)
assert "simple (1.0)" not in result.stdout, str(result)
- assert "simple 1.0" in result.stdout, str(result)
- assert "simple2 3.0" in result.stdout, str(result)
+ assert re.search(r"simple\s+1\.0", result.stdout), str(result)
+ assert re.search(r"simple2\s+3\.0", result.stdout), str(result)
def test_format_priority(simple_script: PipTestEnvironment) -> None:
@@ -79,16 +80,16 @@ def test_format_priority(simple_script: PipTestEnvironment) -> None:
)
assert "simple==1.0" in result.stdout, str(result)
assert "simple2==3.0" in result.stdout, str(result)
- assert "simple 1.0" not in result.stdout, str(result)
- assert "simple2 3.0" not in result.stdout, str(result)
+ assert not re.search(r"simple\s+1\.0", result.stdout), str(result)
+ assert not re.search(r"simple2\s+3\.0", result.stdout), str(result)
result = simple_script.pip("list", "--format=freeze", "--format=columns")
assert "Package" in result.stdout, str(result)
assert "Version" in result.stdout, str(result)
assert "simple==1.0" not in result.stdout, str(result)
assert "simple2==3.0" not in result.stdout, str(result)
- assert "simple 1.0" in result.stdout, str(result)
- assert "simple2 3.0" in result.stdout, str(result)
+ assert re.search(r"simple\s+1\.0", result.stdout), str(result)
+ assert re.search(r"simple2\s+3\.0", result.stdout), str(result)
def test_local_flag(simple_script: PipTestEnvironment) -> None:
@@ -124,8 +125,8 @@ def test_multiple_exclude_and_normalization(
assert "Normalizable_Name" in result.stdout
assert "pip" in result.stdout
result = script.pip("list", "--exclude", "normalizablE-namE", "--exclude", "pIp")
- assert "Normalizable_Name" not in result.stdout
- assert "pip" not in result.stdout
+ assert "Normalizable_Name " not in result.stdout
+ assert "pip " not in result.stdout
@pytest.mark.usefixtures("enable_user_site")
diff --git a/tests/lib/venv.py b/tests/lib/venv.py
index 67b01d9f3..3caa016a0 100644
--- a/tests/lib/venv.py
+++ b/tests/lib/venv.py
@@ -11,6 +11,7 @@ import venv as _venv
from pathlib import Path
from typing import Literal
+import pytest
import virtualenv as _virtualenv
VirtualEnvironmentType = Literal["virtualenv", "venv"]
@@ -37,7 +38,7 @@ class VirtualEnvironment:
self._venv_type = venv_type
else:
self._venv_type = "virtualenv"
- self._user_site_packages = False
+ self._user_site_packages = True
self._template = template
self._sitecustomize: str | None = None
self._update_paths()
@@ -235,6 +236,8 @@ class VirtualEnvironment:
@user_site_packages.setter
def user_site_packages(self, value: bool) -> None:
+ if not value:
+ pytest.skip("Gentoo: skipping due to lack of system site-packages")
self._user_site_packages = value
if self._legacy_virtualenv:
marker = self.lib / "no-global-site-packages.txt"
|