From 1a6039c17a60525a9dcf825ad10fbe9e88da80f6 Mon Sep 17 00:00:00 2001 From: bitloi Date: Sun, 1 Feb 2026 01:06:07 +0100 Subject: [PATCH] Handle ThisProject in aggregate and dependencies Fixes #3616 - Scope's resolveProjectBuild and resolveProjectRef mishandle ThisProject. Previously, using ThisProject in aggregate() or dependsOn() would cause a runtime error: 'Cannot resolve ThisProject w/o the current project'. This change adds proper handling for ThisProject in Load.scala: - In checkAll: Skip validation for ThisProject (refers to self) - In resolveProjects: Resolve ThisProject to ProjectRef(uri, p.id) --- main/src/main/scala/sbt/internal/Load.scala | 2 ++ .../project/thisProject-aggregate/build.sbt | 15 +++++++++++++++ .../sbt-test/project/thisProject-aggregate/test | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 sbt-app/src/sbt-test/project/thisProject-aggregate/build.sbt create mode 100644 sbt-app/src/sbt-test/project/thisProject-aggregate/test diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 1bf7e4490..c89185e48 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -668,6 +668,7 @@ private[sbt] object Load { do ref match case LocalAggregate => () + case ThisProject => () case _ => val ProjectRef(refURI, refID) = Scope.resolveProjectRef(uri, rootProject, ref) val loadedUnit = builds(refURI) @@ -714,6 +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 ref => Vector(Scope.resolveProjectRef(uri, rootProject, ref)) LoadedBuildUnit( unit.unit, diff --git a/sbt-app/src/sbt-test/project/thisProject-aggregate/build.sbt b/sbt-app/src/sbt-test/project/thisProject-aggregate/build.sbt new file mode 100644 index 000000000..7240e2882 --- /dev/null +++ b/sbt-app/src/sbt-test/project/thisProject-aggregate/build.sbt @@ -0,0 +1,15 @@ +ThisBuild / scalaVersion := "2.13.16" + +lazy val root = project + .in(file(".")) + .aggregate(ThisProject) + .settings( + name := "root-project" + ) + +lazy val check = taskKey[Unit]("Verify ThisProject in aggregate works") + +root / check := { + val n = (root / name).value + assert(n == "root-project", s"Expected 'root-project' but got '$n'") +} diff --git a/sbt-app/src/sbt-test/project/thisProject-aggregate/test b/sbt-app/src/sbt-test/project/thisProject-aggregate/test new file mode 100644 index 000000000..788d07bc3 --- /dev/null +++ b/sbt-app/src/sbt-test/project/thisProject-aggregate/test @@ -0,0 +1,3 @@ +# Verify that ThisProject in aggregate doesn't cause runtime error +# This tests the fix for https://github.com/sbt/sbt/issues/3616 +> check