diff options
author | Tzu-ping Chung <uranusjr@gmail.com> | 2020-12-04 23:39:32 +0800 |
---|---|---|
committer | Tzu-ping Chung <uranusjr@gmail.com> | 2020-12-04 23:46:25 +0800 |
commit | ffb3d1bc761d74583b5c59275bfda997afeebc03 (patch) | |
tree | ad0164eaff2374f23b171fffe9e98e99c89cc5c1 | |
parent | ab7ff0a1b50dadfe8da1fe44ee115440b844426c (diff) | |
download | pip-ffb3d1bc761d74583b5c59275bfda997afeebc03.tar.gz |
Correctly implement yanking logic
Do not return yanked versions from an index, unless the version
range can only be satisfied by yanked candidates.
-rw-r--r-- | news/9203.bugfix.rst | 2 | ||||
-rw-r--r-- | src/pip/_internal/resolution/resolvelib/factory.py | 11 |
2 files changed, 12 insertions, 1 deletions
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, |