Commit 4d76babf by David Hotham Committed by Arun Babu Neelicattu

don't reuse the same incompatibility repeatedly

parent 6b55341c
...@@ -55,6 +55,7 @@ class VersionSolver: ...@@ -55,6 +55,7 @@ class VersionSolver:
self._use_latest = use_latest self._use_latest = use_latest
self._incompatibilities: dict[str, list[Incompatibility]] = {} self._incompatibilities: dict[str, list[Incompatibility]] = {}
self._contradicted_incompatibilities: set[Incompatibility] = set()
self._solution = PartialSolution() self._solution = PartialSolution()
@property @property
...@@ -103,6 +104,9 @@ class VersionSolver: ...@@ -103,6 +104,9 @@ class VersionSolver:
# we can derive stronger assignments sooner and more eagerly find # we can derive stronger assignments sooner and more eagerly find
# conflicts. # conflicts.
for incompatibility in reversed(self._incompatibilities[package]): for incompatibility in reversed(self._incompatibilities[package]):
if incompatibility in self._contradicted_incompatibilities:
continue
result = self._propagate_incompatibility(incompatibility) result = self._propagate_incompatibility(incompatibility)
if result is _conflict: if result is _conflict:
...@@ -149,6 +153,7 @@ class VersionSolver: ...@@ -149,6 +153,7 @@ class VersionSolver:
# If term is already contradicted by _solution, then # If term is already contradicted by _solution, then
# incompatibility is contradicted as well and there's nothing new we # incompatibility is contradicted as well and there's nothing new we
# can deduce from it. # can deduce from it.
self._contradicted_incompatibilities.add(incompatibility)
return None return None
elif relation == SetRelation.OVERLAPPING: elif relation == SetRelation.OVERLAPPING:
# If more than one term is inconclusive, we can't deduce anything about # If more than one term is inconclusive, we can't deduce anything about
...@@ -166,6 +171,8 @@ class VersionSolver: ...@@ -166,6 +171,8 @@ class VersionSolver:
if unsatisfied is None: if unsatisfied is None:
return _conflict return _conflict
self._contradicted_incompatibilities.add(incompatibility)
adverb = "not " if unsatisfied.is_positive() else "" adverb = "not " if unsatisfied.is_positive() else ""
self._log(f"derived: {adverb}{unsatisfied.dependency}") self._log(f"derived: {adverb}{unsatisfied.dependency}")
...@@ -255,6 +262,7 @@ class VersionSolver: ...@@ -255,6 +262,7 @@ class VersionSolver:
or most_recent_satisfier.cause is None or most_recent_satisfier.cause is None
): ):
self._solution.backtrack(previous_satisfier_level) self._solution.backtrack(previous_satisfier_level)
self._contradicted_incompatibilities.clear()
if new_incompatibility: if new_incompatibility:
self._add_incompatibility(incompatibility) self._add_incompatibility(incompatibility)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment