From d4d7853d9ab566c4b50a3221843a1e1d6f88225d Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 25 Jan 2024 10:01:11 +0800 Subject: [PATCH] fix: unable to force install specific version with pdm Fixes #2586 Signed-off-by: Frost Ming --- news/2586.bugfix.md | 1 + src/pdm/resolver/providers.py | 4 +++- tests/resolver/test_resolve.py | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 news/2586.bugfix.md diff --git a/news/2586.bugfix.md b/news/2586.bugfix.md new file mode 100644 index 0000000000..01b324ba2c --- /dev/null +++ b/news/2586.bugfix.md @@ -0,0 +1 @@ +Unable to force override a package if the package is required with extras. diff --git a/src/pdm/resolver/providers.py b/src/pdm/resolver/providers.py index a14dca2638..9684328f50 100644 --- a/src/pdm/resolver/providers.py +++ b/src/pdm/resolver/providers.py @@ -218,6 +218,8 @@ def matches_gen() -> Iterator[Candidate]: return (c for c in candidates if c not in incompat) elif identifier in self.overrides: return iter(self.get_override_candidates(identifier)) + elif (name := strip_extras(identifier)[0]) in self.overrides: + return iter(self.get_override_candidates(name)) reqs = sorted(requirements[identifier], key=self.requirement_preference) if not reqs: return iter(()) @@ -250,7 +252,7 @@ def _compare_file_reqs(self, req1: FileRequirement, req2: FileRequirement) -> bo def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool: if isinstance(requirement, PythonRequirement): return is_python_satisfied_by(requirement, candidate) - elif candidate.identify() in self.overrides: + elif (name := candidate.identify()) in self.overrides or strip_extras(name)[0] in self.overrides: return True if not requirement.is_named: if candidate.req.is_named: diff --git a/tests/resolver/test_resolve.py b/tests/resolver/test_resolve.py index b38653c14e..f411dcb95d 100644 --- a/tests/resolver/test_resolve.py +++ b/tests/resolver/test_resolve.py @@ -195,11 +195,15 @@ def test_resolve_conflicting_dependencies_with_overrides(project, resolve, repos repository.add_dependencies("foo", "0.1.0", ["hoho>=2.0"]) repository.add_candidate("bar", "0.1.0") repository.add_dependencies("bar", "0.1.0", ["hoho~=1.1"]) + repository.add_candidate("baz", "0.1.0") + repository.add_dependencies("baz", "0.1.0", ["hoho[extra]~=1.1"]) repository.add_candidate("hoho", "2.1") repository.add_candidate("hoho", "1.5") project.pyproject.settings["resolution"] = {"overrides": {"hoho": overrides}} result = resolve(["foo", "bar"]) assert result["hoho"].version == "2.1" + result = resolve(["foo", "baz"]) + assert result["hoho"].version == "2.1" def test_resolve_no_available_versions(resolve, repository):