Commit c471b129 by Sébastien Eustace

Fix handling of duplicate dependencies

parent 65002eae
...@@ -399,6 +399,28 @@ class Provider: ...@@ -399,6 +399,28 @@ class Provider:
dependencies.append(list(by_constraint.values())[0][0]) dependencies.append(list(by_constraint.values())[0][0])
continue continue
# We leave dependencies as-is if they have the same
# python/platform constraints.
# That way the resolver will pickup the conflict
# and display a proper error.
_deps = [value[0] for value in by_constraint.values()]
seen = set()
for _dep in _deps:
pep_508_dep = _dep.to_pep_508()
if ";" not in pep_508_dep:
_requirements = ""
else:
_requirements = pep_508_dep.split(";")[1].strip()
if _requirements not in seen:
seen.add(_requirements)
if len(_deps) != len(seen):
for _dep in _deps:
dependencies.append(_dep)
continue
# At this point, we raise an exception that will # At this point, we raise an exception that will
# tell the solver to enter compatibility mode # tell the solver to enter compatibility mode
# which means it will resolve for each minor # which means it will resolve for each minor
......
...@@ -819,6 +819,33 @@ def test_solver_duplicate_dependencies_different_constraints(solver, repo, packa ...@@ -819,6 +819,33 @@ def test_solver_duplicate_dependencies_different_constraints(solver, repo, packa
assert op.package.requirements == {"python": ">=3.4"} assert op.package.requirements == {"python": ">=3.4"}
def test_solver_duplicate_dependencies_different_constraints_same_requirements(
solver, repo, package
):
package.add_dependency("A")
package_a = get_package("A", "1.0")
package_a.add_dependency("B", {"version": "^1.0"})
package_a.add_dependency("B", {"version": "^2.0"})
package_b10 = get_package("B", "1.0")
package_b20 = get_package("B", "2.0")
repo.add_package(package_a)
repo.add_package(package_b10)
repo.add_package(package_b20)
with pytest.raises(SolverProblemError) as e:
solver.solve()
expected = """\
Because a (1.0) depends on both B (^1.0) and B (^2.0), a is forbidden.
So, because no versions of a match <1.0 || >1.0
and root depends on A (*), version solving failed."""
assert str(e.value) == expected
def test_solver_duplicate_dependencies_sub_dependencies(solver, repo, package): def test_solver_duplicate_dependencies_sub_dependencies(solver, repo, package):
package.add_dependency("A") package.add_dependency("A")
......
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