From bb1725f5808b7f51c301a7b4b888a0ae30c934de Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sun, 18 Nov 2012 10:55:26 -0500 Subject: [PATCH] Allow root project to be explicitly specified in Build.rootProject --- main/Build.scala | 3 +++ main/Load.scala | 7 ++++--- .../project/root-project/changes/RootA.scala | 14 ++++++++++++++ .../project/root-project/changes/RootD.scala | 14 ++++++++++++++ sbt/src/sbt-test/project/root-project/test | 11 +++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 sbt/src/sbt-test/project/root-project/changes/RootA.scala create mode 100644 sbt/src/sbt-test/project/root-project/changes/RootD.scala create mode 100644 sbt/src/sbt-test/project/root-project/test diff --git a/main/Build.scala b/main/Build.scala index 8104dee15..cc01ab8a4 100644 --- a/main/Build.scala +++ b/main/Build.scala @@ -14,6 +14,9 @@ trait Build def projects: Seq[Project] = ReflectUtilities.allVals[Project](this).values.toSeq def settings: Seq[Setting[_]] = Defaults.buildCore def buildLoaders: Seq[BuildLoader.Components] = Nil + /** Explicitly defines the root project. + * If None, the root project is the first project in the build's root directory or just the first project if none are in the root directory.*/ + def rootProject: Option[Project] = None } trait Plugin { diff --git a/main/Load.scala b/main/Load.scala index bfe38a7db..54a5ff5b5 100755 --- a/main/Load.scala +++ b/main/Load.scala @@ -294,9 +294,10 @@ object Load def isRoot(p: Project) = p.base == unit.localBase val externals = referenced(defined).toList - val projectsInRoot = defined.filter(isRoot).map(_.id) - val rootProjects = if(projectsInRoot.isEmpty) defined.head.id :: Nil else projectsInRoot - (new PartBuildUnit(unit, defined.map(d => (d.id, d)).toMap, rootProjects, buildSettings(unit)), externals) + val explicitRoots = unit.definitions.builds.flatMap(_.rootProject) + val projectsInRoot = if(explicitRoots.isEmpty) defined.filter(isRoot) else explicitRoots + val rootProjects = if(projectsInRoot.isEmpty) defined.head :: Nil else projectsInRoot + (new PartBuildUnit(unit, defined.map(d => (d.id, d)).toMap, rootProjects.map(_.id), buildSettings(unit)), externals) } def buildSettings(unit: BuildUnit): Seq[Setting[_]] = { diff --git a/sbt/src/sbt-test/project/root-project/changes/RootA.scala b/sbt/src/sbt-test/project/root-project/changes/RootA.scala new file mode 100644 index 000000000..1fee35352 --- /dev/null +++ b/sbt/src/sbt-test/project/root-project/changes/RootA.scala @@ -0,0 +1,14 @@ +import sbt._ +import Keys._ + +object B extends Build +{ + override def rootProject = Some(a) + + lazy val a = Project("a", file("a")) settings( + TaskKey[Unit]("taskA") := {} + ) + lazy val b = Project("b", file("b")) settings( + TaskKey[Unit]("taskB") := {} + ) +} diff --git a/sbt/src/sbt-test/project/root-project/changes/RootD.scala b/sbt/src/sbt-test/project/root-project/changes/RootD.scala new file mode 100644 index 000000000..97b2d60a7 --- /dev/null +++ b/sbt/src/sbt-test/project/root-project/changes/RootD.scala @@ -0,0 +1,14 @@ +import sbt._ +import Keys._ + +object B extends Build +{ + override def rootProject = Some(d) + + lazy val c = Project("c", file("c")) settings( + TaskKey[Unit]("taskC") := {} + ) + lazy val d = Project("d", file("d")) settings( + TaskKey[Unit]("taskD") := {} + ) +} diff --git a/sbt/src/sbt-test/project/root-project/test b/sbt/src/sbt-test/project/root-project/test new file mode 100644 index 000000000..1848bfe41 --- /dev/null +++ b/sbt/src/sbt-test/project/root-project/test @@ -0,0 +1,11 @@ +$ copy-file changes/RootA.scala project/P.scala +> reload +> taskA +-> taskB +> b/taskB + +$ copy-file changes/RootD.scala project/P.scala +> reload +> taskD +-> taskC +> c/taskC