diff --git a/news/11123.bugfix.rst b/news/11123.bugfix.rst new file mode 100644 index 000000000..17d3de27e --- /dev/null +++ b/news/11123.bugfix.rst @@ -0,0 +1,3 @@ +Allow using a pre-release version to satisfy a build requirement. This helps +manually populated build environments to more accurately detect build-time +requirement conflicts. diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 7783c9acd..9bf317547 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -185,7 +185,7 @@ class BuildEnvironment: installed_req_str = f"{req.name}=={dist.version}" else: installed_req_str = f"{req.name}==={dist.version}" - if dist.version not in req.specifier: + if not req.specifier.contains(dist.version, prereleases=True): conflicting.add((installed_req_str, req_str)) # FIXME: Consider direct URL? return conflicting, missing diff --git a/tests/functional/test_pep517.py b/tests/functional/test_pep517.py index cae3040ab..bf5f58fbb 100644 --- a/tests/functional/test_pep517.py +++ b/tests/functional/test_pep517.py @@ -5,7 +5,13 @@ import tomli_w from pip._internal.build_env import BuildEnvironment from pip._internal.req import InstallRequirement -from tests.lib import PipTestEnvironment, TestData, make_test_finder, path_to_url +from tests.lib import ( + PipTestEnvironment, + TestData, + create_basic_wheel_for_package, + make_test_finder, + path_to_url, +) from tests.lib.path import Path @@ -210,6 +216,25 @@ def test_validate_conflicting_pep517_backend_requirements( assert result.returncode != 0 and msg in result.stderr, str(result) +def test_pep517_backend_requirements_satisfied_by_prerelease( + script: PipTestEnvironment, + data: TestData, +) -> None: + create_basic_wheel_for_package(script, "myreq", "1.0a1") + script.pip("install", "myreq==1.0a1", "--no-index", "-f", script.scratch_path) + script.pip("install", "test_backend", "--no-index", "-f", data.backends) + + project_dir = make_project( + script.temp_path, + requires=["test_backend", "myreq"], + backend="test_backend", + ) + project_dir.joinpath("backend_reqs.txt").write_text("myreq") + + result = script.pip("install", "--no-index", "--no-build-isolation", project_dir) + assert "Installing backend dependencies:" not in result.stdout + + def test_pep517_backend_requirements_already_satisfied( script: PipTestEnvironment, tmpdir: Path, data: TestData ) -> None: