From 399dd8ec48ffb0fb961741c2cec4806bee292dab Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sun, 10 Apr 2011 18:51:50 -0400 Subject: [PATCH] support delegating to a project with different configurations --- main/Load.scala | 6 +++-- .../delegate_config/project/Build.scala | 25 +++++++++++++++++++ sbt/src/sbt-test/project/delegate_config/test | 11 ++++++++ .../project/delegates/project/Build.scala | 2 +- 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 sbt/src/sbt-test/project/delegate_config/project/Build.scala create mode 100644 sbt/src/sbt-test/project/delegate_config/test diff --git a/main/Load.scala b/main/Load.scala index d7e92e6c3..c5340a58e 100644 --- a/main/Load.scala +++ b/main/Load.scala @@ -59,7 +59,7 @@ object Load case BuildRef(uri) => configInheritRef(lb, ProjectRef(uri, rootProject(uri)), config) } def configInheritRef(lb: LoadedBuild, ref: ProjectRef, config: ConfigKey): Seq[ConfigKey] = - getConfiguration(lb.units, ref.build, ref.project, config).extendsConfigs.map(c => ConfigKey(c.name)) + configurationOpt(lb.units, ref.build, ref.project, config).toList.flatMap(_.extendsConfigs).map(c => ConfigKey(c.name)) def projectInherit(lb: LoadedBuild, ref: ResolvedReference): Seq[ProjectRef] = ref match @@ -282,7 +282,9 @@ object Load def getRootProject(map: Map[URI, BuildUnitBase]): URI => String = uri => getBuild(map, uri).rootProjects.headOption getOrElse emptyBuild(uri) def getConfiguration(map: Map[URI, LoadedBuildUnit], uri: URI, id: String, conf: ConfigKey): Configuration = - getProject(map, uri, id).configurations.find(_.name == conf.name) getOrElse noConfiguration(uri, id, conf.name) + configurationOpt(map, uri, id, conf) getOrElse noConfiguration(uri, id, conf.name) + def configurationOpt(map: Map[URI, LoadedBuildUnit], uri: URI, id: String, conf: ConfigKey): Option[Configuration] = + getProject(map, uri, id).configurations.find(_.name == conf.name) def getProject(map: Map[URI, LoadedBuildUnit], uri: URI, id: String): ResolvedProject = getBuild(map, uri).defined.getOrElse(id, noProject(uri, id)) diff --git a/sbt/src/sbt-test/project/delegate_config/project/Build.scala b/sbt/src/sbt-test/project/delegate_config/project/Build.scala new file mode 100644 index 000000000..7a631dc23 --- /dev/null +++ b/sbt/src/sbt-test/project/delegate_config/project/Build.scala @@ -0,0 +1,25 @@ +import sbt._ +import complete.DefaultParsers._ +import Keys._ + +object B extends Build +{ + // This configuration is added to 'sub' only. + // This verifies that delegation works when a configuration is not defined in the project that is being delegated to + val newConfig = config("sample") + + val sample = SettingKey[Int]("sample") + val check = TaskKey[Unit]("check") + + lazy val projects = Seq(root, sub) + lazy val root = Project("root", file("."), settings = Nil) + lazy val sub = Project("sub", file("."), delegates = root :: Nil, configurations = newConfig :: Nil, settings = incSample :: checkTask(4) :: Nil) + override lazy val settings = + (sample in newConfig := 3) :: + checkTask(3) :: + Nil + + def incSample = sample <<= sample in newConfig apply (_ + 1) + def checkTask(expected: Int) = check <<= sample in newConfig map ( i => assert(i == expected, "Expected " + expected + ", got " + i ) ) + +} diff --git a/sbt/src/sbt-test/project/delegate_config/test b/sbt/src/sbt-test/project/delegate_config/test new file mode 100644 index 000000000..3d6dacc78 --- /dev/null +++ b/sbt/src/sbt-test/project/delegate_config/test @@ -0,0 +1,11 @@ +-> root/sample +> sub/sample + +-> root/*:sample +> sub/*:sample + +> root/*:check +> root/check + +> sub/*:check +> sub/check diff --git a/sbt/src/sbt-test/project/delegates/project/Build.scala b/sbt/src/sbt-test/project/delegates/project/Build.scala index 9d96b83ad..973f818fd 100644 --- a/sbt/src/sbt-test/project/delegates/project/Build.scala +++ b/sbt/src/sbt-test/project/delegates/project/Build.scala @@ -8,7 +8,7 @@ object B extends Build lazy val projects = Seq(root, sub) lazy val root = Project("root", file(".")) - lazy val sub = Project("sub", file(".")) delegates(root) settings(check <<= checkTask) + lazy val sub = Project("sub", file(".")) delegateTo(root) settings(check <<= checkTask) lazy val checkTask = InputTask(_ => Space ~> NatBasic) { result => (result, maxErrors) map { (i, max) =>