From 4dfe68a681566440eaf0f60c762ac8a2a1337dc9 Mon Sep 17 00:00:00 2001 From: bitloi Date: Sun, 1 Feb 2026 01:59:46 +0100 Subject: [PATCH] fix: Resolve ThisProject to empty to avoid cycle in aggregate/deps DAG Resolving ThisProject to ProjectRef(uri, p.id) created a self-reference in the aggregate (and dependency) list. BuildUtil.checkCycles runs topological sort on this relation and throws Cyclic when it sees the self-loop. Treat ThisProject as no-op: resolve to Vector.empty so the build loads without error. aggregate(ThisProject) / dependsOn(ThisProject) is effectively a no-op (self is already included). --- main/src/main/scala/sbt/internal/Load.scala | 2 +- sbt-app/src/sbt-test/project/thisProject-aggregate/test | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index c89185e48..2d016305d 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -715,7 +715,7 @@ private[sbt] object Load { val resolve: Project => ResolvedProject = (p: Project) => p.resolve: case LocalAggregate => resolveAutoAggregate(uri, p, ps) - case ThisProject => Vector(ProjectRef(uri, p.id)) + case ThisProject => Vector.empty // self-reference; treat as no-op to avoid cycle case ref => Vector(Scope.resolveProjectRef(uri, rootProject, ref)) LoadedBuildUnit( unit.unit, diff --git a/sbt-app/src/sbt-test/project/thisProject-aggregate/test b/sbt-app/src/sbt-test/project/thisProject-aggregate/test index 788d07bc3..a6c1f7f6e 100644 --- a/sbt-app/src/sbt-test/project/thisProject-aggregate/test +++ b/sbt-app/src/sbt-test/project/thisProject-aggregate/test @@ -1,3 +1,4 @@ # Verify that ThisProject in aggregate doesn't cause runtime error # This tests the fix for https://github.com/sbt/sbt/issues/3616 > check +