From ccbe1e5e98f156b9ea61b7c8c79c40729ad3ae19 Mon Sep 17 00:00:00 2001 From: Damian Shaw Date: Wed, 15 Nov 2023 21:09:45 -0500 Subject: [PATCH] Deduplicate causes --- src/resolvelib/resolvers.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/resolvelib/resolvers.py b/src/resolvelib/resolvers.py index 58a48dd..ecc4dad 100644 --- a/src/resolvelib/resolvers.py +++ b/src/resolvelib/resolvers.py @@ -381,6 +381,14 @@ def _patch_criteria() -> bool: # No way to backtrack anymore. return False + def _extract_causes( + self, criteron: list[Criterion[RT, CT]] + ) -> list[RequirementInformation[RT, CT]]: + """Extract causes from list of criterion and deduplicate""" + return list( + {id(i): i for c in criteron for i in c.information}.values() + ) + def resolve( self, requirements: Iterable[RT], max_rounds: int ) -> State[RT, CT, KT]: @@ -429,10 +437,10 @@ def resolve( # Choose the most preferred unpinned criterion to try. name = min(unsatisfied_names, key=self._get_preference) - failure_causes = self._attempt_to_pin_criterion(name) + failure_criterion = self._attempt_to_pin_criterion(name) - if failure_causes: - causes = [i for c in failure_causes for i in c.information] + if failure_criterion: + causes = self._extract_causes(failure_criterion) # Backjump if pinning fails. The backjump process puts us in # an unpinned state, so we can work on it in the next round. self._r.resolving_conflicts(causes=causes)