diff --git a/conda_lock/src_parser/__init__.py b/conda_lock/src_parser/__init__.py index 8ce156e41..98734ac18 100644 --- a/conda_lock/src_parser/__init__.py +++ b/conda_lock/src_parser/__init__.py @@ -7,7 +7,7 @@ import typing from collections import defaultdict, namedtuple -from itertools import chain +from itertools import chain, product from typing import ( TYPE_CHECKING, AbstractSet, @@ -538,10 +538,27 @@ def aggregate_lock_specs( ): key = (dep.manager, dep.name) if key in unique_deps: + prev_dep = unique_deps[key] + # Override existing, but merge selectors - previous_selectors = unique_deps[key].selectors + previous_selectors = prev_dep.selectors previous_selectors |= dep.selectors dep.selectors = previous_selectors + + # If bold old and new are VersionedDependency, combine versions + if isinstance(prev_dep, VersionedDependency) and isinstance( + dep, VersionedDependency + ): + prev_versions = [ + set(sec.split(",")) for sec in prev_dep.version.split("|") + ] + new_versions = [set(sec.split(",")) for sec in dep.version.split("|")] + cross_versions = [ + prev | new for prev, new in product(prev_versions, new_versions) + ] + final_versions = set(",".join(subset) for subset in cross_versions) + dep.version = "|".join(final_versions) + unique_deps[key] = dep dependencies = list(unique_deps.values())