Commit 5b4a3842 by Josh Guice

fix(solver): skip seen "graph" nodes

sharply decreases slowness :)
parent d2fd581c
...@@ -221,7 +221,9 @@ class Solver: ...@@ -221,7 +221,9 @@ class Solver:
except SolveFailure as e: except SolveFailure as e:
raise SolverProblemError(e) raise SolverProblemError(e)
graph = self._build_graph(self._package, packages) # TODO why is there a lingering variable state / stack during install when invoked via `poetry update`?
# NOTE passing explicit empty array for seen to reset between invocations during update + install cycle
graph = self._build_graph(self._package, packages, seen=[])
depths = [] depths = []
final_packages = [] final_packages = []
...@@ -237,7 +239,7 @@ class Solver: ...@@ -237,7 +239,7 @@ class Solver:
return final_packages, depths return final_packages, depths
def _build_graph( def _build_graph(
self, package, packages, previous=None, previous_dep=None, dep=None self, package, packages, previous=None, previous_dep=None, dep=None, seen=[]
): # type: (...) -> Dict[str, Any] ): # type: (...) -> Dict[str, Any]
if not previous: if not previous:
category = "dev" category = "dev"
...@@ -254,6 +256,12 @@ class Solver: ...@@ -254,6 +256,12 @@ class Solver:
"children": childrens, "children": childrens,
} }
# skip already traversed packages
if package in seen:
return graph
else:
seen.append(package)
if previous_dep and previous_dep is not dep and previous_dep.name == dep.name: if previous_dep and previous_dep is not dep and previous_dep.name == dep.name:
return graph return graph
...@@ -302,7 +310,7 @@ class Solver: ...@@ -302,7 +310,7 @@ class Solver:
continue continue
child_graph = self._build_graph( child_graph = self._build_graph(
pkg, packages, graph, dependency, dep or dependency pkg, packages, graph, dependency, dep or dependency, seen=seen
) )
if not is_activated: if not is_activated:
......
...@@ -619,17 +619,17 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies( ...@@ -619,17 +619,17 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies(
check_solver_result( check_solver_result(
ops, ops,
[ [
{"job": "install", "package": package_d},
{"job": "install", "package": package_b}, {"job": "install", "package": package_b},
{"job": "install", "package": package_c},
{"job": "install", "package": package_a}, {"job": "install", "package": package_a},
{"job": "install", "package": package_c},
{"job": "install", "package": package_d},
], ],
) )
b = ops[1].package b = ops[0].package
a = ops[1].package
c = ops[2].package c = ops[2].package
d = ops[0].package d = ops[3].package
a = ops[3].package
assert d.category == "dev" assert d.category == "dev"
assert c.category == "dev" assert c.category == "dev"
...@@ -670,18 +670,18 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_ ...@@ -670,18 +670,18 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
check_solver_result( check_solver_result(
ops, ops,
[ [
{"job": "install", "package": package_b},
{"job": "install", "package": package_d},
{"job": "install", "package": package_a}, {"job": "install", "package": package_a},
{"job": "install", "package": package_b},
{"job": "install", "package": package_c}, {"job": "install", "package": package_c},
{"job": "install", "package": package_d},
{"job": "install", "package": package_e}, {"job": "install", "package": package_e},
], ],
) )
b = ops[0].package a = ops[0].package
c = ops[3].package b = ops[1].package
d = ops[1].package c = ops[2].package
a = ops[2].package d = ops[3].package
e = ops[4].package e = ops[4].package
assert d.category == "dev" assert d.category == "dev"
......
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