From f622afd20843709fd05c0f7666259a5f381090ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Fri, 3 May 2024 16:37:48 +0200 Subject: [PATCH] Avoid visiting packages more than once in checkPacksRec. --- source/dub/project.d | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/source/dub/project.d b/source/dub/project.d index 068c10b43..300060117 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -887,15 +887,19 @@ class Project { } // check for conflicts (packages missing in the final configuration graph) - void checkPacksRec(in Package pack) { - auto pc = pack.name in ret; - enforce(pc !is null, "Could not resolve configuration for package "~pack.name); - foreach (p, dep; pack.getDependencies(*pc)) { + auto visited = new bool[](package_list.length); + void checkPacksRec(size_t pack_idx) { + if (visited[pack_idx]) return; + visited[pack_idx] = true; + auto pname = package_names[pack_idx]; + auto pc = pname in ret; + enforce(pc !is null, "Could not resolve configuration for package "~pname); + foreach (p, dep; package_list[pack_idx].getDependencies(*pc)) { auto deppack = getDependency(p, dep.optional); - if (deppack) checkPacksRec(deppack); + if (deppack) checkPacksRec(package_list.countUntil(deppack)); } } - checkPacksRec(m_rootPackage); + checkPacksRec(0); return ret; }