summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzu-ping Chung <uranusjr@gmail.com>2020-12-04 23:39:32 +0800
committerTzu-ping Chung <uranusjr@gmail.com>2020-12-04 23:46:25 +0800
commitffb3d1bc761d74583b5c59275bfda997afeebc03 (patch)
treead0164eaff2374f23b171fffe9e98e99c89cc5c1
parentab7ff0a1b50dadfe8da1fe44ee115440b844426c (diff)
downloadpip-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.rst2
-rw-r--r--src/pip/_internal/resolution/resolvelib/factory.py11
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,