Commit ec9c0565 by Randy Döring Committed by Arun Babu Neelicattu

Consider all overwrites and not only the overwrites of one package when building…

Consider all overwrites and not only the overwrites of one package when building the marker intersection
parent 94a60ca4
...@@ -638,8 +638,9 @@ class Provider: ...@@ -638,8 +638,9 @@ class Provider:
dep_other.set_constraint( dep_other.set_constraint(
dep_other.constraint.intersect(dep_any.constraint) dep_other.constraint.intersect(dep_any.constraint)
) )
else: elif not inverted_marker.is_empty():
# if there is no any marker dependency, # if there is no any marker dependency
# and the inverted marker is not empty,
# a dependency with the inverted union of all markers is required # a dependency with the inverted union of all markers is required
# in order to not miss other dependencies later, for instance: # in order to not miss other dependencies later, for instance:
# - foo (1.0) ; python == 3.7 # - foo (1.0) ; python == 3.7
...@@ -655,9 +656,10 @@ class Provider: ...@@ -655,9 +656,10 @@ class Provider:
overrides = [] overrides = []
overrides_marker_intersection = AnyMarker() overrides_marker_intersection = AnyMarker()
for _dep in self._overrides.get(package, {}).values(): for dep_overrides in self._overrides.values():
overrides_marker_intersection = overrides_marker_intersection.intersect( for _dep in dep_overrides.values():
_dep.marker overrides_marker_intersection = (
overrides_marker_intersection.intersect(_dep.marker)
) )
for _dep in _deps: for _dep in _deps:
if not overrides_marker_intersection.intersect(_dep.marker).is_empty(): if not overrides_marker_intersection.intersect(_dep.marker).is_empty():
......
...@@ -1414,6 +1414,49 @@ def test_solver_duplicate_dependencies_ignore_overrides_with_empty_marker_inters ...@@ -1414,6 +1414,49 @@ def test_solver_duplicate_dependencies_ignore_overrides_with_empty_marker_inters
) )
def test_solver_duplicate_dependencies_ignore_overrides_with_empty_marker_intersection2(
solver: Solver, repo: Repository, package: Package
):
"""
Empty intersection between top level dependency and transient dependency.
"""
package.add_dependency(Factory.create_dependency("A", {"version": "1.0"}))
package.add_dependency(
Factory.create_dependency("B", {"version": ">=2.0", "python": ">=3.7"})
)
package.add_dependency(
Factory.create_dependency("B", {"version": "*", "python": "<3.7"})
)
package_a10 = get_package("A", "1.0")
package_a10.add_dependency(
Factory.create_dependency("B", {"version": ">=2.0", "python": ">=3.7"})
)
package_a10.add_dependency(
Factory.create_dependency("B", {"version": "*", "python": "<3.7"})
)
package_b10 = get_package("B", "1.0")
package_b10.python_versions = "<3.7"
package_b20 = get_package("B", "2.0")
package_b20.python_versions = ">=3.7"
repo.add_package(package_a10)
repo.add_package(package_b10)
repo.add_package(package_b20)
transaction = solver.solve()
check_solver_result(
transaction,
[
{"job": "install", "package": package_b10},
{"job": "install", "package": package_b20},
{"job": "install", "package": package_a10},
],
)
def test_solver_duplicate_dependencies_sub_dependencies( def test_solver_duplicate_dependencies_sub_dependencies(
solver: Solver, repo: Repository, package: ProjectPackage solver: Solver, repo: Repository, package: ProjectPackage
): ):
......
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