From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 0571A1582EF for ; Tue, 18 Feb 2025 10:30:56 +0000 (UTC) Received: from lists.gentoo.org (bobolink.gentoo.org [140.211.166.189]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: relay-lists.gentoo.org@gentoo.org) by smtp.gentoo.org (Postfix) with ESMTPSA id DF87D34311D for ; Tue, 18 Feb 2025 10:30:55 +0000 (UTC) Received: from bobolink.gentoo.org (localhost [127.0.0.1]) by bobolink.gentoo.org (Postfix) with ESMTP id CD1DC110470; Tue, 18 Feb 2025 10:30:54 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bobolink.gentoo.org (Postfix) with ESMTPS id C13FC1102E0 for ; Tue, 18 Feb 2025 10:30:54 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 6272134311C for ; Tue, 18 Feb 2025 10:30:54 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id A75F91236 for ; Tue, 18 Feb 2025 10:30:52 +0000 (UTC) From: "Michał Górny" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Michał Górny" Message-ID: <1739872213.caf9390eaa38a9406f174f797827bc847e96a067.mgorny@gentoo> Subject: [gentoo-commits] repo/gentoo:master commit in: dev-python/pip/files/, dev-python/pip/ X-VCS-Repository: repo/gentoo X-VCS-Files: dev-python/pip/files/pip-25.0.1-unbundle.patch dev-python/pip/pip-25.0.1-r1.ebuild dev-python/pip/pip-25.0.1.ebuild X-VCS-Directories: dev-python/pip/ dev-python/pip/files/ X-VCS-Committer: mgorny X-VCS-Committer-Name: Michał Górny X-VCS-Revision: caf9390eaa38a9406f174f797827bc847e96a067 X-VCS-Branch: master Date: Tue, 18 Feb 2025 10:30:52 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: 4d5c8e4d-65fa-4ada-8e18-eb22832f5db1 X-Archives-Hash: 33f45bd4d0e3759fb902f9bca22ded85 commit: caf9390eaa38a9406f174f797827bc847e96a067 Author: Michał Górny gentoo org> AuthorDate: Tue Feb 18 09:50:04 2025 +0000 Commit: Michał Górny gentoo org> CommitDate: Tue Feb 18 09:50:13 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=caf9390e dev-python/pip: Explicitly block --python option for unbundling Signed-off-by: Michał Górny gentoo.org> dev-python/pip/files/pip-25.0.1-unbundle.patch | 209 +++++++++++++++++++++ .../{pip-25.0.1.ebuild => pip-25.0.1-r1.ebuild} | 2 +- 2 files changed, 210 insertions(+), 1 deletion(-) diff --git a/dev-python/pip/files/pip-25.0.1-unbundle.patch b/dev-python/pip/files/pip-25.0.1-unbundle.patch new file mode 100644 index 000000000000..9cc035985250 --- /dev/null +++ b/dev-python/pip/files/pip-25.0.1-unbundle.patch @@ -0,0 +1,209 @@ +diff --git a/src/pip/_internal/cli/main_parser.py b/src/pip/_internal/cli/main_parser.py +index 5ade356b9..d07dfeab8 100644 +--- a/src/pip/_internal/cli/main_parser.py ++++ b/src/pip/_internal/cli/main_parser.py +@@ -80,6 +80,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 567ca967e..427bfcf04 100644 +--- a/src/pip/_internal/commands/debug.py ++++ b/src/pip/_internal/commands/debug.py +@@ -6,7 +6,6 @@ from optparse import Values + from types import ModuleType + from typing import Any, Dict, List, Optional + +-import pip._vendor + from pip._vendor.certifi import where + from pip._vendor.packaging.version import parse as parse_version + +@@ -192,9 +191,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 d093eea46..bf4d9e782 100644 +--- a/tests/conftest.py ++++ b/tests/conftest.py +@@ -418,6 +418,7 @@ def _common_wheel_editable_install( + ) + install_dir = tmpdir_factory.mktemp(package) / "install" + lib_install_dir = install_dir / "lib" ++ return lib_install_dir + bin_install_dir = install_dir / "bin" + with WheelFile.open(wheel_candidates[0]) as source: + install( +diff --git a/tests/functional/test_check.py b/tests/functional/test_check.py +index f50f5593e..c42e88bbe 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 0a7cedd11..ea2fef37d 100644 +--- a/tests/functional/test_freeze.py ++++ b/tests/functional/test_freeze.py +@@ -82,8 +82,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... + """ + ) + _check_output(result.stdout, expected) +@@ -1016,7 +1016,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 8a8a7c93a..bbda083f7 100644 +--- a/tests/functional/test_install_check.py ++++ b/tests/functional/test_install_check.py +@@ -57,6 +57,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 e611fe7cb..c716f65c5 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 +@@ -42,8 +43,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: +@@ -55,8 +56,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: +@@ -67,8 +68,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: +@@ -80,16 +81,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: +@@ -125,8 +126,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.network +diff --git a/tests/lib/venv.py b/tests/lib/venv.py +index fac54d3bd..6bfe3cfdc 100644 +--- a/tests/lib/venv.py ++++ b/tests/lib/venv.py +@@ -9,6 +9,7 @@ import venv as _venv + from pathlib import Path + from typing import Dict, Literal, Optional, Union + ++import pytest + import virtualenv as _virtualenv + + VirtualEnvironmentType = Literal["virtualenv", "venv"] +@@ -35,7 +36,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: Optional[str] = None + self._update_paths() +@@ -234,6 +235,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" diff --git a/dev-python/pip/pip-25.0.1.ebuild b/dev-python/pip/pip-25.0.1-r1.ebuild similarity index 99% rename from dev-python/pip/pip-25.0.1.ebuild rename to dev-python/pip/pip-25.0.1-r1.ebuild index a535620fe6ce..19ed8b7e77d3 100644 --- a/dev-python/pip/pip-25.0.1.ebuild +++ b/dev-python/pip/pip-25.0.1-r1.ebuild @@ -75,7 +75,7 @@ python_prepare_all() { local PATCHES=( "${FILESDIR}/pip-23.1-no-coverage.patch" # prepare to unbundle dependencies - "${FILESDIR}/pip-24.1-unbundle.patch" + "${FILESDIR}/pip-25.0.1-unbundle.patch" ) distutils-r1_python_prepare_all