commit:     e8f4b3407b9f4388fba003c7535f3059ff7189bc
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Jul  5 15:08:48 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Jul  8 06:03:05 2025 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e8f4b340

dev-python/ensurepip-pip: Switch to building from source

Build the installed wheel from source rather than fetching the upstream
wheel.  This is going to make it easier to patch bugs, and it enables
users to apply user patches.  Additionally, we are effectively extending
test coverage, since dev-python/pip is only testing the unbundled
variant.

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
Part-of: https://github.com/gentoo/gentoo/pull/42882
Closes: https://github.com/gentoo/gentoo/pull/42882
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 dev-python/ensurepip-pip/Manifest                  |   1 +
 .../ensurepip-pip/ensurepip-pip-25.1.1-r1.ebuild   | 145 +++++++++++++++++++++
 .../ensurepip-pip/files/pip-23.1-no-coverage.patch |  42 ++++++
 dev-python/ensurepip-pip/metadata.xml              |  16 ++-
 4 files changed, 197 insertions(+), 7 deletions(-)

diff --git a/dev-python/ensurepip-pip/Manifest 
b/dev-python/ensurepip-pip/Manifest
index ae7c8833f652..1191f38db61b 100644
--- a/dev-python/ensurepip-pip/Manifest
+++ b/dev-python/ensurepip-pip/Manifest
@@ -1,3 +1,4 @@
 DIST pip-25.0.1-py3-none-any.whl 1841526 BLAKE2B 
928210cf0586b2e17cf96c341babbbf612eb08775af716588fad8840d04153d264b64098f97c8d2d7b219389d571cee8e4190195f8c5cc9f602749aad92df437
 SHA512 
48315489f2c0a76b49386228f9a2f675e71f20ff2f4aaaf65b2634ba5cac7c98facfbdebeb4651c65efdd2ade053a140d7a2a6b44587549d6663bc8bb5ef2220
 DIST pip-25.1-py3-none-any.whl 1824948 BLAKE2B 
a237c46c680afca0b72da704db8f390f9723e1a9d262b31d3d1dc7c89adff2dd6908768cdbeff5dc621ade7d68ce056ec1c6373b1b500da3a098d9f9798ad925
 SHA512 
1f669dce82d5e9238dc4cb776097f96179be9dbacf18a825a0845437cc4c234ab5242009e8d7d5b0d383bc339d0759ea408668b8d7076861d35da275c0d0fbfe
 DIST pip-25.1.1-py3-none-any.whl 1825227 BLAKE2B 
13170fa08dd26edced5e5fe8d89b38f5b3b63882489d2a951a7238f950a332ce0df11109482840595984bca187960d8fe2b7aeabfcbdaf94e5586631cc1de4e3
 SHA512 
e0c56f04a306cba9e13ed87f7460ad5a3bda7d6c37e05098082c58acb1f7493c8061e48df279f2c476e75d12df12d0f1a74d82e00e6fc2badffe484d281c56fc
+DIST pip-25.1.1.gh.tar.gz 9219969 BLAKE2B 
eb443451deeb71888c2fc56ac5c8cb2d0515ec0efff975fab98cfa65d1fc5e66948243b3acebf1f4b0446e46082abb9fd350816579a4f5af1292c160490ce930
 SHA512 
ce61c9861265139b3c5ea9be9dc246097cd75c21687cf8301f80a377d02420c4524f0d6307d2ca0232ff8715b1105343bcfdb9cac6b69503780ab2c4645558dc

diff --git a/dev-python/ensurepip-pip/ensurepip-pip-25.1.1-r1.ebuild 
b/dev-python/ensurepip-pip/ensurepip-pip-25.1.1-r1.ebuild
new file mode 100644
index 000000000000..8d508587edec
--- /dev/null
+++ b/dev-python/ensurepip-pip/ensurepip-pip-25.1.1-r1.ebuild
@@ -0,0 +1,145 @@
+# Copyright 1999-2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DISTUTILS_USE_PEP517=setuptools
+# PYTHON_COMPAT is used only for testing
+PYTHON_COMPAT=( pypy3_11 python3_{11..14} )
+PYTHON_REQ_USE="ssl(+),threads(+)"
+
+inherit distutils-r1
+
+MY_P=${P#ensurepip-}
+DESCRIPTION="Shared pip wheel for ensurepip Python module"
+HOMEPAGE="
+       https://pip.pypa.io/en/stable/
+       https://pypi.org/project/pip/
+       https://github.com/pypa/pip/
+"
+SRC_URI="
+       https://github.com/pypa/pip/archive/${PV}.tar.gz -> ${MY_P}.gh.tar.gz
+"
+S=${WORKDIR}/${MY_P}
+
+LICENSE="Apache-2.0 BSD BSD-2 ISC LGPL-2.1+ MIT MPL-2.0 PSF-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 
~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos 
~x64-macos ~x64-solaris"
+IUSE="test test-rust"
+RESTRICT="!test? ( test )"
+
+BDEPEND="
+       ${RDEPEND}
+       test? (
+               <dev-python/ensurepip-setuptools-80
+               dev-python/ensurepip-wheel
+               dev-python/freezegun[${PYTHON_USEDEP}]
+               dev-python/pretend[${PYTHON_USEDEP}]
+               dev-python/scripttest[${PYTHON_USEDEP}]
+               dev-python/virtualenv[${PYTHON_USEDEP}]
+               dev-python/werkzeug[${PYTHON_USEDEP}]
+               dev-python/wheel[${PYTHON_USEDEP}]
+               test-rust? (
+                       dev-python/cryptography[${PYTHON_USEDEP}]
+               )
+               dev-vcs/git
+       )
+"
+
+EPYTEST_PLUGINS=( pytest-rerunfailures )
+EPYTEST_XDIST=1
+distutils_enable_tests pytest
+
+python_prepare_all() {
+       local PATCHES=(
+               "${FILESDIR}/pip-23.1-no-coverage.patch"
+       )
+
+       distutils-r1_python_prepare_all
+
+       if use test; then
+               local wheels=(
+                       
"${BROOT}"/usr/lib/python/ensurepip/{setuptools,wheel}-*.whl
+               )
+               mkdir tests/data/common_wheels/ || die
+               cp "${wheels[@]}" tests/data/common_wheels/ || die
+       fi
+}
+
+python_test() {
+       local EPYTEST_DESELECT=(
+               tests/functional/test_inspect.py::test_inspect_basic
+               # Internet
+               
tests/functional/test_config_settings.py::test_backend_sees_config_via_sdist
+               tests/functional/test_install.py::test_double_install_fail
+               tests/functional/test_install.py::test_install_sdist_links
+               
tests/functional/test_install_config.py::test_prompt_for_keyring_if_needed
+               tests/functional/test_lock.py::test_lock_archive
+               tests/functional/test_lock.py::test_lock_vcs
+               # broken by system site-packages use
+               tests/functional/test_freeze.py::test_freeze_with_setuptools
+               
tests/functional/test_pip_runner_script.py::test_runner_work_in_environments_with_no_pip
+               
tests/functional/test_uninstall.py::test_basic_uninstall_distutils
+               
tests/unit/test_base_command.py::test_base_command_global_tempdir_cleanup
+               
tests/unit/test_base_command.py::test_base_command_local_tempdir_cleanup
+               
tests/unit/test_base_command.py::test_base_command_provides_tempdir_helpers
+       )
+       local EPYTEST_IGNORE=(
+               # requires proxy.py
+               tests/functional/test_proxy.py
+       )
+
+       case ${EPYTHON} in
+               pypy3*)
+                       EPYTEST_DESELECT+=(
+                               # unexpected tempfiles?
+                               
tests/functional/test_install_config.py::test_do_not_prompt_for_authentication
+                               
tests/functional/test_install_config.py::test_prompt_for_authentication
+                       )
+                       ;;
+               python3.14*)
+                       EPYTEST_DESELECT+=(
+                               # TODO: segfaults
+                               
tests/unit/test_collector.py::test_get_index_content_directory_append_index
+                               # 
https://github.com/python/cpython/issues/125974
+                               
tests/unit/test_collector.py::test_ensure_quoted_url
+                               
tests/unit/test_finder.py::test_finder_priority_file_over_page
+                               tests/unit/test_urls.py::test_path_to_url_unix
+                               
tests/unit/test_collector.py::test_clean_url_path
+                               
tests/unit/test_collector.py::test_clean_url_path_with_local_path
+                               
tests/unit/test_req.py::TestRequirementSet::test_download_info_local_editable_dir
+                               
tests/unit/test_req.py::test_parse_editable_local
+                               
tests/unit/test_req.py::test_parse_editable_local_extras
+                               
tests/unit/test_req.py::test_get_url_from_path__archive_file
+                               
tests/unit/test_req.py::test_get_url_from_path__installable_dir
+                               
tests/functional/test_lock.py::test_lock_wheel_from_findlinks
+                               
tests/functional/test_lock.py::test_lock_sdist_from_findlinks
+                               
tests/functional/test_lock.py::test_lock_local_editable_with_dep
+                       )
+                       ;;
+       esac
+
+       if ! has_version "dev-python/cryptography[${PYTHON_USEDEP}]"; then
+               EPYTEST_DESELECT+=(
+                       
tests/functional/test_install.py::test_install_sends_client_cert
+                       
tests/functional/test_install_config.py::test_do_not_prompt_for_authentication
+                       
tests/functional/test_install_config.py::test_prompt_for_authentication
+                       
tests/functional/test_install_config.py::test_prompt_for_keyring_if_needed
+               )
+       fi
+
+       local -x PIP_DISABLE_PIP_VERSION_CHECK=1
+       # rerunfailures because test suite breaks if packages are installed
+       # in parallel
+       epytest -m "not network" -o tmp_path_retention_policy=all \
+               --reruns=5 --use-venv
+}
+
+src_install() {
+       if [[ ${DISTUTILS_WHEEL_PATH} != *py3-none-any.whl ]]; then
+               die "Non-pure wheel produced?! ${DISTUTILS_WHEEL_PATH}"
+       fi
+       # TODO: compress it?
+       insinto /usr/lib/python/ensurepip
+       doins "${DISTUTILS_WHEEL_PATH}"
+}

diff --git a/dev-python/ensurepip-pip/files/pip-23.1-no-coverage.patch 
b/dev-python/ensurepip-pip/files/pip-23.1-no-coverage.patch
new file mode 100644
index 000000000000..2e12ee7cd07c
--- /dev/null
+++ b/dev-python/ensurepip-pip/files/pip-23.1-no-coverage.patch
@@ -0,0 +1,42 @@
+From d915b0eec7b5844c06b5d8853544c8c5b538b0b9 Mon Sep 17 00:00:00 2001
+From: Arthur Zamarin <[email protected]>
+Date: Fri, 29 Jul 2022 14:06:03 +0300
+Subject: [PATCH] Disable coverage testing support inside test venvs
+
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -408,13 +408,6 @@ def wheel_install(tmpdir_factory: pytest.TempPathFactory, 
common_wheels: Path) -
+     return _common_wheel_editable_install(tmpdir_factory, common_wheels, 
"wheel")
+ 
+ 
[email protected](scope="session")
+-def coverage_install(
+-    tmpdir_factory: pytest.TempPathFactory, common_wheels: Path
+-) -> Path:
+-    return _common_wheel_editable_install(tmpdir_factory, common_wheels, 
"coverage")
+-
+-
+ def install_pth_link(
+     venv: VirtualEnvironment, project_name: str, lib_dir: Path
+ ) -> None:
+@@ -431,3 +424,2 @@ def virtualenv_template(
+     setuptools_install: Path,
+     wheel_install: Path,
+-    coverage_install: Path,
+@@ -457,13 +449,6 @@ def virtualenv_template(
+         [os.fspath(venv.bin / "python"), "setup.py", "-q", "develop"], 
cwd=pip_editable
+     )
+ 
+-    # 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 (
+-- 
+2.40.0
+

diff --git a/dev-python/ensurepip-pip/metadata.xml 
b/dev-python/ensurepip-pip/metadata.xml
index 4bc0932869e1..632fe93333db 100644
--- a/dev-python/ensurepip-pip/metadata.xml
+++ b/dev-python/ensurepip-pip/metadata.xml
@@ -1,11 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd";>
 <pkgmetadata>
-       <maintainer type="project">
-               <email>[email protected]</email>
-       </maintainer>
-       <stabilize-allarches/>
-       <upstream>
-               <remote-id type="pypi">pip</remote-id>
-       </upstream>
+  <maintainer type="project">
+    <email>[email protected]</email>
+    <name>Python</name>
+  </maintainer>
+  <stabilize-allarches/>
+  <upstream>
+    <remote-id type="pypi">pip</remote-id>
+    <remote-id type="github">pypa/pip</remote-id>
+  </upstream>
 </pkgmetadata>

Reply via email to