Your message dated Fri, 23 May 2025 11:01:58 +0000
with message-id <e1uiqa2-007znh...@respighi.debian.org>
and subject line unblock python-virtualenv
has caused the Debian Bug report #1106347,
regarding unblock: python-virtualenv/20.31.2+ds-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact ow...@bugs.debian.org
immediately.)


-- 
1106347: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1106347
Debian Bug Tracking System
Contact ow...@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: python-virtual...@packages.debian.org
Control: affects -1 + src:python-virtualenv
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package python-virtualenv

Sorry, I hadn't realized virtualenv was a key package.

[ Reason ]
This version includes the final upstream result of forwarding our 
no-wheel-whl patch. My initial approach (strong deprecation) caused some 
regressions in other people's CI, so it got watered down.

[ Impact ]
The previous version of virtualenv had a Debian patch that removed the 
--wheel and --no-wheel options. These are now silently ignored upstream, 
which will cause less downstream breakage.

Being closer to upstream risks less confusion for our users.

[ Tests ]
Third parties have stopped complaining, so I think the current upstream 
versions of virtualenv are behaving as they expect.

We have build time and autopkgtests.

[ Risks ]
(Discussion of the risks involved. E.g. code is trivial or
complex, key package vs leaf package, alternatives available.)

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

unblock python-virtualenv/20.31.2+ds-1
diff -Nru python-virtualenv-20.30.0+ds/debian/changelog 
python-virtualenv-20.31.2+ds/debian/changelog
--- python-virtualenv-20.30.0+ds/debian/changelog       2025-04-28 
19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/changelog       2025-05-09 
15:08:14.000000000 +0200
@@ -1,3 +1,15 @@
+python-virtualenv (20.31.2+ds-1) unstable; urgency=medium
+
+  [ Stefano Rivera ]
+  * New upstream release.
+  * Refresh patches.
+  * Drop no-wheel-whl patch, superseded upstream.
+
+  [ Alexandre Detiste ]
+  * Drop build-dep on python3-importlib-metadata
+
+ -- Stefano Rivera <stefa...@debian.org>  Fri, 09 May 2025 09:08:14 -0400
+
 python-virtualenv (20.30.0+ds-3) unstable; urgency=medium
 
   * Update no-wheel-whl patch to include a deprecated noop --no-wheel option.
diff -Nru python-virtualenv-20.30.0+ds/debian/control 
python-virtualenv-20.31.2+ds/debian/control
--- python-virtualenv-20.30.0+ds/debian/control 2025-04-28 19:56:37.000000000 
+0200
+++ python-virtualenv-20.31.2+ds/debian/control 2025-05-09 15:08:14.000000000 
+0200
@@ -15,7 +15,6 @@
                zip <!nocheck>,
 Build-Depends-Indep: python3-distlib (>= 0.3.1) <!nocheck>,
                      python3-filelock <!nocheck>,
-                     python3-importlib-metadata (>= 3.6) <!nocheck>,
                      python3-pip-whl <!nocheck>,
                      python3-platformdirs <!nocheck>,
                      python3-hatchling (>= 1.11.1),
diff -Nru 
python-virtualenv-20.30.0+ds/debian/patches/debian_update_for_available_wheels.patch
 
python-virtualenv-20.31.2+ds/debian/patches/debian_update_for_available_wheels.patch
--- 
python-virtualenv-20.30.0+ds/debian/patches/debian_update_for_available_wheels.patch
        2025-04-28 19:56:37.000000000 +0200
+++ 
python-virtualenv-20.31.2+ds/debian/patches/debian_update_for_available_wheels.patch
        2025-05-09 15:08:14.000000000 +0200
@@ -13,10 +13,10 @@
  1 file changed, 21 insertions(+)
 
 diff --git a/src/virtualenv/seed/wheels/embed/__init__.py 
b/src/virtualenv/seed/wheels/embed/__init__.py
-index 6c50bda..55362c7 100644
+index 5ca63de..6c8180d 100644
 --- a/src/virtualenv/seed/wheels/embed/__init__.py
 +++ b/src/virtualenv/seed/wheels/embed/__init__.py
-@@ -45,6 +45,27 @@ BUNDLE_SUPPORT = {
+@@ -39,6 +39,27 @@ BUNDLE_SUPPORT = {
  MAX = "3.8"
  
  
@@ -42,5 +42,5 @@
 +
 +
  def get_embed_wheel(distribution, for_py_version):
-     path = BUNDLE_FOLDER / (BUNDLE_SUPPORT.get(for_py_version, {}) or 
BUNDLE_SUPPORT[MAX]).get(distribution)
-     return Wheel.from_path(path)
+     mapping = BUNDLE_SUPPORT.get(for_py_version, {}) or BUNDLE_SUPPORT[MAX]
+     wheel_file = mapping.get(distribution)
diff -Nru 
python-virtualenv-20.30.0+ds/debian/patches/debian_wheel_location.patch 
python-virtualenv-20.31.2+ds/debian/patches/debian_wheel_location.patch
--- python-virtualenv-20.30.0+ds/debian/patches/debian_wheel_location.patch     
2025-04-28 19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/patches/debian_wheel_location.patch     
2025-05-09 15:08:14.000000000 +0200
@@ -13,7 +13,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/src/virtualenv/seed/wheels/embed/__init__.py 
b/src/virtualenv/seed/wheels/embed/__init__.py
-index 4727e61..6c50bda 100644
+index 6b3ef26..5ca63de 100644
 --- a/src/virtualenv/seed/wheels/embed/__init__.py
 +++ b/src/virtualenv/seed/wheels/embed/__init__.py
 @@ -4,7 +4,7 @@ from pathlib import Path
diff -Nru 
python-virtualenv-20.30.0+ds/debian/patches/disable-periodic-update.patch 
python-virtualenv-20.31.2+ds/debian/patches/disable-periodic-update.patch
--- python-virtualenv-20.30.0+ds/debian/patches/disable-periodic-update.patch   
2025-04-28 19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/patches/disable-periodic-update.patch   
2025-05-09 15:08:14.000000000 +0200
@@ -11,13 +11,13 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/src/virtualenv/seed/embed/base_embed.py 
b/src/virtualenv/seed/embed/base_embed.py
-index 864cc49..7d83cb6 100644
+index 72fc5a3..59f3f2c 100644
 --- a/src/virtualenv/seed/embed/base_embed.py
 +++ b/src/virtualenv/seed/embed/base_embed.py
-@@ -6,7 +6,7 @@ from pathlib import Path
- from virtualenv.seed.seeder import Seeder
+@@ -9,7 +9,7 @@ from virtualenv.seed.seeder import Seeder
  from virtualenv.seed.wheels import Version
  
+ LOGGER = logging.getLogger(__name__)
 -PERIODIC_UPDATE_ON_BY_DEFAULT = True
 +PERIODIC_UPDATE_ON_BY_DEFAULT = False
  
diff -Nru python-virtualenv-20.30.0+ds/debian/patches/no-wheel-whl 
python-virtualenv-20.31.2+ds/debian/patches/no-wheel-whl
--- python-virtualenv-20.30.0+ds/debian/patches/no-wheel-whl    2025-04-28 
19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/patches/no-wheel-whl    1970-01-01 
01:00:00.000000000 +0100
@@ -1,324 +0,0 @@
-From: Stefano Rivera <stef...@rivera.za.net>
-Date: Thu, 10 Apr 2025 17:40:16 -0400
-Subject: Stop including 'wheel',
- setuptools 70.1 has native bdist_wheel support
-
-Forwarded: https://github.com/pypa/virtualenv/pull/2868
-Bug-Upstream: https://github.com/pypa/virtualenv/issues/2873
----
- src/virtualenv/seed/embed/base_embed.py            | 23 ++++++++++++++++++----
- src/virtualenv/seed/wheels/embed/__init__.py       |  7 -------
- tests/unit/config/test___main__.py                 |  4 ++--
- tests/unit/create/test_creator.py                  |  4 +---
- tests/unit/seed/embed/test_base_embed.py           | 21 +++++++++++++++-----
- .../seed/embed/test_bootstrap_link_via_app_data.py | 12 +++++------
- tests/unit/seed/embed/test_pip_invoke.py           |  7 +++----
- tests/unit/seed/wheels/test_periodic_update.py     |  5 +----
- 8 files changed, 48 insertions(+), 35 deletions(-)
-
-diff --git a/src/virtualenv/seed/embed/base_embed.py 
b/src/virtualenv/seed/embed/base_embed.py
-index 7d83cb6..94e5ed4 100644
---- a/src/virtualenv/seed/embed/base_embed.py
-+++ b/src/virtualenv/seed/embed/base_embed.py
-@@ -1,7 +1,9 @@
- from __future__ import annotations
- 
- from abc import ABC
-+from argparse import SUPPRESS
- from pathlib import Path
-+from warnings import warn
- 
- from virtualenv.seed.seeder import Seeder
- from virtualenv.seed.wheels import Version
-@@ -18,14 +20,21 @@ class BaseEmbed(Seeder, ABC):
- 
-         self.pip_version = options.pip
-         self.setuptools_version = options.setuptools
--        self.wheel_version = options.wheel
- 
-         self.no_pip = options.no_pip
-         self.no_setuptools = options.no_setuptools
--        self.no_wheel = options.no_wheel
-         self.app_data = options.app_data
-         self.periodic_update = not options.no_periodic_update
- 
-+        if options.no_wheel:
-+            warn(
-+                "The --no-wheel option is deprecated. "
-+                "It has no effect, wheel is no longer bundled in virtualenv. "
-+                "This option will be removed in pip 26.",
-+                DeprecationWarning,
-+                stacklevel=1,
-+            )
-+
-         if not self.distribution_to_versions():
-             self.enabled = False
- 
-@@ -34,7 +43,6 @@ class BaseEmbed(Seeder, ABC):
-         return {
-             "pip": Version.bundle,
-             "setuptools": Version.bundle,
--            "wheel": Version.bundle,
-         }
- 
-     def distribution_to_versions(self) -> dict[str, str]:
-@@ -71,7 +79,7 @@ class BaseEmbed(Seeder, ABC):
-             default=[],
-         )
-         for distribution, default in cls.distributions().items():
--            if interpreter.version_info[:2] >= (3, 12) and distribution in 
{"wheel", "setuptools"}:
-+            if interpreter.version_info[:2] >= (3, 12) and distribution == 
"setuptools":
-                 default = "none"  # noqa: PLW2901
-             parser.add_argument(
-                 f"--{distribution}",
-@@ -88,6 +96,13 @@ class BaseEmbed(Seeder, ABC):
-                 help=f"do not install {distribution}",
-                 default=False,
-             )
-+        # DEPRECATED: Remove in pip 26
-+        parser.add_argument(
-+            "--no-wheel",
-+            dest="no_wheel",
-+            action="store_true",
-+            help=SUPPRESS,
-+        )
-         parser.add_argument(
-             "--no-periodic-update",
-             dest="no_periodic_update",
-diff --git a/src/virtualenv/seed/wheels/embed/__init__.py 
b/src/virtualenv/seed/wheels/embed/__init__.py
-index adc9216..2426081 100644
---- a/src/virtualenv/seed/wheels/embed/__init__.py
-+++ b/src/virtualenv/seed/wheels/embed/__init__.py
-@@ -9,37 +9,30 @@ BUNDLE_SUPPORT = {
-     "3.8": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-75.3.2-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.9": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.10": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.11": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.12": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.13": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
-     "3.14": {
-         "pip": "pip-25.0.1-py3-none-any.whl",
-         "setuptools": "setuptools-78.1.0-py3-none-any.whl",
--        "wheel": "wheel-0.45.1-py3-none-any.whl",
-     },
- }
- MAX = "3.8"
-diff --git a/tests/unit/config/test___main__.py 
b/tests/unit/config/test___main__.py
-index fc6b3ee..b7c1850 100644
---- a/tests/unit/config/test___main__.py
-+++ b/tests/unit/config/test___main__.py
-@@ -64,7 +64,7 @@ def test_fail_with_traceback(raise_on_session_done, 
tmp_path, capsys):
- 
- @pytest.mark.usefixtures("session_app_data")
- def test_session_report_full(tmp_path: Path, capsys: 
pytest.CaptureFixture[str]) -> None:
--    run_with_catch([str(tmp_path), "--setuptools", "bundle", "--wheel", 
"bundle"])
-+    run_with_catch([str(tmp_path), "--setuptools", "bundle"])
-     out, err = capsys.readouterr()
-     assert not err
-     lines = out.splitlines()
-@@ -72,7 +72,7 @@ def test_session_report_full(tmp_path: Path, capsys: 
pytest.CaptureFixture[str])
-         r"created virtual environment .* in \d+ms",
-         r"  creator .*",
-         r"  seeder .*",
--        r"    added seed packages: .*pip==.*, setuptools==.*, wheel==.*",
-+        r"    added seed packages: .*pip==.*, setuptools==.*",
-         r"  activators .*",
-     ]
-     _match_regexes(lines, regexes)
-diff --git a/tests/unit/create/test_creator.py 
b/tests/unit/create/test_creator.py
-index ed1cb11..2b4b1c0 100644
---- a/tests/unit/create/test_creator.py
-+++ b/tests/unit/create/test_creator.py
-@@ -411,8 +411,6 @@ def test_create_distutils_cfg(creator, tmp_path, 
monkeypatch):
-             creator,
-             "--setuptools",
-             "bundle",
--            "--wheel",
--            "bundle",
-         ],
-     )
- 
-@@ -470,7 +468,7 @@ def list_files(path):
- def test_zip_importer_can_import_setuptools(tmp_path):
-     """We're patching the loaders so might fail on r/o loaders, such as 
zipimporter on CPython<3.8"""
-     result = cli_run(
--        [str(tmp_path / "venv"), "--activators", "", "--no-pip", 
"--no-wheel", "--copies", "--setuptools", "bundle"],
-+        [str(tmp_path / "venv"), "--activators", "", "--no-pip", "--copies", 
"--setuptools", "bundle"],
-     )
-     zip_path = tmp_path / "site-packages.zip"
-     with zipfile.ZipFile(str(zip_path), "w", zipfile.ZIP_DEFLATED) as 
zip_handler:
-diff --git a/tests/unit/seed/embed/test_base_embed.py 
b/tests/unit/seed/embed/test_base_embed.py
-index 255e031..73754a5 100644
---- a/tests/unit/seed/embed/test_base_embed.py
-+++ b/tests/unit/seed/embed/test_base_embed.py
-@@ -1,6 +1,7 @@
- from __future__ import annotations
- 
- import sys
-+import warnings
- from typing import TYPE_CHECKING
- 
- import pytest
-@@ -20,11 +21,21 @@ def test_download_cli_flag(args, download, tmp_path):
-     assert session.seeder.download is download
- 
- 
-+# DEPRECATED: Remove in pip 26
-+def test_download_deprecated_cli_flag(tmp_path):
-+    with warnings.catch_warnings(record=True) as w:
-+        warnings.simplefilter("always")
-+        session_via_cli(["--no-wheel", str(tmp_path)])
-+    assert len(w) == 1
-+    assert issubclass(w[-1].category, DeprecationWarning)
-+    assert str(w[-1].message) == (
-+        "The --no-wheel option is deprecated. "
-+        "It has no effect, wheel is no longer bundled in virtualenv. "
-+        "This option will be removed in pip 26."
-+    )
-+
-+
- def test_embed_wheel_versions(tmp_path: Path) -> None:
-     session = session_via_cli([str(tmp_path)])
--    expected = (
--        {"pip": "bundle"}
--        if sys.version_info[:2] >= (3, 12)
--        else {"pip": "bundle", "setuptools": "bundle", "wheel": "bundle"}
--    )
-+    expected = {"pip": "bundle"} if sys.version_info[:2] >= (3, 12) else 
{"pip": "bundle", "setuptools": "bundle"}
-     assert session.seeder.distribution_to_versions() == expected
-diff --git a/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py 
b/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
-index 2448d90..bfbb424 100644
---- a/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
-+++ b/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
-@@ -110,7 +110,7 @@ def test_seed_link_via_app_data(tmp_path, coverage_env, 
current_fastest, copies)
-     # Windows does not allow removing a executable while running it, so when 
uninstalling pip we need to do it via
-     # python -m pip
-     remove_cmd = [str(result.creator.exe), "-m", "pip"] + remove_cmd[1:]
--    process = Popen([*remove_cmd, "pip", "wheel"])
-+    process = Popen([*remove_cmd, "pip"])
-     _, __ = process.communicate()
-     assert not process.returncode
-     # pip is greedy here, removing all packages removes the site-package too
-@@ -208,13 +208,13 @@ def 
test_populated_read_only_cache_and_copied_app_data(tmp_path, current_fastest
- 
- 
- @pytest.mark.slow
--@pytest.mark.parametrize("pkg", ["pip", "setuptools", "wheel"])
-+@pytest.mark.parametrize("pkg", ["pip", "setuptools"])
- @pytest.mark.usefixtures("session_app_data", "current_fastest", 
"coverage_env")
- def test_base_bootstrap_link_via_app_data_no(tmp_path, pkg):
--    create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}", 
"--wheel", "bundle", "--setuptools", "bundle"]
-+    create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}", 
"--setuptools", "bundle"]
-     result = cli_run(create_cmd)
-     assert not (result.creator.purelib / pkg).exists()
--    for key in {"pip", "setuptools", "wheel"} - {pkg}:
-+    for key in {"pip", "setuptools"} - {pkg}:
-         assert (result.creator.purelib / key).exists()
- 
- 
-@@ -230,7 +230,7 @@ def test_app_data_parallel_fail(tmp_path: Path, mocker: 
MockerFixture) -> None:
-     exceptions = _run_parallel_threads(tmp_path)
-     assert len(exceptions) == 2
-     for exception in exceptions:
--        assert exception.startswith("failed to build image wheel 
because:\nTraceback")
-+        assert exception.startswith("failed to build image pip 
because:\nTraceback")
-         assert "RuntimeError" in exception, exception
- 
- 
-@@ -239,7 +239,7 @@ def _run_parallel_threads(tmp_path):
- 
-     def _run(name):
-         try:
--            cli_run(["--seeder", "app-data", str(tmp_path / name), 
"--no-pip", "--no-setuptools", "--wheel", "bundle"])
-+            cli_run(["--seeder", "app-data", str(tmp_path / name), 
"--no-setuptools"])
-         except Exception as exception:  # noqa: BLE001
-             as_str = str(exception)
-             exceptions.append(as_str)
-diff --git a/tests/unit/seed/embed/test_pip_invoke.py 
b/tests/unit/seed/embed/test_pip_invoke.py
-index d8c243e..97d4d33 100644
---- a/tests/unit/seed/embed/test_pip_invoke.py
-+++ b/tests/unit/seed/embed/test_pip_invoke.py
-@@ -13,7 +13,7 @@ from virtualenv.seed.wheels.embed import BUNDLE_FOLDER, 
BUNDLE_SUPPORT
- 
- 
- @pytest.mark.slow
--@pytest.mark.parametrize("no", ["pip", "setuptools", "wheel", ""])
-+@pytest.mark.parametrize("no", ["pip", "setuptools", ""])
- def test_base_bootstrap_via_pip_invoke(tmp_path, coverage_env, mocker, 
current_fastest, no):  # noqa: C901
-     extra_search_dir = tmp_path / "extra"
-     extra_search_dir.mkdir()
-@@ -49,7 +49,7 @@ def test_base_bootstrap_via_pip_invoke(tmp_path, 
coverage_env, mocker, current_f
- 
-     original = PipInvoke._execute  # noqa: SLF001
-     run = mocker.patch.object(PipInvoke, "_execute", side_effect=_execute)
--    versions = {"pip": "embed", "setuptools": "bundle", "wheel": 
new["wheel"].split("-")[1]}
-+    versions = {"pip": "embed", "setuptools": "bundle"}
- 
-     create_cmd = [
-         "--seeder",
-@@ -76,14 +76,13 @@ def test_base_bootstrap_via_pip_invoke(tmp_path, 
coverage_env, mocker, current_f
-     site_package = result.creator.purelib
-     pip = site_package / "pip"
-     setuptools = site_package / "setuptools"
--    wheel = site_package / "wheel"
-     files_post_first_create = list(site_package.iterdir())
- 
-     if no:
-         no_file = locals()[no]
-         assert no not in files_post_first_create
- 
--    for key in ("pip", "setuptools", "wheel"):
-+    for key in ("pip", "setuptools"):
-         if key == no:
-             continue
-         assert locals()[key] in files_post_first_create
-diff --git a/tests/unit/seed/wheels/test_periodic_update.py 
b/tests/unit/seed/wheels/test_periodic_update.py
-index 3b0529a..731252f 100644
---- a/tests/unit/seed/wheels/test_periodic_update.py
-+++ b/tests/unit/seed/wheels/test_periodic_update.py
-@@ -74,7 +74,7 @@ def test_manual_upgrade(session_app_data, caplog, mocker, 
for_py_version):
-         packages[args[1]["distribution"]].append(args[1]["for_py_version"])
-     packages = {key: sorted(value) for key, value in packages.items()}
-     versions = sorted(BUNDLE_SUPPORT.keys())
--    expected = {"setuptools": versions, "wheel": versions, "pip": versions}
-+    expected = {"setuptools": versions, "pip": versions}
-     assert packages == expected
- 
- 
-@@ -97,12 +97,9 @@ def test_pick_periodic_update(tmp_path, mocker, 
for_py_version):
-             "--activators",
-             "",
-             "--no-periodic-update",
--            "--no-wheel",
-             "--no-pip",
-             "--setuptools",
-             "bundle",
--            "--wheel",
--            "bundle",
-         ],
-     )
- 
diff -Nru python-virtualenv-20.30.0+ds/debian/patches/series 
python-virtualenv-20.31.2+ds/debian/patches/series
--- python-virtualenv-20.30.0+ds/debian/patches/series  2025-04-28 
19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/patches/series  2025-05-09 
15:08:14.000000000 +0200
@@ -2,4 +2,3 @@
 debian_update_for_available_wheels.patch
 disable-periodic-update.patch
 wheel-package-error
-no-wheel-whl
diff -Nru python-virtualenv-20.30.0+ds/debian/patches/wheel-package-error 
python-virtualenv-20.31.2+ds/debian/patches/wheel-package-error
--- python-virtualenv-20.30.0+ds/debian/patches/wheel-package-error     
2025-04-28 19:56:37.000000000 +0200
+++ python-virtualenv-20.31.2+ds/debian/patches/wheel-package-error     
2025-05-09 15:08:14.000000000 +0200
@@ -4,14 +4,14 @@
 
 Forwarded: not-needed
 ---
- src/virtualenv/seed/wheels/embed/__init__.py | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
+ src/virtualenv/seed/wheels/embed/__init__.py | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
 
 diff --git a/src/virtualenv/seed/wheels/embed/__init__.py 
b/src/virtualenv/seed/wheels/embed/__init__.py
-index 55362c7..adc9216 100644
+index 6c8180d..6ed9727 100644
 --- a/src/virtualenv/seed/wheels/embed/__init__.py
 +++ b/src/virtualenv/seed/wheels/embed/__init__.py
-@@ -67,6 +67,19 @@ BUNDLE_SUPPORT = 
list_available_wheels(BUNDLE_SUPPORT.keys())
+@@ -61,6 +61,20 @@ BUNDLE_SUPPORT = 
list_available_wheels(BUNDLE_SUPPORT.keys())
  
  
  def get_embed_wheel(distribution, for_py_version):
@@ -27,7 +27,8 @@
 +                '2' if for_py_version == '2.7' else '3',
 +                distribution,
 +            ))
++    # End Debian specific
 +
-     path = BUNDLE_FOLDER / (BUNDLE_SUPPORT.get(for_py_version, {}) or 
BUNDLE_SUPPORT[MAX]).get(distribution)
-     return Wheel.from_path(path)
- 
+     mapping = BUNDLE_SUPPORT.get(for_py_version, {}) or BUNDLE_SUPPORT[MAX]
+     wheel_file = mapping.get(distribution)
+     if wheel_file is None:
diff -Nru python-virtualenv-20.30.0+ds/PKG-INFO 
python-virtualenv-20.31.2+ds/PKG-INFO
--- python-virtualenv-20.30.0+ds/PKG-INFO       2020-02-02 01:00:00.000000000 
+0100
+++ python-virtualenv-20.31.2+ds/PKG-INFO       2020-02-02 01:00:00.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: virtualenv
-Version: 20.30.0
+Version: 20.31.2
 Summary: Virtual Python Environment builder
 Project-URL: Documentation, https://virtualenv.pypa.io
 Project-URL: Homepage, https://github.com/pypa/virtualenv
diff -Nru python-virtualenv-20.30.0+ds/src/virtualenv/config/cli/parser.py 
python-virtualenv-20.31.2+ds/src/virtualenv/config/cli/parser.py
--- python-virtualenv-20.30.0+ds/src/virtualenv/config/cli/parser.py    
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/src/virtualenv/config/cli/parser.py    
2020-02-02 01:00:00.000000000 +0100
@@ -107,8 +107,8 @@
 
 
 class HelpFormatter(ArgumentDefaultsHelpFormatter):
-    def __init__(self, prog) -> None:
-        super().__init__(prog, max_help_position=32, width=240)
+    def __init__(self, prog, **kwargs) -> None:
+        super().__init__(prog, max_help_position=32, width=240, **kwargs)
 
     def _get_help_string(self, action):
         text = super()._get_help_string(action)
diff -Nru python-virtualenv-20.30.0+ds/src/virtualenv/run/__init__.py 
python-virtualenv-20.31.2+ds/src/virtualenv/run/__init__.py
--- python-virtualenv-20.30.0+ds/src/virtualenv/run/__init__.py 2020-02-02 
01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/src/virtualenv/run/__init__.py 2020-02-02 
01:00:00.000000000 +0100
@@ -48,6 +48,7 @@
     env = os.environ if env is None else env
     parser, elements = build_parser(args, options, setup_logging, env)
     options = parser.parse_args(args)
+    options.py_version = parser._interpreter.version_info  # noqa: SLF001
     creator, seeder, activators = tuple(e.create(options) for e in elements)  
# create types
     return Session(
         options.verbosity,
diff -Nru python-virtualenv-20.30.0+ds/src/virtualenv/seed/embed/base_embed.py 
python-virtualenv-20.31.2+ds/src/virtualenv/seed/embed/base_embed.py
--- python-virtualenv-20.30.0+ds/src/virtualenv/seed/embed/base_embed.py        
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/src/virtualenv/seed/embed/base_embed.py        
2020-02-02 01:00:00.000000000 +0100
@@ -1,11 +1,14 @@
 from __future__ import annotations
 
+import logging
 from abc import ABC
+from argparse import SUPPRESS
 from pathlib import Path
 
 from virtualenv.seed.seeder import Seeder
 from virtualenv.seed.wheels import Version
 
+LOGGER = logging.getLogger(__name__)
 PERIODIC_UPDATE_ON_BY_DEFAULT = True
 
 
@@ -18,7 +21,11 @@
 
         self.pip_version = options.pip
         self.setuptools_version = options.setuptools
-        self.wheel_version = options.wheel
+
+        # wheel version needs special handling
+        # on Python > 3.8, the default is None (as in not used)
+        # so we can differentiate between explicit and implicit none
+        self.wheel_version = options.wheel or "none"
 
         self.no_pip = options.no_pip
         self.no_setuptools = options.no_setuptools
@@ -26,6 +33,15 @@
         self.app_data = options.app_data
         self.periodic_update = not options.no_periodic_update
 
+        if options.py_version[:2] >= (3, 9):
+            if options.wheel is not None or options.no_wheel:
+                LOGGER.warning(
+                    "The --no-wheel and --wheel options are deprecated. "
+                    "They have no effect for Python > 3.8 as wheel is no 
longer "
+                    "bundled in virtualenv.",
+                )
+            self.no_wheel = True
+
         if not self.distribution_to_versions():
             self.enabled = False
 
@@ -41,7 +57,7 @@
         return {
             distribution: getattr(self, f"{distribution}_version")
             for distribution in self.distributions()
-            if getattr(self, f"no_{distribution}") is False and getattr(self, 
f"{distribution}_version") != "none"
+            if getattr(self, f"no_{distribution}", None) is False and 
getattr(self, f"{distribution}_version") != "none"
         }
 
     @classmethod
@@ -71,21 +87,28 @@
             default=[],
         )
         for distribution, default in cls.distributions().items():
+            help_ = f"version of {distribution} to install as seed: embed, 
bundle, none or exact version"
             if interpreter.version_info[:2] >= (3, 12) and distribution in 
{"wheel", "setuptools"}:
                 default = "none"  # noqa: PLW2901
+            if interpreter.version_info[:2] >= (3, 9) and distribution == 
"wheel":
+                default = None  # noqa: PLW2901
+                help_ = SUPPRESS
             parser.add_argument(
                 f"--{distribution}",
                 dest=distribution,
                 metavar="version",
-                help=f"version of {distribution} to install as seed: embed, 
bundle, none or exact version",
+                help=help_,
                 default=default,
             )
         for distribution in cls.distributions():
+            help_ = f"do not install {distribution}"
+            if interpreter.version_info[:2] >= (3, 9) and distribution == 
"wheel":
+                help_ = SUPPRESS
             parser.add_argument(
                 f"--no-{distribution}",
                 dest=f"no_{distribution}",
                 action="store_true",
-                help=f"do not install {distribution}",
+                help=help_,
                 default=False,
             )
         parser.add_argument(
@@ -103,7 +126,7 @@
             result += f"extra_search_dir={', '.join(str(i) for i in 
self.extra_search_dir)},"
         result += f"download={self.download},"
         for distribution in self.distributions():
-            if getattr(self, f"no_{distribution}"):
+            if getattr(self, f"no_{distribution}", None):
                 continue
             version = getattr(self, f"{distribution}_version", None)
             if version == "none":
diff -Nru 
python-virtualenv-20.30.0+ds/src/virtualenv/seed/wheels/embed/__init__.py 
python-virtualenv-20.31.2+ds/src/virtualenv/seed/wheels/embed/__init__.py
--- python-virtualenv-20.30.0+ds/src/virtualenv/seed/wheels/embed/__init__.py   
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/src/virtualenv/seed/wheels/embed/__init__.py   
2020-02-02 01:00:00.000000000 +0100
@@ -12,41 +12,39 @@
         "wheel": "wheel-0.45.1-py3-none-any.whl",
     },
     "3.9": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
     "3.10": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
     "3.11": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
     "3.12": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
     "3.13": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
     "3.14": {
-        "pip": "pip-25.0.1-py3-none-any.whl",
-        "setuptools": "setuptools-78.1.0-py3-none-any.whl",
-        "wheel": "wheel-0.45.1-py3-none-any.whl",
+        "pip": "pip-25.1.1-py3-none-any.whl",
+        "setuptools": "setuptools-80.3.1-py3-none-any.whl",
     },
 }
 MAX = "3.8"
 
 
 def get_embed_wheel(distribution, for_py_version):
-    path = BUNDLE_FOLDER / (BUNDLE_SUPPORT.get(for_py_version, {}) or 
BUNDLE_SUPPORT[MAX]).get(distribution)
+    mapping = BUNDLE_SUPPORT.get(for_py_version, {}) or BUNDLE_SUPPORT[MAX]
+    wheel_file = mapping.get(distribution)
+    if wheel_file is None:
+        return None
+    path = BUNDLE_FOLDER / wheel_file
     return Wheel.from_path(path)
 
 
diff -Nru python-virtualenv-20.30.0+ds/src/virtualenv/version.py 
python-virtualenv-20.31.2+ds/src/virtualenv/version.py
--- python-virtualenv-20.30.0+ds/src/virtualenv/version.py      2020-02-02 
01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/src/virtualenv/version.py      2020-02-02 
01:00:00.000000000 +0100
@@ -17,5 +17,5 @@
 __version_tuple__: VERSION_TUPLE
 version_tuple: VERSION_TUPLE
 
-__version__ = version = '20.30.0'
-__version_tuple__ = version_tuple = (20, 30, 0)
+__version__ = version = '20.31.2'
+__version_tuple__ = version_tuple = (20, 31, 2)
diff -Nru python-virtualenv-20.30.0+ds/tasks/upgrade_wheels.py 
python-virtualenv-20.31.2+ds/tasks/upgrade_wheels.py
--- python-virtualenv-20.30.0+ds/tasks/upgrade_wheels.py        2020-02-02 
01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tasks/upgrade_wheels.py        2020-02-02 
01:00:00.000000000 +0100
@@ -38,7 +38,7 @@
     )
 
 
-def run():  # noqa: C901
+def run():  # noqa: C901, PLR0912
     old_batch = {i.name for i in DEST.iterdir() if i.suffix == ".whl"}
     with TemporaryDirectory() as temp:
         temp_path = Path(temp)
@@ -50,6 +50,8 @@
             into.mkdir()
             folders[into] = support_ver
             for package in BUNDLED:
+                if package == "wheel" and support >= (3, 9):
+                    continue
                 thread = Thread(target=download, args=(support_ver, str(into), 
package))
                 targets.append(thread)
                 thread.start()
@@ -90,8 +92,10 @@
                 if (folder / package).exists():
                     support_table[version].append(package)
         support_table = {k: OrderedDict((i.split("-")[0], i) for i in v) for 
k, v in support_table.items()}
-        bundle = ",".join(
-            f"{v!r}: {{ {','.join(f'{p!r}: {f!r}' for p, f in line.items())} 
}}" for v, line in support_table.items()
+        nl = "\n"
+        bundle = "".join(
+            f"\n        {v!r}: {{{nl}{''.join(f'            {p!r}: {f!r},{nl}' 
for p, f in line.items())}        }},"
+            for v, line in support_table.items()
         )
         msg = dedent(
             f"""
diff -Nru python-virtualenv-20.30.0+ds/tests/unit/config/test___main__.py 
python-virtualenv-20.31.2+ds/tests/unit/config/test___main__.py
--- python-virtualenv-20.30.0+ds/tests/unit/config/test___main__.py     
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/config/test___main__.py     
2020-02-02 01:00:00.000000000 +0100
@@ -64,7 +64,7 @@
 
 @pytest.mark.usefixtures("session_app_data")
 def test_session_report_full(tmp_path: Path, capsys: 
pytest.CaptureFixture[str]) -> None:
-    run_with_catch([str(tmp_path), "--setuptools", "bundle", "--wheel", 
"bundle"])
+    run_with_catch([str(tmp_path), "--setuptools", "bundle"])
     out, err = capsys.readouterr()
     assert not err
     lines = out.splitlines()
@@ -72,7 +72,7 @@
         r"created virtual environment .* in \d+ms",
         r"  creator .*",
         r"  seeder .*",
-        r"    added seed packages: .*pip==.*, setuptools==.*, wheel==.*",
+        r"    added seed packages: .*pip==.*, setuptools==.*",
         r"  activators .*",
     ]
     _match_regexes(lines, regexes)
diff -Nru python-virtualenv-20.30.0+ds/tests/unit/create/test_creator.py 
python-virtualenv-20.31.2+ds/tests/unit/create/test_creator.py
--- python-virtualenv-20.30.0+ds/tests/unit/create/test_creator.py      
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/create/test_creator.py      
2020-02-02 01:00:00.000000000 +0100
@@ -411,8 +411,6 @@
             creator,
             "--setuptools",
             "bundle",
-            "--wheel",
-            "bundle",
         ],
     )
 
diff -Nru python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_base_embed.py 
python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_base_embed.py
--- python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_base_embed.py       
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_base_embed.py       
2020-02-02 01:00:00.000000000 +0100
@@ -20,11 +20,46 @@
     assert session.seeder.download is download
 
 
+@pytest.mark.skipif(sys.version_info[:2] == (3, 8), reason="We still bundle 
wheel for Python 3.8")
+@pytest.mark.parametrize("flag", ["--no-wheel", "--wheel=none", 
"--wheel=embed", "--wheel=bundle"])
+def test_wheel_cli_flags_do_nothing(tmp_path, flag):
+    session = session_via_cli([flag, str(tmp_path)])
+    if sys.version_info[:2] >= (3, 12):
+        expected = {"pip": "bundle"}
+    else:
+        expected = {"pip": "bundle", "setuptools": "bundle"}
+    assert session.seeder.distribution_to_versions() == expected
+
+
+@pytest.mark.skipif(sys.version_info[:2] == (3, 8), reason="We still bundle 
wheel for Python 3.8")
+@pytest.mark.parametrize("flag", ["--no-wheel", "--wheel=none", 
"--wheel=embed", "--wheel=bundle"])
+def test_wheel_cli_flags_warn(tmp_path, flag, capsys):
+    session_via_cli([flag, str(tmp_path)])
+    out, err = capsys.readouterr()
+    assert "The --no-wheel and --wheel options are deprecated." in out + err
+
+
+@pytest.mark.skipif(sys.version_info[:2] == (3, 8), reason="We still bundle 
wheel for Python 3.8")
+def test_unused_wheel_cli_flags_dont_warn(tmp_path, capsys):
+    session_via_cli([str(tmp_path)])
+    out, err = capsys.readouterr()
+    assert "The --no-wheel and --wheel options are deprecated." not in out + 
err
+
+
+@pytest.mark.skipif(sys.version_info[:2] != (3, 8), reason="We only bundle 
wheel for Python 3.8")
+@pytest.mark.parametrize("flag", ["--no-wheel", "--wheel=none", 
"--wheel=embed", "--wheel=bundle"])
+def test_wheel_cli_flags_dont_warn_on_38(tmp_path, flag, capsys):
+    session_via_cli([flag, str(tmp_path)])
+    out, err = capsys.readouterr()
+    assert "The --no-wheel and --wheel options are deprecated." not in out + 
err
+
+
 def test_embed_wheel_versions(tmp_path: Path) -> None:
     session = session_via_cli([str(tmp_path)])
-    expected = (
-        {"pip": "bundle"}
-        if sys.version_info[:2] >= (3, 12)
-        else {"pip": "bundle", "setuptools": "bundle", "wheel": "bundle"}
-    )
+    if sys.version_info[:2] >= (3, 12):
+        expected = {"pip": "bundle"}
+    elif sys.version_info[:2] >= (3, 9):
+        expected = {"pip": "bundle", "setuptools": "bundle"}
+    else:
+        expected = {"pip": "bundle", "setuptools": "bundle", "wheel": "bundle"}
     assert session.seeder.distribution_to_versions() == expected
diff -Nru 
python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
 
python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
--- 
python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
      2020-02-02 01:00:00.000000000 +0100
+++ 
python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_bootstrap_link_via_app_data.py
      2020-02-02 01:00:00.000000000 +0100
@@ -25,7 +25,7 @@
 
 @pytest.mark.slow
 @pytest.mark.parametrize("copies", [False, True] if fs_supports_symlink() else 
[True])
-def test_seed_link_via_app_data(tmp_path, coverage_env, current_fastest, 
copies):
+def test_seed_link_via_app_data(tmp_path, coverage_env, current_fastest, 
copies, for_py_version):  # noqa: PLR0915
     current = PythonInfo.current_system()
     bundle_ver = BUNDLE_SUPPORT[current.version_release_str]
     create_cmd = [
@@ -45,6 +45,8 @@
         current_fastest,
         "-vv",
     ]
+    if for_py_version == "3.8":
+        create_cmd += ["--wheel", bundle_ver["wheel"].split("-")[1]]
     if not copies:
         create_cmd.append("--symlink-app-data")
     result = cli_run(create_cmd)
@@ -109,7 +111,7 @@
 
     # Windows does not allow removing a executable while running it, so when 
uninstalling pip we need to do it via
     # python -m pip
-    remove_cmd = [str(result.creator.exe), "-m", "pip"] + remove_cmd[1:]
+    remove_cmd = [str(result.creator.exe), "-m", "pip", *remove_cmd[1:]]
     process = Popen([*remove_cmd, "pip", "wheel"])
     _, __ = process.communicate()
     assert not process.returncode
@@ -210,11 +212,18 @@
 @pytest.mark.slow
 @pytest.mark.parametrize("pkg", ["pip", "setuptools", "wheel"])
 @pytest.mark.usefixtures("session_app_data", "current_fastest", "coverage_env")
-def test_base_bootstrap_link_via_app_data_no(tmp_path, pkg):
-    create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}", 
"--wheel", "bundle", "--setuptools", "bundle"]
+def test_base_bootstrap_link_via_app_data_no(tmp_path, pkg, for_py_version):
+    if for_py_version != "3.8" and pkg == "wheel":
+        msg = "wheel isn't installed on Python > 3.8"
+        raise pytest.skip(msg)
+    create_cmd = [str(tmp_path), "--seeder", "app-data", f"--no-{pkg}", 
"--setuptools", "bundle"]
+    if for_py_version == "3.8":
+        create_cmd += ["--wheel", "bundle"]
     result = cli_run(create_cmd)
     assert not (result.creator.purelib / pkg).exists()
     for key in {"pip", "setuptools", "wheel"} - {pkg}:
+        if for_py_version != "3.8" and key == "wheel":
+            continue
         assert (result.creator.purelib / key).exists()
 
 
@@ -230,7 +239,7 @@
     exceptions = _run_parallel_threads(tmp_path)
     assert len(exceptions) == 2
     for exception in exceptions:
-        assert exception.startswith("failed to build image wheel 
because:\nTraceback")
+        assert exception.startswith("failed to build image pip 
because:\nTraceback")
         assert "RuntimeError" in exception, exception
 
 
@@ -239,7 +248,10 @@
 
     def _run(name):
         try:
-            cli_run(["--seeder", "app-data", str(tmp_path / name), "--no-pip", 
"--no-setuptools", "--wheel", "bundle"])
+            cmd = ["--seeder", "app-data", str(tmp_path / name), 
"--no-setuptools"]
+            if sys.version_info[:2] == (3, 8):
+                cmd.append("--no-wheel")
+            cli_run(cmd)
         except Exception as exception:  # noqa: BLE001
             as_str = str(exception)
             exceptions.append(as_str)
diff -Nru python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_pip_invoke.py 
python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_pip_invoke.py
--- python-virtualenv-20.30.0+ds/tests/unit/seed/embed/test_pip_invoke.py       
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/seed/embed/test_pip_invoke.py       
2020-02-02 01:00:00.000000000 +0100
@@ -49,7 +49,9 @@
 
     original = PipInvoke._execute  # noqa: SLF001
     run = mocker.patch.object(PipInvoke, "_execute", side_effect=_execute)
-    versions = {"pip": "embed", "setuptools": "bundle", "wheel": 
new["wheel"].split("-")[1]}
+    versions = {"pip": "embed", "setuptools": "bundle"}
+    if sys.version_info[:2] == (3, 8):
+        versions["wheel"] = new["wheel"].split("-")[1]
 
     create_cmd = [
         "--seeder",
@@ -86,4 +88,6 @@
     for key in ("pip", "setuptools", "wheel"):
         if key == no:
             continue
+        if sys.version_info[:2] >= (3, 9) and key == "wheel":
+            continue
         assert locals()[key] in files_post_first_create
diff -Nru 
python-virtualenv-20.30.0+ds/tests/unit/seed/wheels/test_periodic_update.py 
python-virtualenv-20.31.2+ds/tests/unit/seed/wheels/test_periodic_update.py
--- python-virtualenv-20.30.0+ds/tests/unit/seed/wheels/test_periodic_update.py 
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/seed/wheels/test_periodic_update.py 
2020-02-02 01:00:00.000000000 +0100
@@ -74,7 +74,7 @@
         packages[args[1]["distribution"]].append(args[1]["for_py_version"])
     packages = {key: sorted(value) for key, value in packages.items()}
     versions = sorted(BUNDLE_SUPPORT.keys())
-    expected = {"setuptools": versions, "wheel": versions, "pip": versions}
+    expected = {"setuptools": versions, "wheel": ["3.8"], "pip": versions}
     assert packages == expected
 
 
@@ -101,8 +101,6 @@
             "--no-pip",
             "--setuptools",
             "bundle",
-            "--wheel",
-            "bundle",
         ],
     )
 
diff -Nru 
python-virtualenv-20.30.0+ds/tests/unit/seed/wheels/test_wheels_util.py 
python-virtualenv-20.31.2+ds/tests/unit/seed/wheels/test_wheels_util.py
--- python-virtualenv-20.30.0+ds/tests/unit/seed/wheels/test_wheels_util.py     
2020-02-02 01:00:00.000000000 +0100
+++ python-virtualenv-20.31.2+ds/tests/unit/seed/wheels/test_wheels_util.py     
2020-02-02 01:00:00.000000000 +0100
@@ -29,3 +29,8 @@
 def test_wheel_repr():
     wheel = get_embed_wheel("setuptools", MAX)
     assert str(wheel.path) in repr(wheel)
+
+
+def test_unknown_distribution():
+    wheel = get_embed_wheel("unknown", MAX)
+    assert wheel is None

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply via email to