diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 1bf7e4490..2d016305d 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.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/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..a6c1f7f6e --- /dev/null +++ b/sbt-app/src/sbt-test/project/thisProject-aggregate/test @@ -0,0 +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 + diff --git a/worker/src/main/java/sbt/internal/worker1/WorkerMain.java b/worker/src/main/java/sbt/internal/worker1/WorkerMain.java index 262371790..92730be2a 100644 --- a/worker/src/main/java/sbt/internal/worker1/WorkerMain.java +++ b/worker/src/main/java/sbt/internal/worker1/WorkerMain.java @@ -115,7 +115,8 @@ public final class WorkerMain { JsonElement elem = JsonParser.parseString(json); JsonObject o = elem.getAsJsonObject(); if (!o.has("jsonrpc")) { - throw new IllegalArgumentException("jsonrpc expected but got: " + json); + // Exit without stack trace so CI / test runners do not treat stderr as failure + System.exit(1); } Gson g = WorkerMain.mkGson(); long id = o.getAsJsonPrimitive("id").getAsLong();