Commit 5b4a3842 by Josh Guice

fix(solver): skip seen "graph" nodes

sharply decreases slowness :)
parent d2fd581c
......@@ -221,7 +221,9 @@ class Solver:
except SolveFailure as 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 = []
final_packages = []
......@@ -237,7 +239,7 @@ class Solver:
return final_packages, depths
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]
if not previous:
category = "dev"
......@@ -254,6 +256,12 @@ class Solver:
"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:
return graph
......@@ -302,7 +310,7 @@ class Solver:
continue
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:
......
......@@ -619,17 +619,17 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies(
check_solver_result(
ops,
[
{"job": "install", "package": package_d},
{"job": "install", "package": package_b},
{"job": "install", "package": package_c},
{"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
d = ops[0].package
a = ops[3].package
d = ops[3].package
assert d.category == "dev"
assert c.category == "dev"
......@@ -670,18 +670,18 @@ def test_solver_with_dependency_in_both_main_and_dev_dependencies_with_one_more_
check_solver_result(
ops,
[
{"job": "install", "package": package_b},
{"job": "install", "package": package_d},
{"job": "install", "package": package_a},
{"job": "install", "package": package_b},
{"job": "install", "package": package_c},
{"job": "install", "package": package_d},
{"job": "install", "package": package_e},
],
)
b = ops[0].package
c = ops[3].package
d = ops[1].package
a = ops[2].package
a = ops[0].package
b = ops[1].package
c = ops[2].package
d = ops[3].package
e = ops[4].package
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