From fc3666586aade9740c2ba5dd72c6c3b4b90345c4 Mon Sep 17 00:00:00 2001 From: eugene yokota Date: Thu, 23 Jul 2026 20:16:54 -0400 Subject: [PATCH] [2.x] fix: Fixes common settings with extraProjects (#9495) **Problem** The presence of extraProjects broke common settings. **Solution** This fixes it by passing finalRoot.commonSettings. --- main/src/main/scala/sbt/internal/Load.scala | 2 +- .../extra-projects-key-aggregate/build.sbt | 25 +++++++++++++++++-- .../project/ExtraPlugin.scala | 16 +++++++++--- .../project/extra-projects-key-aggregate/test | 6 ++++- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index 866ef43ed..3ee19bca1 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -1129,7 +1129,7 @@ private[sbt] object Load { val newProjects = rest ++ discovered ++ projectLevelExtra val newAcc = acc :+ finalRoot val newGenerated = generated ++ generatedConfigClassFiles - loadTransitive1(newProjects, newAcc, newGenerated, commonSettings) + loadTransitive1(newProjects, newAcc, newGenerated, finalRoot.commonSettings) } // Load all config files AND process the project at the root directory, if it exists. diff --git a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/build.sbt b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/build.sbt index 415a43679..412b9343f 100644 --- a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/build.sbt +++ b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/build.sbt @@ -6,11 +6,32 @@ * Licensed under Apache License 2.0 (see LICENSE) */ -val check = taskKey[Unit]("Repro for #4947: task at root when extraProjects creates auto root") +@transient +val check4947 = taskKey[Unit]("") + +@transient +val check5661 = taskKey[Unit]("") + +@transient +val check9493 = taskKey[Unit]("") + +organization := "com.example" val a = project val p = project .settings( name := "p", - check := () + // subproject-level task + check4947 := {}, + + check9493 := { + val o = organization.value + assert(o == "com.example", s"actual: $o") + } ) + +LocalProject("mc") / cantTouchThis := "foo" +LocalRootProject / check5661 := { + val actual = (LocalProject("mc") / cantTouchThis).value + assert(actual == "foo", s"actual: $actual") +} diff --git a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/project/ExtraPlugin.scala b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/project/ExtraPlugin.scala index 77ff44de2..4649e8d26 100644 --- a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/project/ExtraPlugin.scala +++ b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/project/ExtraPlugin.scala @@ -6,10 +6,18 @@ * Licensed under Apache License 2.0 (see LICENSE) */ -import sbt._, Keys._ +import sbt.*, Keys.* + +object ExtraPlugin extends AutoPlugin: + object autoImport: + val cantTouchThis = settingKey[String]("") + end autoImport + import autoImport.* -object ExtraPlugin extends AutoPlugin { override def trigger = allRequirements override def extraProjects: Seq[Project] = - Seq(Project("z", file("z")).settings(name := "z")) -} + Seq(Project("mc", file("mc")).settings( + name := "mc", + cantTouchThis := "can't touch this", + )) +end ExtraPlugin diff --git a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/test b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/test index 15675b169..5dd83bb78 100644 --- a/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/test +++ b/sbt-app/src/sbt-test/project/extra-projects-key-aggregate/test @@ -1 +1,5 @@ -> check +> check4947 + +> check5661 + +> p/check9493