diff --git a/dev-python/csv23/Manifest b/dev-python/csv23/Manifest
new file mode 100644
index 000000000..f1ad0a3c4
--- /dev/null
+++ b/dev-python/csv23/Manifest
@@ -0,0 +1,3 @@
+DIST csv23-0.3.2.tar.gz 24132 BLAKE2B 2c5eb231814e087dce9689c7075bdbc3875b3e200dc1273022d55661ec60f18a5bcb03e062b205fde13e845e5e50d530b07596b51ad7b2a89e41b45629bf3ce8 SHA512 289386cce5de4ae5bc42fc56d1639bbd1483034e5422f63142c1d188de735b1f5f18f9f69e3cb96f4ac3e1d7d0b371b1c45e720982c4f4b539fcf0d2da893f6a
+EBUILD csv23-0.3.2-r1.ebuild 753 BLAKE2B 4f908e5efcee009259aa3ce10e64446d973549b81ee926ae1b95917586994bb05202ce76923cbd3d9f95a954079c5b10c2e20c2bdb8d20531b955e29cfa329e1 SHA512 ceb03284cbe408d7fe77c32bf150e0041ebc9934bdb2b9cada0ed0c95b6e1f28d3fe3e202d843a55dbda687ec0e51a0b16ca4cf593293e2ea6f3522037fe7153
+MISC metadata.xml 242 BLAKE2B 17fd7db1343fb7dba1842d5b62d83e56e2816962b0122ec6eee7f9e163f333d69ede2cbdf2a2ba8c77613367fca3d2cee779697fb25b5d8cf0439e1e845dbf1f SHA512 2ce768d5aae91f32da90c62900f556c647eb9806c810a817b6c45c5356e71f504b5a646bf75f553c3a9bfd3f94c4317df4948bae863ef7525b4a013b63618cd8
diff --git a/dev-python/csv23/csv23-0.3.2-r1.ebuild b/dev-python/csv23/csv23-0.3.2-r1.ebuild
new file mode 100644
index 000000000..02e3fa1a5
--- /dev/null
+++ b/dev-python/csv23/csv23-0.3.2-r1.ebuild
@@ -0,0 +1,30 @@
+# Copyright 2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8,9} pypy3 )
+inherit distutils-r1
+
+DESCRIPTION="Python 2/3 unicode CSV compatibility layer"
+HOMEPAGE="
+ https://pypi.org/project/csv23/
+ https://github.com/xflr6/csv23/"
+SRC_URI="https://github.com/xflr6/csv23/archive/v${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ppc ppc64 ~riscv sparc x86 ~x64-macos"
+
+BDEPEND="
+ test? (
+ dev-python/mock[${PYTHON_USEDEP}]
+ >=dev-python/pytest-4.6[${PYTHON_USEDEP}]
+ dev-python/pytest-mock[${PYTHON_USEDEP}] )"
+
+distutils_enable_tests pytest
+
+src_prepare() {
+ sed -i -e '/--cov/d' setup.cfg || die
+ distutils-r1_src_prepare
+}
diff --git a/dev-python/csv23/metadata.xml b/dev-python/csv23/metadata.xml
new file mode 100644
index 000000000..e59516686
--- /dev/null
+++ b/dev-python/csv23/metadata.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ python@gentoo.org
+
+
+
diff --git a/dev-python/pip/Manifest b/dev-python/pip/Manifest
index f7886de2c..cd11c8da7 100644
--- a/dev-python/pip/Manifest
+++ b/dev-python/pip/Manifest
@@ -1,10 +1,8 @@
-AUX pip-10.0.1-disable-system-install.patch 769 BLAKE2B 9e722c95f01a184bbc48df6979cde15d748311e5ee5d83e5d18659cffd7520145bb24af891ba0f760dcec4c17b17d31adf211f1a4f938598d1fec44be56e6891 SHA512 6b0d49d398940f2614b2a892be2169a6c2c2d26d7d700271df3819c71c284646cceac9dce4e907662690e17bc0ca372b6251e02f520bf3e60994b26725403029
-AUX pip-10.0.1-disable-version-check.patch 850 BLAKE2B 4ec0e8e0b172c51cdfa2df6ee934df8e25a03885ef7976c2f7cc844728e0359a1d5081296680576ea5780a15b639b3809063e663374ee11e252cd95bd9e876ae SHA512 b489eaf4fe17042807dd92ce77b016fcd032dd79bd5c766bdf9be38d2958e32400bdb5950ff2c400abac42d2a0a17803f5a2cfdc1161906c95c1d34a8bc83f8a
-AUX pip-6.0.2-disable-version-check.patch 465 BLAKE2B e3ae94267a8d0caf425d22968f6e640063eaca0d2c475d130d1d2f7281d6ef541c0c36c3871c67fd4947f54a4ca18cc9a9c0fa347a3960727483b3a3bcd46ed9 SHA512 fd3413fea4649aa6a34ff7a23e7442267dc07307aeb25398e4620d108ab144703db7431e2a158612d9ee67e448d1d66db7e8103364aa6635844672bea16c7d28
-AUX pip-7.1.2-unbundle.patch 1496 BLAKE2B f0bb71125270bbcfe1fe544b81130951c6ccdb97f676b3be5c7831efdedae5edbc47669836565b269af287910cd23cbc193037b39ac09dcaff5dceee542c32e7 SHA512 c0daf49d9a596a188fd54751b8ee7333f1c3187657b677a6f61ab9820483b388c3475b5fecb887115aaa34208070a15b56a8eb5e0a4639c3732840cf17a6f16a
-AUX pip-8.0.0-unbundle.patch 1985 BLAKE2B dca355b40941ef5f805a4b247d75dc9d2ad560c7fd9752be2ca1d428522e83a4c318d3d361d2960fce79051df2ea9180a48c23e4af3048fe31ac535cd0cb8db9 SHA512 3b5f96160623eb2fad9c5978fc6512b21d48d5b91cb09c9d43deaee6de3c843af137a5df11c83b0d8395625482162d8cf40748b072692b305d6ab1220f3fb0c6
-AUX pip-9.0.1-disable-version-check.patch 1031 BLAKE2B 148e528aab19de021f193ac56d758c803e0875b618ee32e948eb103eb6b05eb56e2ecf5ed4dbe39893f5c44ddee17122fdd686f433f5ce89044b2c02291e0ba1 SHA512 8b5764d3ecdbfc871bdf051b41d9610d5028bc3b95a4bf990db46325d10e5d559449ec97ab052686148d6ab6abfa630fb38101c726b6648d19fa94ac593b0a28
-AUX pip-disable-system-install.patch 1070 BLAKE2B 85bfd82888a169cf771467f4f811b9859fddc1cfd134ac21be42b9fd93d84118354fa23a2f4b0ec9c67024f571ba7035665302671420221b52f3fc89f24b1af3 SHA512 bb0a9a32b2eac0a12276c3f0527534226c03868300f54945d20eec16902ad51cbfdace9d79b0caa304bc641323194031a5ca9e5e784366a44527441bd0f3c231
-DIST pip-19.0.2.tar.gz 1324514 BLAKE2B dc9771706d3cfaea8a0ff562606b2a901836531e305ac5f0efdca983f715301ca3c9e19adb8d8a144006a3f703875a8ffb660a9a015b0749170f4b6564d0df8a SHA512 c6e13da3a57462371d32982c80575c5181592f5c6a8e70d60ec879e689442f4ad468e7aef97eb58c9da50a5a770385aa35e701eefd713a8e9fafeb12e11d956b
-EBUILD pip-19.0.2.ebuild 1320 BLAKE2B 08e066081cefda78459fa657314c4906ea3dfb6a79c8aebfdbf314519de6c0a2cc213eb7eb252361addd1e3a2952390bcb6ea81f0f688f87aa606f66998df689 SHA512 4f3ce05fc72f6a120317e7f936b6d3acd7016efb587c564ad33d9dca24c61009623d052d570b5b8605f404e3355339bf1f250d3140020f4659641da81cbe703e
+AUX pip-19.3-disable-version-check.patch 872 BLAKE2B b0398674f56b78a066c4308f0a8ee0272c5c4c3cb569e6c300ac62fc9fbe8ec2a1bfe257047c15ddcf9cc44c47b7f8b9ab99e17b722bd6ae4cf9dc2a168e01d6 SHA512 1ece773f66556e4380eabf76490430e8fbec23f7cfad27dac02c7e49f7136b632515ef04843e89dfae42c095dbf5280d64e61da1544801c998f802aa59be8e22
+AUX pip-20.0.2-disable-system-install.patch 1298 BLAKE2B a384ee2114e59b8bc719fc14270cf6efbe8914854c404395beb1126db3278683b940e8fcfee83423d78e2aed6521e0bc57566ab0f5618f473262bbd9b7b0bffa SHA512 d2772105d4f4f880606e1e8ab3381af6768a96604a5fdcaa155dd42f8eea731c3a1b733b027d3e591d81f962ba14758b19da4a2c6c12946cd9a9d77c51ca4e78
+AUX pip-20.2-no-coverage.patch 6154 BLAKE2B 743dcacd3107d9c6447197dd01bc85b1b16db5b1da3bf5f84e73801e645848a98854f350d958056eb17aa6b87f8bb2557a27e3bd78582958c3b37cb6ce61d7ce SHA512 67ea11c56b6a7b02faae28c9d941015ca2ba9c125dfcaf01eeaba7717cfb22f23fb84c28f993202f7b648ee64741baaf7545e9951be840d378e39d3af0a60fd0
+DIST pip-20.2.4.tar.gz 8723163 BLAKE2B 4b892950b6752b61af2f6a9d2c0a6f5db124cb7605d6cb9d4787bdbd88911cc6013474dd299f6eb5b1af4a8fa0ab6d3c5253513af182045a50cb463ced8382ea SHA512 649fdc6baa1ebe741717bd1e5ed8f2450d79f8bc0d06f2804c27488be9018f6fa6cc2eccc3ec2801442073f59ac0b8c377612c25116126aa919aa95050f4214f
+DIST setuptools-44.0.0-py2.py3-none-any.whl 583230 BLAKE2B 823e6792471660f247e30a938aa869d345a63db7294e5f9b4bd88f15a7694779011d29740fe317149620985f705fc6e18cbb07a18e5680cc11d7c229ffbc74f6 SHA512 7006fd303181afbeeec0e30cafb9fd1e4d3c6f55cfdd6343fedbc32b17dbb96b3d96ae37f4db27bfb168738727474cf425904ec280ff1d2b789fc48077a8fa84
+DIST wheel-0.34.2-py2.py3-none-any.whl 26502 BLAKE2B 3a1bd4571c582245b60ff33c9bf74ff8a2ebafb26e56fc7b9bd215058d059b6bd13bbe21ce46002af257813a54126f27e19253f211e21c4548c7cf84cd15caf7 SHA512 4f1a44f4691ed8baad777d7874f7f4da96a5019eb485fd3a9eed9259aa2a9d5acccc6dc63a72128664347c64ee039a6076c6ca9c3b75a1f94457967864e522ed
+EBUILD pip-20.2.4.ebuild 4163 BLAKE2B cc26eb182a2e0c9c65946a251f9b2933b6a4622482bb1e434a278e1d103c7be044c23de588f5f79f487160672188b76dc580d1b5881d09301aef80d12873ad3e SHA512 403c5f8cf7375eac81ee208b3d5ded807a0c925a5e9bf95f54d17d3444e830e40687bf652657e58700bd71fd571a64298f5f321b2d69000ec75335d6eeac4c76
MISC metadata.xml 366 BLAKE2B 6cfb3fe9bd6fa72a5bc5aafb74d7f79eaa1fdf273cf45be4fb7989fd917ea8b1ad60a855770cc51944611e7590abeec450ed02c7c9ae8d850084c2b4f7c0d009 SHA512 43ccb12f2797cb70b59ff495d149c32c813e5145c65521eda9a86f675eac7756eefadeb9f4ca977e8e8c7019bae144b445240e6d7128da771eaf6d19559336f6
diff --git a/dev-python/pip/files/pip-10.0.1-disable-system-install.patch b/dev-python/pip/files/pip-10.0.1-disable-system-install.patch
deleted file mode 100644
index 776d395b7..000000000
--- a/dev-python/pip/files/pip-10.0.1-disable-system-install.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-install: Raise an error to avoid breaking python-exec
-
-Running pip without --target, --root, or --user will result in packages
-being installed systemwide. This has a tendency to break python-exec if
-setuptools gets installed or upgraded.
-
---- pip-10.0.1/src/pip/_internal/commands/install.py
-+++ pip-10.0.1/src/pip/_internal/commands/install.py
-@@ -202,6 +202,9 @@
- if options.upgrade:
- upgrade_strategy = options.upgrade_strategy
-
-+ if not options.use_user_site and not options.target_dir and not options.root_path:
-+ raise CommandError("(Gentoo) Please run pip with the --user option to avoid breaking python-exec")
-+
- if options.build_dir:
- options.build_dir = os.path.abspath(options.build_dir)
-
diff --git a/dev-python/pip/files/pip-10.0.1-disable-version-check.patch b/dev-python/pip/files/pip-10.0.1-disable-version-check.patch
deleted file mode 100644
index ad146dc15..000000000
--- a/dev-python/pip/files/pip-10.0.1-disable-version-check.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-Don't check for new versions of pip.
-
---- pip-10.0.1/src/pip/_internal/basecommand.py
-+++ pip-10.0.1/src/pip/_internal/basecommand.py
-@@ -255,14 +255,6 @@
-
- return UNKNOWN_ERROR
- finally:
-- # Check if we're using the latest version of pip available
-- if (not options.disable_pip_version_check and not
-- getattr(options, "no_index", False)):
-- with self._build_session(
-- options,
-- retries=0,
-- timeout=min(5, options.timeout)) as session:
-- pip_version_check(session, options)
- # Avoid leaking loggers
- for handler in set(logging.root.handlers) - original_root_handlers:
- # this method benefit from the Logger class internal lock
diff --git a/dev-python/pip/files/pip-19.3-disable-version-check.patch b/dev-python/pip/files/pip-19.3-disable-version-check.patch
new file mode 100644
index 000000000..e8fe86843
--- /dev/null
+++ b/dev-python/pip/files/pip-19.3-disable-version-check.patch
@@ -0,0 +1,24 @@
+diff --git a/src/pip/_internal/cli/req_command.py b/src/pip/_internal/cli/req_command.py
+index 203e86a4..a2183f10 100644
+--- a/src/pip/_internal/cli/req_command.py
++++ b/src/pip/_internal/cli/req_command.py
+@@ -129,17 +129,8 @@ class IndexGroupCommand(Command, SessionCommandMixin):
+ # Make sure the index_group options are present.
+ assert hasattr(options, 'no_index')
+
+- if options.disable_pip_version_check or options.no_index:
+- return
+-
+- # Otherwise, check if we're using the latest version of pip available.
+- session = self._build_session(
+- options,
+- retries=0,
+- timeout=min(5, options.timeout)
+- )
+- with session:
+- pip_self_version_check(session, options)
++ # Disabled on Gentoo
++ return
+
+
+ class RequirementCommand(IndexGroupCommand):
diff --git a/dev-python/pip/files/pip-20.0.2-disable-system-install.patch b/dev-python/pip/files/pip-20.0.2-disable-system-install.patch
new file mode 100644
index 000000000..e0b0034e4
--- /dev/null
+++ b/dev-python/pip/files/pip-20.0.2-disable-system-install.patch
@@ -0,0 +1,29 @@
+From 3aee04cbb93c0e479b040e682b2aef676629c9a2 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?=
+Date: Sat, 1 Feb 2020 09:14:46 +0100
+Subject: [PATCH] install: Raise an error to avoid breaking python-exec
+
+Running pip without --target, --prefix, --root, or --user will result
+in packages being installed systemwide. This has a tendency to break
+python-exec if setuptools gets installed or upgraded.
+---
+ src/pip/_internal/commands/install.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/pip/_internal/commands/install.py b/src/pip/_internal/commands/install.py
+index 8c2c32fd..41bac878 100644
+--- a/src/pip/_internal/commands/install.py
++++ b/src/pip/_internal/commands/install.py
+@@ -238,6 +238,9 @@ class InstallCommand(RequirementCommand):
+ if options.upgrade:
+ upgrade_strategy = options.upgrade_strategy
+
++ if not options.use_user_site and not options.target_dir and not options.root_path and not options.prefix_path and not os.getenv('GENTOO_PIP_TESTING'):
++ raise CommandError("(Gentoo) Please run pip with the --user option to avoid breaking python-exec")
++
+ cmdoptions.check_dist_restriction(options, check_target=True)
+
+ install_options = options.install_options or []
+--
+2.28.0
+
diff --git a/dev-python/pip/files/pip-20.2-no-coverage.patch b/dev-python/pip/files/pip-20.2-no-coverage.patch
new file mode 100644
index 000000000..55be5b8c9
--- /dev/null
+++ b/dev-python/pip/files/pip-20.2-no-coverage.patch
@@ -0,0 +1,163 @@
+From 43389903a55a5432ca8556f42fb2252c91c7ca45 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?=
+Date: Wed, 29 Jul 2020 07:42:25 +0200
+Subject: [PATCH] Revert "Add basic test coverage configuration"
+
+This is just PITA since coverage uses native C extensions.
+---
+ .coveragerc | 4 +++
+ setup.cfg | 38 ----------------------
+ tests/conftest.py | 16 +--------
+ tools/requirements/tests-common_wheels.txt | 2 --
+ tox.ini | 16 ++-------
+ 5 files changed, 7 insertions(+), 69 deletions(-)
+ create mode 100644 .coveragerc
+
+diff --git a/.coveragerc b/.coveragerc
+new file mode 100644
+index 00000000..5f833c94
+--- /dev/null
++++ b/.coveragerc
+@@ -0,0 +1,4 @@
++[run]
++branch = True
++omit =
++ src/pip/_vendor/*
+diff --git a/setup.cfg b/setup.cfg
+index 45fd58a3..e40596e9 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -67,44 +67,6 @@ markers =
+ yaml: yaml based tests
+ fails_on_new_resolver: Does not yet work on the new resolver
+
+-[coverage:run]
+-branch = True
+-# Do not gather coverage for vendored libraries.
+-omit = */_vendor/*
+-# Centralized absolute file prefix for coverage files.
+-data_file = ${COVERAGE_OUTPUT_DIR}/.coverage
+-# By default, each covered process will try to truncate and then write to
+-# `data_file`, but with `parallel`, they will write to separate files suffixed
+-# with hostname, pid, and a timestamp.
+-parallel = True
+-# If not set, then at the termination of each worker (when using pytest-xdist),
+-# the following is traced: "Coverage.py warning: Module pip was previously
+-# imported, but not measured (module-not-measured)"
+-disable_warnings = module-not-measured
+-
+-[coverage:paths]
+-# We intentionally use "source0" here because pytest-cov unconditionally sets
+-# "source" after loading the config.
+-source0 =
+- # The primary source code path which other paths will be combined into.
+- src/pip/
+- # Unit test source directory e.g.
+- # `.tox/coverage-py3/lib/pythonX.Y/site-packages/pip/...`
+- */site-packages/pip/
+- # Functional test virtual environment directories, which look like
+- # `tmpdir/pip0/pip/src/pip/...`
+- */pip/src/pip/
+-
+-[coverage:report]
+-exclude_lines =
+- # We must re-state the default because the `exclude_lines` option overrides
+- # it.
+- pragma: no cover
+- # This excludes typing-specific code, which will be validated by mypy anyway.
+- if MYPY_CHECK_RUNNING
+- # Can be set to exclude e.g. `if PY2:` on Python 3
+- ${PIP_CI_COVERAGE_EXCLUDES}
+-
+ [bdist_wheel]
+ universal = 1
+
+diff --git a/tests/conftest.py b/tests/conftest.py
+index 2aab5020..0db6d967 100644
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -294,13 +294,6 @@ def wheel_install(tmpdir_factory, common_wheels):
+ 'wheel')
+
+
+-@pytest.fixture(scope='session')
+-def coverage_install(tmpdir_factory, common_wheels):
+- return _common_wheel_editable_install(tmpdir_factory,
+- common_wheels,
+- 'coverage')
+-
+-
+ def install_egg_link(venv, project_name, egg_info_dir):
+ with open(venv.site / 'easy-install.pth', 'a') as fp:
+ fp.write(str(egg_info_dir.resolve()) + '\n')
+@@ -310,7 +303,7 @@ def install_egg_link(venv, project_name, egg_info_dir):
+
+ @pytest.fixture(scope='session')
+ def virtualenv_template(request, tmpdir_factory, pip_src,
+- setuptools_install, coverage_install):
++ setuptools_install, common_wheels):
+
+ if six.PY3 and request.config.getoption('--use-venv'):
+ venv_type = 'venv'
+@@ -334,13 +327,6 @@ def virtualenv_template(request, tmpdir_factory, pip_src,
+ subprocess.check_call([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_egg_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 (
+diff --git a/tools/requirements/tests-common_wheels.txt b/tools/requirements/tests-common_wheels.txt
+index f0edf0b0..6703d606 100644
+--- a/tools/requirements/tests-common_wheels.txt
++++ b/tools/requirements/tests-common_wheels.txt
+@@ -7,5 +7,3 @@
+
+ setuptools >= 40.8.0
+ wheel
+-# As required by pytest-cov.
+-coverage >= 4.4
+diff --git a/tox.ini b/tox.ini
+index 82e9abc6..7a19ca61 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -8,7 +8,6 @@ envlist =
+ # Wrapper for calls to pip that make sure the version being used is the
+ # original virtualenv (stable) version, and not the code being tested.
+ pip = python {toxinidir}/tools/tox_pip.py
+-mkdirp = python -c 'import os, sys; os.path.exists(sys.argv[1]) or os.mkdir(sys.argv[1])'
+
+ [testenv]
+ # Remove USERNAME once we drop PY2.
+@@ -31,20 +30,9 @@ commands = pytest --timeout 300 []
+ install_command = {[helpers]pip} install {opts} {packages}
+ list_dependencies_command = {[helpers]pip} freeze --all
+
+-[testenv:coverage]
++[testenv:coverage-py3]
+ basepython = python3
+-commands =
+- {[helpers]mkdirp} {toxinidir}/.coverage-output
+- pytest --timeout 300 --cov=pip --cov-config={toxinidir}/setup.cfg []
+-
+-setenv =
+- # Used in coverage configuration in setup.cfg.
+- COVERAGE_OUTPUT_DIR = {toxinidir}/.coverage-output
+- # Ensure coverage is enabled in child processes in virtual environments
+- # since they won't already have been enabled by pytest-cov.
+- COVERAGE_PROCESS_START = {toxinidir}/setup.cfg
+- # Used in coverage configuration in setup.cfg.
+- PIP_CI_COVERAGE_EXCLUDES = if PY2
++commands = pytest --timeout 300 --cov=pip --cov-report=term-missing --cov-report=xml --cov-report=html tests/unit {posargs}
+
+ [testenv:docs]
+ # Don't skip install here since pip_sphinxext uses pip's internals.
+--
+2.28.0
+
diff --git a/dev-python/pip/files/pip-6.0.2-disable-version-check.patch b/dev-python/pip/files/pip-6.0.2-disable-version-check.patch
deleted file mode 100644
index a192c228a..000000000
--- a/dev-python/pip/files/pip-6.0.2-disable-version-check.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-Don't check PyPI for new versions of pip by default, updates will occur when
-new releases are added to the tree.
-
---- pip-6.0.2/pip/cmdoptions.py
-+++ pip-6.0.2/pip/cmdoptions.py
-@@ -404,7 +404,7 @@
- "--disable-pip-version-check",
- dest="disable_pip_version_check",
- action="store_true",
-- default=False,
-+ default=True,
- help="Don't periodically check PyPI to determine whether a new version "
- "of pip is available for download.")
-
diff --git a/dev-python/pip/files/pip-7.1.2-unbundle.patch b/dev-python/pip/files/pip-7.1.2-unbundle.patch
deleted file mode 100644
index 70adc20ea..000000000
--- a/dev-python/pip/files/pip-7.1.2-unbundle.patch
+++ /dev/null
@@ -1,34 +0,0 @@
- pip/_vendor/__init__.py | 13 +++++--------
- 1 file changed, 5 insertions(+), 8 deletions(-)
-
-diff --git a/pip/_vendor/__init__.py b/pip/_vendor/__init__.py
-index ef8851d..349d022 100644
---- a/pip/_vendor/__init__.py
-+++ b/pip/_vendor/__init__.py
-@@ -14,7 +14,7 @@ import sys
- # Downstream redistributors which have debundled our dependencies should also
- # patch this value to be true. This will trigger the additional patching
- # to cause things like "six" to be available as pip.
--DEBUNDLED = False
-+DEBUNDLED = True
-
- # By default, look in this directory for a bunch of .whl files which we will
- # add to the beginning of sys.path before attempting to import anything. This
-@@ -29,13 +29,10 @@ WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
- def vendored(modulename):
- vendored_name = "{0}.{1}".format(__name__, modulename)
-
-- try:
-- __import__(vendored_name, globals(), locals(), level=0)
-- except ImportError:
-- __import__(modulename, globals(), locals(), level=0)
-- sys.modules[vendored_name] = sys.modules[modulename]
-- base, head = vendored_name.rsplit(".", 1)
-- setattr(sys.modules[base], head, sys.modules[modulename])
-+ __import__(modulename, globals(), locals(), level=0)
-+ sys.modules[vendored_name] = sys.modules[modulename]
-+ base, head = vendored_name.rsplit(".", 1)
-+ setattr(sys.modules[base], head, sys.modules[modulename])
-
-
- # If we're operating in a debundled setup, then we want to go ahead and trigger
diff --git a/dev-python/pip/files/pip-8.0.0-unbundle.patch b/dev-python/pip/files/pip-8.0.0-unbundle.patch
deleted file mode 100644
index d508d51ab..000000000
--- a/dev-python/pip/files/pip-8.0.0-unbundle.patch
+++ /dev/null
@@ -1,43 +0,0 @@
- pip/_vendor/__init__.py | 15 +++++----------
- 1 file changed, 5 insertions(+), 10 deletions(-)
-
-diff --git a/pip/_vendor/__init__.py b/pip/_vendor/__init__.py
-index b09a7c3..b9fe6ee 100644
---- a/pip/_vendor/__init__.py
-+++ b/pip/_vendor/__init__.py
-@@ -14,7 +14,7 @@ import sys
- # Downstream redistributors which have debundled our dependencies should also
- # patch this value to be true. This will trigger the additional patching
- # to cause things like "six" to be available as pip.
--DEBUNDLED = False
-+DEBUNDLED = True
-
- # By default, look in this directory for a bunch of .whl files which we will
- # add to the beginning of sys.path before attempting to import anything. This
-@@ -29,13 +29,10 @@ WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
- def vendored(modulename):
- vendored_name = "{0}.{1}".format(__name__, modulename)
-
-- try:
-- __import__(vendored_name, globals(), locals(), level=0)
-- except ImportError:
-- __import__(modulename, globals(), locals(), level=0)
-- sys.modules[vendored_name] = sys.modules[modulename]
-- base, head = vendored_name.rsplit(".", 1)
-- setattr(sys.modules[base], head, sys.modules[modulename])
-+ __import__(modulename, globals(), locals(), level=0)
-+ sys.modules[vendored_name] = sys.modules[modulename]
-+ base, head = vendored_name.rsplit(".", 1)
-+ setattr(sys.modules[base], head, sys.modules[modulename])
-
-
- # If we're operating in a debundled setup, then we want to go ahead and trigger
-@@ -85,8 +82,6 @@ if DEBUNDLED:
- vendored("requests.packages.urllib3.packages.ordered_dict")
- vendored("requests.packages.urllib3.packages.six")
- vendored("requests.packages.urllib3.packages.ssl_match_hostname")
-- vendored("requests.packages.urllib3.packages.ssl_match_hostname."
-- "_implementation")
- vendored("requests.packages.urllib3.poolmanager")
- vendored("requests.packages.urllib3.request")
- vendored("requests.packages.urllib3.response")
diff --git a/dev-python/pip/files/pip-9.0.1-disable-version-check.patch b/dev-python/pip/files/pip-9.0.1-disable-version-check.patch
deleted file mode 100644
index 7334380c1..000000000
--- a/dev-python/pip/files/pip-9.0.1-disable-version-check.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 890a1c26018752f2c57c7800968e4b8d1e0987f9 Mon Sep 17 00:00:00 2001
-From: Sebastian Pipping
-Date: Sun, 20 Nov 2016 19:52:40 +0100
-Subject: [PATCH] Stop checking for new versions
-
----
- pip/basecommand.py | 9 ---------
- 1 file changed, 9 deletions(-)
-
-diff --git a/pip/basecommand.py b/pip/basecommand.py
-index 54c6706..3cffe86 100644
---- a/pip/basecommand.py
-+++ b/pip/basecommand.py
-@@ -241,15 +241,6 @@ class Command(object):
- logger.critical('Exception:', exc_info=True)
-
- return UNKNOWN_ERROR
-- finally:
-- # Check if we're using the latest version of pip available
-- if (not options.disable_pip_version_check and not
-- getattr(options, "no_index", False)):
-- with self._build_session(
-- options,
-- retries=0,
-- timeout=min(5, options.timeout)) as session:
-- pip_version_check(session)
-
- return SUCCESS
-
---
-2.10.2
-
diff --git a/dev-python/pip/files/pip-disable-system-install.patch b/dev-python/pip/files/pip-disable-system-install.patch
deleted file mode 100644
index 9e5724543..000000000
--- a/dev-python/pip/files/pip-disable-system-install.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 847553da616edabede18c69ba640a32b719b45a8 Mon Sep 17 00:00:00 2001
-From: Mike Gilbert
-Date: Tue, 27 Oct 2015 12:20:44 -0400
-Subject: [PATCH] install: Raise an error to avoid breaking python-exec
-
-Running pip without --target, --root, or --user will result in packages
-being installed systemwide. This has a tendency to break python-exec if
-setuptools gets installed or upgraded.
----
- pip/commands/install.py | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/pip/commands/install.py b/pip/commands/install.py
-index 46cd9f2..36b72f2 100644
---- a/pip/commands/install.py
-+++ b/pip/commands/install.py
-@@ -204,6 +204,9 @@ class InstallCommand(RequirementCommand):
- )
- options.ignore_installed = True
-
-+ if not options.use_user_site and not options.target_dir and not options.root_path:
-+ raise CommandError("(Gentoo) Please run pip with the --user option to avoid breaking python-exec")
-+
- if options.build_dir:
- options.build_dir = os.path.abspath(options.build_dir)
-
---
-2.6.2
-
diff --git a/dev-python/pip/pip-19.0.2.ebuild b/dev-python/pip/pip-19.0.2.ebuild
deleted file mode 100644
index 7da506ac2..000000000
--- a/dev-python/pip/pip-19.0.2.ebuild
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 1999-2021 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=6
-
-PYTHON_COMPAT=( python2_7 python3_{4..10} pypy{,3} )
-PYTHON_REQ_USE="ssl(+),threads(+)"
-
-inherit eutils bash-completion-r1 distutils-r1
-
-DESCRIPTION="Installs python packages -- replacement for easy_install"
-HOMEPAGE="https://pip.pypa.io/ https://pypi.org/project/pip/ https://github.com/pypa/pip/"
-SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
-
-LICENSE="MIT"
-KEYWORDS="~amd64 ~arm ~arm64 ~x86 ~amd64-linux ~x86-linux"
-SLOT="0"
-IUSE="-vanilla"
-
-# required test data isn't bundled with the tarball
-RESTRICT="test"
-
-DEPEND="dev-python/setuptools[${PYTHON_USEDEP}]"
-RDEPEND="${DEPEND}"
-
-#python_prepare_all() {
-# local PATCHES=(
-# "${FILESDIR}/${PN}-10.0.1-disable-version-check.patch"
-# )
-# if ! use vanilla; then
-# PATCHES+=( "${FILESDIR}/pip-10.0.1-disable-system-install.patch" )
-# fi
-# distutils-r1_python_prepare_all
-#}
-
-python_install_all() {
- local DOCS=( AUTHORS.txt docs/man/commands/*.rst )
- distutils-r1_python_install_all
-
- COMPLETION="${T}"/completion.tmp
-
- "${PYTHON}" -m pip completion --bash > "${COMPLETION}" || die
- newbashcomp "${COMPLETION}" ${PN}
-
- "${PYTHON}" -m pip completion --zsh > "${COMPLETION}" || die
- insinto /usr/share/zsh/site-functions
- newins "${COMPLETION}" _pip
-}
diff --git a/dev-python/pip/pip-20.2.4.ebuild b/dev-python/pip/pip-20.2.4.ebuild
new file mode 100644
index 000000000..76d34fa07
--- /dev/null
+++ b/dev-python/pip/pip-20.2.4.ebuild
@@ -0,0 +1,144 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+DISTUTILS_USE_SETUPTOOLS=rdepend
+PYTHON_COMPAT=( python3_{6,7,8,9} pypy3 )
+PYTHON_REQ_USE="ssl(+),threads(+)"
+
+inherit bash-completion-r1 distutils-r1 multiprocessing
+
+SETUPTOOLS_PV="44.0.0"
+WHEEL_PV="0.34.2"
+
+DESCRIPTION="Installs python packages -- replacement for easy_install"
+HOMEPAGE="https://pip.pypa.io/ https://pypi.org/project/pip/ https://github.com/pypa/pip/"
+SRC_URI="
+ https://github.com/pypa/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz
+ test? (
+ https://files.pythonhosted.org/packages/py2.py3/s/setuptools/setuptools-${SETUPTOOLS_PV}-py2.py3-none-any.whl
+ https://files.pythonhosted.org/packages/py2.py3/w/wheel/wheel-${WHEEL_PV}-py2.py3-none-any.whl
+ )
+"
+# PyPI archive does not have tests, so we need to download from GitHub.
+# setuptools & wheel .whl files are required for testing, exact version is not very important.
+
+LICENSE="MIT"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ppc ppc64 ~riscv sparc x86 ~x64-macos"
+SLOT="0"
+IUSE="test -vanilla"
+
+# disable-system-install patch breaks tests
+RESTRICT="!test? ( test )"
+
+RDEPEND="
+ >=dev-python/setuptools-39.2.0[${PYTHON_USEDEP}]
+"
+DEPEND="
+ ${RDEPEND}
+ test? (
+ dev-python/cryptography[${PYTHON_USEDEP}]
+ dev-python/csv23[${PYTHON_USEDEP}]
+ dev-python/freezegun[${PYTHON_USEDEP}]
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/pretend[${PYTHON_USEDEP}]
+ dev-python/pytest[${PYTHON_USEDEP}]
+ dev-python/pyyaml[${PYTHON_USEDEP}]
+ dev-python/scripttest[${PYTHON_USEDEP}]
+ "${COMPLETION}" || die
+ newbashcomp "${COMPLETION}" ${PN}
+
+ ${PYTHON} -c "${pipcmd}" completion --zsh > "${COMPLETION}" || die
+ insinto /usr/share/zsh/site-functions
+ newins "${COMPLETION}" _pip
+}
diff --git a/dev-python/virtualenv/Manifest b/dev-python/virtualenv/Manifest
new file mode 100644
index 000000000..864099530
--- /dev/null
+++ b/dev-python/virtualenv/Manifest
@@ -0,0 +1,6 @@
+AUX virtualenv-16.7.7-tests-internet.patch 2103 BLAKE2B 56ac246fb6675c273e288b230c2502691f36f49502427c234c8b2da1a2d187791aced234fd70f7be98b98ff158f570747e670cc0ededdab1d5ed499d7b8588be SHA512 17f2a38d32f17c7f8bfe138939b6953dcbf13404371b8377a47759118ad37aaf73f45f670d46d5956fd5948754fb9c60248d9222920c6fd7e7c2e7c7661c9a18
+AUX virtualenv-16.7.7-tests.patch 2092 BLAKE2B fe9eef6372958265ff4b0b919c424a16313934973f29f15f726541cf3a32a9e49d163a40ff0b2d08d17f6521cc7d651fa092d66eb196261706d8d11a9e590e31 SHA512 f4c8a46d5d064672bd154beb0c1fd4a368e9879046931a67fc053e314b5f8510e825cbb3ad3d7e149a19745149a47d4e694b0f6b9f771dcf55e35bcc0871eb59
+AUX virtualenv-16.7.8-tests-pypy.patch 3133 BLAKE2B 37d544c96a1546aa0df4e820014ee6091d4b4ca5155da86280aaebfb1a8d26ce9c6a055e47b11129509d7d00abcee0e3a915bd6ff4665b289cfce399f2dfd3b6 SHA512 f99cd435fe9fa98465addc6b22310e5d708c87edef224cdf540556a2ab1a70bebf06e828c02148bb597d163c31b2816845c0c8126727d1d25b38ffcb91c2251e
+DIST virtualenv-16.7.10.tar.gz 5116776 BLAKE2B 42f0a4b4330850b504f8febd991ef6ecdcbb0821efdd94ca324a8cc34a68a760a8a98de97f0cb2384d8e6cbb0ce8f261995c6433886444e29b75ba0ce09ca12c SHA512 f06d7c354ce1910f04dbcbe1a77e60392653bbe4f638bafbe9284454db2c0e5d63cf9159201d0916fc01aaba91d45fb733b63096c38517fcd83fd00ed8b26d28
+EBUILD virtualenv-16.7.10-r1.ebuild 1959 BLAKE2B 90c31ff96e46d24169602a0f034bf02f0d5fcc4132b1ef12a06226580ed2737398c889a0f752cd14c99f310a72642664aacc27024a65840a8541e580ef601deb SHA512 ab7f3e64008dc6320e2d0a280087b7ae26f934eaa7d571e2f8e01c4e21db7356476fd002918b6217bb52827f22bcd6f8e527e53c1011824d8d32be99c452bec8
+MISC metadata.xml 405 BLAKE2B 65152299182652973b0a6387a690d6e04066d9ac05167d6f0ef7d27036813a793503d16e65514093869ed596227123f493dfdba021a094b0021b6c5b98cc0cf7 SHA512 13db4a863e2a82bae1d177967fc45821a59fddc9afc5c9bbbc0abf64fd2c57cb1f7053443d4721c3c91b6562c1b3844560fccc5853f14bce387aabc620167eb6
diff --git a/dev-python/virtualenv/files/virtualenv-16.7.7-tests-internet.patch b/dev-python/virtualenv/files/virtualenv-16.7.7-tests-internet.patch
new file mode 100644
index 000000000..97baeb59c
--- /dev/null
+++ b/dev-python/virtualenv/files/virtualenv-16.7.7-tests-internet.patch
@@ -0,0 +1,50 @@
+diff --git a/tests/test_from_source.py b/tests/test_from_source.py
+index 39d7c05..76834f7 100644
+--- a/tests/test_from_source.py
++++ b/tests/test_from_source.py
+@@ -40,6 +40,7 @@ def test_use_from_source_sdist(sdist, tmp_path, clean_python, monkeypatch, call_
+ )
+
+
++@pytest.mark.skip(reason="needs internet access")
+ def test_use_from_wheel(tmp_path, extracted_wheel, clean_python, monkeypatch, call_subprocess):
+ """test that we can create a virtual environment by feeding to a clean python the wheels content"""
+ virtualenv_file = extracted_wheel / "virtualenv.py"
+diff --git a/tests/test_source_content.py b/tests/test_source_content.py
+index 8eae6bc..06763ee 100644
+--- a/tests/test_source_content.py
++++ b/tests/test_source_content.py
+@@ -41,6 +41,7 @@ def test_sdist_contains(sdist):
+ assert not extra, " | ".join(extra)
+
+
++@pytest.mark.skip(reason="needs internet access")
+ def test_wheel_contains(extracted_wheel):
+ content = set(extracted_wheel.iterdir())
+
+diff --git a/tests/test_zipapp.py b/tests/test_zipapp.py
+index d084af6..93d29e1 100644
+--- a/tests/test_zipapp.py
++++ b/tests/test_zipapp.py
+@@ -51,11 +51,13 @@ def call_wheel(tmp_path_factory, call_subprocess):
+ return wheel_make_env
+
+
++@pytest.mark.skip(reason="needs internet access")
+ @pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ def test_zipapp_basic_invocation(call_zipapp, tmp_path):
+ _test_basic_invocation(call_zipapp, tmp_path)
+
+
++@pytest.mark.skip(reason="needs internet access")
+ @pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ def test_wheel_basic_invocation(call_wheel, tmp_path):
+ _test_basic_invocation(call_wheel, tmp_path)
+@@ -97,6 +99,7 @@ def test_zipapp_invocation_dash_p(call_zipapp, tmp_path):
+ _test_invocation_dash_p(call_zipapp, tmp_path)
+
+
++@pytest.mark.skip(reason="needs internet access")
+ @pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ @pytest.mark.skipif(sys.platform == "win32" and six.PY2, reason="no python 3 for windows on CI")
+ def test_wheel_invocation_dash_p(call_wheel, tmp_path):
diff --git a/dev-python/virtualenv/files/virtualenv-16.7.7-tests.patch b/dev-python/virtualenv/files/virtualenv-16.7.7-tests.patch
new file mode 100644
index 000000000..41d3240d4
--- /dev/null
+++ b/dev-python/virtualenv/files/virtualenv-16.7.7-tests.patch
@@ -0,0 +1,53 @@
+diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py
+index 620c0cb..946233b 100644
+--- a/tests/test_virtualenv.py
++++ b/tests/test_virtualenv.py
+@@ -356,6 +356,7 @@ def test_install_python_bin():
+ shutil.rmtree(tmp_virtualenv)
+
+
++@pytest.mark.skip(reason="This test does not seem to be working, and I have no idea why")
+ @pytest.mark.skipif("platform.python_implementation() == 'PyPy'")
+ def test_always_copy_option():
+ """Should be no symlinks in directory tree"""
+diff --git a/tests/test_zipapp.py b/tests/test_zipapp.py
+index 8ef8bd1..d084af6 100644
+--- a/tests/test_zipapp.py
++++ b/tests/test_zipapp.py
+@@ -51,10 +51,12 @@ def call_wheel(tmp_path_factory, call_subprocess):
+ return wheel_make_env
+
+
++@pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ def test_zipapp_basic_invocation(call_zipapp, tmp_path):
+ _test_basic_invocation(call_zipapp, tmp_path)
+
+
++@pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ def test_wheel_basic_invocation(call_wheel, tmp_path):
+ _test_basic_invocation(call_wheel, tmp_path)
+
+@@ -95,6 +97,7 @@ def test_zipapp_invocation_dash_p(call_zipapp, tmp_path):
+ _test_invocation_dash_p(call_zipapp, tmp_path)
+
+
++@pytest.mark.skipif(six.PY2, reason="seems to be broken on python2")
+ @pytest.mark.skipif(sys.platform == "win32" and six.PY2, reason="no python 3 for windows on CI")
+ def test_wheel_invocation_dash_p(call_wheel, tmp_path):
+ _test_invocation_dash_p(call_wheel, tmp_path)
+diff --git a/virtualenv.py b/virtualenv.py
+index 0c47e4f..d4a1747 100755
+--- a/virtualenv.py
++++ b/virtualenv.py
+@@ -80,9 +80,9 @@ else:
+ DEFAULT_CONFIG_FILE = os.path.join(DEFAULT_STORAGE_DIR, "virtualenv.ini")
+
+ if IS_PYPY:
+- EXPECTED_EXE = "pypy"
++ EXPECTED_EXE = "pypy{}".format('' if sys.hexversion < 0x3000000 else '3')
+ else:
+- EXPECTED_EXE = "python"
++ EXPECTED_EXE = "python{}.{}".format(sys.version_info.major, sys.version_info.minor)
+
+ # Return a mapping of version -> Python executable
+ # Only provided for Windows, where the information in the registry is used
diff --git a/dev-python/virtualenv/files/virtualenv-16.7.8-tests-pypy.patch b/dev-python/virtualenv/files/virtualenv-16.7.8-tests-pypy.patch
new file mode 100644
index 000000000..1e9268a5f
--- /dev/null
+++ b/dev-python/virtualenv/files/virtualenv-16.7.8-tests-pypy.patch
@@ -0,0 +1,64 @@
+diff --git a/tests/test_virtualenv.py b/tests/test_virtualenv.py
+index 620c0cb..3284cea 100644
+--- a/tests/test_virtualenv.py
++++ b/tests/test_virtualenv.py
+@@ -5,6 +5,7 @@ import optparse
+ import os
+ import shutil
+ import subprocess
++import platform
+ import sys
+ import tempfile
+ import textwrap
+@@ -342,6 +343,11 @@ def test_install_python_bin():
+
+ if virtualenv.IS_WIN:
+ required_executables = ["python.exe", "pythonw.exe"]
++ elif platform.python_implementation() == 'PyPy':
++ if sys.version_info.major < 3:
++ required_executables = ["pypy"]
++ else:
++ required_executables = ["pypy3"]
+ else:
+ py_exe_no_version = "python"
+ py_exe_version_major = "python%s" % sys.version_info[0]
+@@ -549,7 +555,7 @@ def check_pypy_pre_import():
+ assert module in sys.modules, "missing {!r} in sys.modules".format(module)
+
+
+-@pytest.mark.skipif("platform.python_implementation() != 'PyPy'")
++@pytest.mark.skipif("platform.python_implementation() == 'PyPy'")
+ def test_pypy_pre_import(tmp_path):
+ """For PyPy, some built-in modules should be pre-imported because
+ some programs expect them to be in sys.modules on startup.
+@@ -622,7 +628,7 @@ def test_create_environment_from_venv(tmpdir):
+ builder.setup_python(ctx)
+ builder.setup_scripts(ctx)
+ subprocess.check_call([ctx.env_exe, virtualenv.__file__, "--no-setuptools", "--no-pip", "--no-wheel", ve_venv_dir])
+- ve_exe = os.path.join(bin_dir, "python")
++ ve_exe = os.path.join(bin_dir, os.getenv('EPYTHON'))
+ out = subprocess.check_output([ve_exe, "-c", "import sys; print(sys.real_prefix)"], universal_newlines=True)
+ # Test against real_prefix if present - we might be running the test from a virtualenv (e.g. tox).
+ assert out.strip() == getattr(sys, "real_prefix", sys.prefix)
+@@ -639,7 +645,7 @@ def test_create_environment_from_venv_no_pip(tmpdir):
+ builder.setup_python(ctx)
+ builder.setup_scripts(ctx)
+ subprocess.check_call([ctx.env_exe, virtualenv.__file__, "--no-pip", ve_venv_dir])
+- ve_exe = os.path.join(bin_dir, "python")
++ ve_exe = os.path.join(bin_dir, os.getenv('EPYTHON'))
+ out = subprocess.check_output([ve_exe, "-c", "import sys; print(sys.real_prefix)"], universal_newlines=True)
+ # Test against real_prefix if present - we might be running the test from a virtualenv (e.g. tox).
+ assert out.strip() == getattr(sys, "real_prefix", sys.prefix)
+@@ -657,10 +663,11 @@ def test_create_environment_with_old_pip(tmpdir):
+ virtualenv.create_environment(venvdir, search_dirs=[support_dir], no_wheel=True)
+
+
++@pytest.mark.skipif("platform.python_implementation() == 'PyPy'")
+ def test_license_builtin(clean_python):
+ _, bin_dir, _ = clean_python
+ proc = subprocess.Popen(
+- (os.path.join(bin_dir, "python"), "-c", "license()"), stdin=subprocess.PIPE, stdout=subprocess.PIPE
++ (os.path.join(bin_dir, os.getenv('EPYTHON')), "-c", "license()"), stdin=subprocess.PIPE, stdout=subprocess.PIPE
+ )
+ out_b, _ = proc.communicate(b"q\n")
+ out = out_b.decode()
diff --git a/dev-python/virtualenv/metadata.xml b/dev-python/virtualenv/metadata.xml
new file mode 100644
index 000000000..b42c4bbd6
--- /dev/null
+++ b/dev-python/virtualenv/metadata.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ python@gentoo.org
+ Python
+
+
+
+ virtualenv
+ pypa/virtualenv
+
+
diff --git a/dev-python/virtualenv/virtualenv-16.7.10-r1.ebuild b/dev-python/virtualenv/virtualenv-16.7.10-r1.ebuild
new file mode 100644
index 000000000..898e23e80
--- /dev/null
+++ b/dev-python/virtualenv/virtualenv-16.7.10-r1.ebuild
@@ -0,0 +1,66 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8,9} pypy3 )
+DISTUTILS_USE_SETUPTOOLS=manual
+
+inherit distutils-r1
+
+DESCRIPTION="Virtual Python Environment builder"
+HOMEPAGE="
+ https://virtualenv.pypa.io/en/stable/
+ https://pypi.org/project/virtualenv/
+ https://github.com/pypa/virtualenv/
+"
+SRC_URI="https://github.com/pypa/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz"
+
+LICENSE="MIT"
+#KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~sparc-solaris ~x64-solaris ~x86-solaris"
+KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ppc ppc64 ~riscv sparc x86 ~amd64-linux ~x86-linux"
+SLOT="0"
+IUSE="test"
+RESTRICT="!test? ( test )"
+
+RDEPEND=">=dev-python/setuptools-19.6.2[${PYTHON_USEDEP}]"
+BDEPEND="${RDEPEND}
+ test? (
+ >=dev-python/pip-19.3.1-r1[${PYTHON_USEDEP}]
+ dev-python/mock[${PYTHON_USEDEP}]
+ dev-python/pypiserver[${PYTHON_USEDEP}]
+ dev-python/pytest-localserver[${PYTHON_USEDEP}]
+ dev-python/pytest-timeout[${PYTHON_USEDEP}]
+ dev-python/pytest[${PYTHON_USEDEP}]
+ dev-python/six[${PYTHON_USEDEP}]
+ dev-python/wheel[${PYTHON_USEDEP}]
+ )"
+
+DOCS=( docs/index.rst docs/changes.rst )
+
+PATCHES=(
+ "${FILESDIR}/virtualenv-16.7.7-tests.patch"
+
+ # disable tests that need internet access
+ "${FILESDIR}/virtualenv-16.7.7-tests-internet.patch"
+
+ # test fixes for pypy
+ "${FILESDIR}/virtualenv-16.7.8-tests-pypy.patch"
+)
+
+distutils_enable_sphinx docs \
+ dev-python/sphinx_rtd_theme \
+ dev-python/towncrier
+
+python_test() {
+ cp "${S}"/LICENSE.txt "${BUILD_DIR}"/lib || \
+ die "Could not copy LICENSE.txt with ${EPYTHON}"
+
+ pytest -vv tests || die "Tests fail with ${EPYTHON}"
+}
+
+pkg_postinst() {
+ elog "Please note that while virtualenv package no longer supports"
+ elog "Python 2.7, you can still create py2.7 virtualenvs via:"
+ elog " $ virtualenv -p /usr/bin/python2.7 ..."
+}