Commit 40dc3ad9 by Sébastien Eustace Committed by GitHub

Merge pull request #3839 from jguice/master

Resolution speed improvement
parents b2ac34eb c1891c71
...@@ -277,9 +277,10 @@ class Solver: ...@@ -277,9 +277,10 @@ class Solver:
except SolveFailure as e: except SolveFailure as e:
raise SolverProblemError(e) raise SolverProblemError(e)
# NOTE passing explicit empty array for seen to reset between invocations during update + install cycle
results = dict( results = dict(
depth_first_search( depth_first_search(
PackageNode(self._package, packages), aggregate_package_nodes PackageNode(self._package, packages, seen=[]), aggregate_package_nodes
) )
) )
...@@ -390,6 +391,7 @@ class PackageNode(DFSNode): ...@@ -390,6 +391,7 @@ class PackageNode(DFSNode):
self, self,
package: Package, package: Package,
packages: List[Package], packages: List[Package],
seen: List[Package],
previous: Optional["PackageNode"] = None, previous: Optional["PackageNode"] = None,
previous_dep: Optional[ previous_dep: Optional[
Union[ Union[
...@@ -412,6 +414,7 @@ class PackageNode(DFSNode): ...@@ -412,6 +414,7 @@ class PackageNode(DFSNode):
) -> None: ) -> None:
self.package = package self.package = package
self.packages = packages self.packages = packages
self.seen = seen
self.previous = previous self.previous = previous
self.previous_dep = previous_dep self.previous_dep = previous_dep
...@@ -434,6 +437,12 @@ class PackageNode(DFSNode): ...@@ -434,6 +437,12 @@ class PackageNode(DFSNode):
def reachable(self) -> List["PackageNode"]: def reachable(self) -> List["PackageNode"]:
children: List[PackageNode] = [] children: List[PackageNode] = []
# skip already traversed packages
if self.package in self.seen:
return []
else:
self.seen.append(self.package)
if ( if (
self.previous_dep self.previous_dep
and self.previous_dep is not self.dep and self.previous_dep is not self.dep
...@@ -470,6 +479,7 @@ class PackageNode(DFSNode): ...@@ -470,6 +479,7 @@ class PackageNode(DFSNode):
PackageNode( PackageNode(
pkg, pkg,
self.packages, self.packages,
self.seen,
self, self,
dependency, dependency,
self.dep or dependency, self.dep or dependency,
......
...@@ -866,14 +866,14 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies( ...@@ -866,14 +866,14 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies(
], ],
) )
d = ops[0].package
b = ops[1].package b = ops[1].package
c = ops[2].package c = ops[2].package
d = ops[0].package
a = ops[3].package a = ops[3].package
assert d.category == "dev" assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main" assert b.category == "main"
assert c.category == "dev"
assert a.category == "main" assert a.category == "main"
...@@ -925,15 +925,15 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_ ...@@ -925,15 +925,15 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
) )
b = ops[0].package b = ops[0].package
c = ops[3].package
d = ops[1].package d = ops[1].package
a = ops[2].package a = ops[2].package
c = ops[3].package
e = ops[4].package e = ops[4].package
assert d.category == "dev"
assert c.category == "dev"
assert b.category == "main" assert b.category == "main"
assert d.category == "dev"
assert a.category == "main" assert a.category == "main"
assert c.category == "dev"
assert e.category == "main" assert e.category == "main"
......
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