Skip to content

Commit

Permalink
Combine matching ireqs rather than taking the last
Browse files Browse the repository at this point in the history
  • Loading branch information
lpulley committed Jun 22, 2023
1 parent f933b4c commit 1479ad9
Showing 1 changed file with 19 additions and 5 deletions.
24 changes: 19 additions & 5 deletions piptools/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,16 @@ def __init__(
self.unsafe_constraints: set[InstallRequirement] = set()

self.existing_constraints = existing_constraints
self._constraints_map = {key_from_ireq(ireq): ireq for ireq in constraints}

# Categorize InstallRequirements into sets by key
constraints_sets: DefaultDict[str, set[InstallRequirement]] = collections.defaultdict(set)
for ireq in constraints:
constraints_sets[key_from_ireq(ireq)].add(ireq)
# Collapse each set of InstallRequirements using combine_install_requirements
self._constraints_map = {
ireq_key: combine_install_requirements(ireqs)
for ireq_key, ireqs in constraints_sets.items()
}

# Make sure there is no enabled legacy resolver
options.deprecated_features_enabled = omit_list_value(
Expand Down Expand Up @@ -759,9 +768,14 @@ def _get_install_requirement_from_candidate(
ireq_key = key_from_ireq(ireq)
pinned_ireq._required_by = reverse_dependencies.get(ireq_key, set())

# Save source for annotation
source_ireq = self._constraints_map.get(ireq_key)
if source_ireq is not None:
pinned_ireq._source_ireqs = [source_ireq]
# Save sources for annotation
constraint_ireq = self._constraints_map.get(ireq_key)
if constraint_ireq is not None:
if hasattr(constraint_ireq, "_source_ireqs"):
# If the constraint is combined (has _source_ireqs), use those
pinned_ireq._source_ireqs = constraint_ireq._source_ireqs
else:
# Otherwise (the constraint is not combined) it is the source
pinned_ireq._source_ireqs = [constraint_ireq]

return pinned_ireq

0 comments on commit 1479ad9

Please sign in to comment.