From be2c6bcb6d8bac094242ea672e6780b7fc6c964a Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 12 Jan 2026 12:46:28 -0500 Subject: [PATCH 01/11] ci: add downstream testing Signed-off-by: Henry Schreiner --- .github/workflows/test.yml | 18 ++++++++++++++++++ noxfile.py | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5ab27ced..5570929a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,6 +50,24 @@ jobs: - name: Run nox run: pipx run nox -s tests --force-python=${{ matrix.python_version }} + downstream: + name: Downstream + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: false + + - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 + name: Install Python 3.14 + with: + python-version: "3.14" + cache: "pip" + + - name: Run nox + run: pipx run nox -s downstream + pass: name: All pass if: always() diff --git a/noxfile.py b/noxfile.py index a8adfb51..be6ca1c4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -76,6 +76,30 @@ def tests(session: nox.Session) -> None: ) +PROJECTS = {"packaging_legacy": "https://github.com/di/packaging_legacy.git"} + + +@nox.parametrize("project", list(PROJECTS)) +@nox.session(default=False) +def downstream(session: nox.Session, project: str) -> None: + session.install("-e.", "pip") + + tmp_dir = Path(session.create_tmp()) + session.chdir(tmp_dir) + + shutil.rmtree(project, ignore_errors=True) + session.run("git", "clone", PROJECTS[project], external=True) + session.chdir(project) + + if project == "packaging_legacy": + session.install("-r", "tests/requirements.txt") + session.install("-e.") + session.run("pip", "list") + session.run("pytest") + else: + session.error("Unknown package") + + @nox.session(python="3.10") def lint(session: nox.Session) -> None: """ From 7d62d8523cf18bc1a7b4bc11419889b301974127 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 Jan 2026 10:33:01 -0500 Subject: [PATCH 02/11] fix: use tarfile instead Signed-off-by: Henry Schreiner --- noxfile.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index be6ca1c4..a6016542 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,14 +8,17 @@ import datetime import difflib import glob +import io import os import re import shutil import subprocess import sys +import tarfile import tempfile import textwrap import time +import urllib.request from pathlib import Path from typing import IO, Generator @@ -76,7 +79,9 @@ def tests(session: nox.Session) -> None: ) -PROJECTS = {"packaging_legacy": "https://github.com/di/packaging_legacy.git"} +PROJECTS = { + "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz" +} @nox.parametrize("project", list(PROJECTS)) @@ -88,8 +93,12 @@ def downstream(session: nox.Session, project: str) -> None: session.chdir(tmp_dir) shutil.rmtree(project, ignore_errors=True) - session.run("git", "clone", PROJECTS[project], external=True) - session.chdir(project) + with urllib.request.urlopen(PROJECTS[project]) as resp: + data = resp.read() + with tarfile.open(fileobj=io.BytesIO(data), mode="r:gz") as tf: + tf.extractall(project) + (inner_dir,) = Path(project).iterdir() + session.chdir(inner_dir) if project == "packaging_legacy": session.install("-r", "tests/requirements.txt") From 1b9cdfe82429c0f514b3a4b36c5cc38abb3b3ceb Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 Jan 2026 10:55:28 -0500 Subject: [PATCH 03/11] tests: add build to downstream testing Signed-off-by: Henry Schreiner --- noxfile.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index a6016542..82375888 100644 --- a/noxfile.py +++ b/noxfile.py @@ -80,14 +80,15 @@ def tests(session: nox.Session) -> None: PROJECTS = { - "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz" + "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz", + "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", } @nox.parametrize("project", list(PROJECTS)) @nox.session(default=False) def downstream(session: nox.Session, project: str) -> None: - session.install("-e.", "pip") + session.install("-e.") tmp_dir = Path(session.create_tmp()) session.chdir(tmp_dir) @@ -100,10 +101,15 @@ def downstream(session: nox.Session, project: str) -> None: (inner_dir,) = Path(project).iterdir() session.chdir(inner_dir) + pip_cmd = ["uv", "pip"] if session.venv_backend == "uv" else ["pip"] + if project == "packaging_legacy": session.install("-r", "tests/requirements.txt") session.install("-e.") - session.run("pip", "list") + session.run(*pip_cmd, "list") + session.run("pytest") + elif project == "build": + session.install("-e.", "--group=test") session.run("pytest") else: session.error("Unknown package") From 2bf2437c338f91f110671af40ddde267a26f4546 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 Jan 2026 10:58:48 -0500 Subject: [PATCH 04/11] tests: add pyproject-metadata to downstream testing Signed-off-by: Henry Schreiner --- noxfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 82375888..370b9d25 100644 --- a/noxfile.py +++ b/noxfile.py @@ -82,6 +82,7 @@ def tests(session: nox.Session) -> None: PROJECTS = { "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz", "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", + "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.10.0.tar.gz", } @@ -108,8 +109,10 @@ def downstream(session: nox.Session, project: str) -> None: session.install("-e.") session.run(*pip_cmd, "list") session.run("pytest") - elif project == "build": + elif project in {"build", "pyproject_metadata"}: session.install("-e.", "--group=test") + if project != "build": + session.run(*pip_cmd, "list") session.run("pytest") else: session.error("Unknown package") From 0a998866351fb4435af3ffad8cb906dc7ef6566a Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 Jan 2026 12:11:00 -0500 Subject: [PATCH 05/11] tests: fix strip force color Signed-off-by: Henry Schreiner --- noxfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/noxfile.py b/noxfile.py index 370b9d25..e5aa08d9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -89,6 +89,7 @@ def tests(session: nox.Session) -> None: @nox.parametrize("project", list(PROJECTS)) @nox.session(default=False) def downstream(session: nox.Session, project: str) -> None: + env = {"FORCE_COLOR": None} session.install("-e.") tmp_dir = Path(session.create_tmp()) @@ -108,12 +109,12 @@ def downstream(session: nox.Session, project: str) -> None: session.install("-r", "tests/requirements.txt") session.install("-e.") session.run(*pip_cmd, "list") - session.run("pytest") + session.run("pytest", env=env) elif project in {"build", "pyproject_metadata"}: session.install("-e.", "--group=test") if project != "build": session.run(*pip_cmd, "list") - session.run("pytest") + session.run("pytest", env=env) else: session.error("Unknown package") From 5e9a36f32ed10c0ab7793cf2102e57e90696804b Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 15 Jan 2026 12:18:36 -0500 Subject: [PATCH 06/11] ci: split up downstream projects Signed-off-by: Henry Schreiner --- .github/workflows/test.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5570929a..c2788bdb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,6 +53,10 @@ jobs: downstream: name: Downstream runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + project: [packaging_legacy, build, pyproject_metadata] steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 @@ -66,7 +70,7 @@ jobs: cache: "pip" - name: Run nox - run: pipx run nox -s downstream + run: pipx run nox -s 'downstream(project="${{ matrix.project }}")' pass: name: All pass From 354423352769eed775f17c9507763c54e4801634 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 21 Jan 2026 14:23:44 -0500 Subject: [PATCH 07/11] chore: add setuptools Signed-off-by: Henry Schreiner --- .github/workflows/test.yml | 4 ++-- noxfile.py | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2788bdb..62212688 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,12 +51,12 @@ jobs: run: pipx run nox -s tests --force-python=${{ matrix.python_version }} downstream: - name: Downstream + name: Downstream ${{ matrix.project }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: - project: [packaging_legacy, build, pyproject_metadata] + project: [packaging_legacy, build, pyproject_metadata, setuptools] steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 diff --git a/noxfile.py b/noxfile.py index e5aa08d9..1361d169 100644 --- a/noxfile.py +++ b/noxfile.py @@ -82,6 +82,7 @@ def tests(session: nox.Session) -> None: PROJECTS = { "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz", "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", + "setuptools": "https://github.com/pypa/setuptools/archive/refs/tags/v80.10.1.tar.gz", "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.10.0.tar.gz", } @@ -89,6 +90,7 @@ def tests(session: nox.Session) -> None: @nox.parametrize("project", list(PROJECTS)) @nox.session(default=False) def downstream(session: nox.Session, project: str) -> None: + pkg_dir = Path.cwd() / "src/packaging" env = {"FORCE_COLOR": None} session.install("-e.") @@ -109,12 +111,19 @@ def downstream(session: nox.Session, project: str) -> None: session.install("-r", "tests/requirements.txt") session.install("-e.") session.run(*pip_cmd, "list") - session.run("pytest", env=env) + session.run("pytest", *session.posargs, env=env) elif project in {"build", "pyproject_metadata"}: session.install("-e.", "--group=test") if project != "build": session.run(*pip_cmd, "list") - session.run("pytest", env=env) + session.run("pytest", *session.posargs, env=env) + elif project == "setuptools": + session.install("-e.[test,cover]") + session.run(*pip_cmd, "list") + repl_dir = "setuptools/_vendor/packaging" + shutil.rmtree(repl_dir) + shutil.copytree(pkg_dir, repl_dir) + session.run("pytest", *session.posargs, env=env) else: session.error("Unknown package") From 92266158b545c86faef1355a9d321c7337c94f51 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 21 Jan 2026 19:56:26 -0500 Subject: [PATCH 08/11] ci: add pip Signed-off-by: Henry Schreiner --- .github/workflows/test.yml | 2 +- noxfile.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 62212688..5998986f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,7 +56,7 @@ jobs: strategy: fail-fast: false matrix: - project: [packaging_legacy, build, pyproject_metadata, setuptools] + project: [packaging_legacy, build, pyproject_metadata, setuptools, pip] steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 diff --git a/noxfile.py b/noxfile.py index 1361d169..c26e789f 100644 --- a/noxfile.py +++ b/noxfile.py @@ -84,6 +84,7 @@ def tests(session: nox.Session) -> None: "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", "setuptools": "https://github.com/pypa/setuptools/archive/refs/tags/v80.10.1.tar.gz", "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.10.0.tar.gz", + "pip": "https://github.com/pypa/pip/archive/refs/tags/25.3.tar.gz", } @@ -124,6 +125,21 @@ def downstream(session: nox.Session, project: str) -> None: shutil.rmtree(repl_dir) shutil.copytree(pkg_dir, repl_dir) session.run("pytest", *session.posargs, env=env) + elif project == "pip": + session.install("-e.", "--group=test") + session.run( + "pip", + "wheel", + "-w", + "tests/data/common_wheels", + "--group", + "test-common-wheels", + ) + session.run(*pip_cmd, "list") + repl_dir = "src/pip/_vendor/packaging" + shutil.rmtree(repl_dir) + shutil.copytree(pkg_dir, repl_dir) + session.run("pytest", "tests/unit", "--numprocesses=auto", *session.posargs) else: session.error("Unknown package") From c453e52a39f5a1a6585c8563477e0bac16f4913c Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 23 Jan 2026 12:21:35 -0500 Subject: [PATCH 09/11] chore: use a newer pip Signed-off-by: Henry Schreiner --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index c26e789f..c8538ed0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -84,7 +84,7 @@ def tests(session: nox.Session) -> None: "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", "setuptools": "https://github.com/pypa/setuptools/archive/refs/tags/v80.10.1.tar.gz", "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.10.0.tar.gz", - "pip": "https://github.com/pypa/pip/archive/refs/tags/25.3.tar.gz", + "pip": "https://github.com/pypa/pip/archive/200251ab8df071b6c0a83504c29db7871a29b8c9.tar.gz", } From 4f28af06fc6934804312bcf4613c5fbf670716f5 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 12 Feb 2026 09:46:54 -0500 Subject: [PATCH 10/11] tests: update releases Signed-off-by: Henry Schreiner --- noxfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/noxfile.py b/noxfile.py index c8538ed0..19ce26d6 100644 --- a/noxfile.py +++ b/noxfile.py @@ -82,9 +82,9 @@ def tests(session: nox.Session) -> None: PROJECTS = { "packaging_legacy": "https://github.com/di/packaging_legacy/archive/refs/tags/23.0.post0.tar.gz", "build": "https://github.com/pypa/build/archive/refs/tags/1.4.0.tar.gz", - "setuptools": "https://github.com/pypa/setuptools/archive/refs/tags/v80.10.1.tar.gz", - "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.10.0.tar.gz", - "pip": "https://github.com/pypa/pip/archive/200251ab8df071b6c0a83504c29db7871a29b8c9.tar.gz", + "setuptools": "https://github.com/pypa/setuptools/archive/refs/tags/v82.0.0.tar.gz", + "pyproject_metadata": "https://github.com/pypa/pyproject-metadata/archive/refs/tags/0.11.0.tar.gz", + "pip": "https://github.com/pypa/pip/archive/refs/tags/26.0.1.tar.gz", } From b67d3d94f7faeccab405a007d5552be122bb38f5 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 12 Feb 2026 10:07:39 -0500 Subject: [PATCH 11/11] tests: skip pip svn test Signed-off-by: Henry Schreiner --- noxfile.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 19ce26d6..c889799e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -139,7 +139,14 @@ def downstream(session: nox.Session, project: str) -> None: repl_dir = "src/pip/_vendor/packaging" shutil.rmtree(repl_dir) shutil.copytree(pkg_dir, repl_dir) - session.run("pytest", "tests/unit", "--numprocesses=auto", *session.posargs) + session.run( + "pytest", + "tests/unit", + "--numprocesses=auto", + "-k", + "not test_ensure_svn_available", + *session.posargs, + ) else: session.error("Unknown package")