diff --git a/news/9203.bugfix.rst b/news/9203.bugfix.rst new file mode 100644 index 000000000..29b39d66c --- /dev/null +++ b/news/9203.bugfix.rst @@ -0,0 +1,2 @@ +New resolver: Correctly implement PEP 592. Do not return yanked versions from +an index, unless the version range can only be satisfied by yanked candidates. diff --git a/src/pip/_internal/resolution/resolvelib/factory.py b/src/pip/_internal/resolution/resolvelib/factory.py index f4177d981..c723d343b 100644 --- a/src/pip/_internal/resolution/resolvelib/factory.py +++ b/src/pip/_internal/resolution/resolvelib/factory.py @@ -193,8 +193,17 @@ class Factory(object): specifier=specifier, hashes=hashes, ) + icans = list(result.iter_applicable()) + + # PEP 592: Yanked releases must be ignored unless only yanked + # releases can satisfy the version range. So if this is false, + # all yanked icans need to be skipped. + all_yanked = all(ican.link.is_yanked for ican in icans) + # PackageFinder returns earlier versions first, so we reverse. - for ican in reversed(list(result.iter_applicable())): + for ican in reversed(icans): + if not all_yanked and ican.link.is_yanked: + continue yield self._make_candidate_from_link( link=ican.link, extras=extras,