From a028f8e6d7e37a218ce2558c80f15a35451df63a Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Sat, 18 Jun 2011 20:17:50 -0400 Subject: [PATCH] fixes issue with inter-project resolution when project delegates are defined --- ivy/IvyInterface.scala | 1 + ivy/ProjectResolver.scala | 1 + main/Defaults.scala | 15 +++++++++------ .../delegate/project/Build.scala | 9 +++++++++ .../sbt-test/dependency-management/delegate/test | 1 + 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 sbt/src/sbt-test/dependency-management/delegate/project/Build.scala create mode 100644 sbt/src/sbt-test/dependency-management/delegate/test diff --git a/ivy/IvyInterface.scala b/ivy/IvyInterface.scala index 2d0a3e54f..3b802fc20 100644 --- a/ivy/IvyInterface.scala +++ b/ivy/IvyInterface.scala @@ -41,6 +41,7 @@ sealed trait Resolver final class RawRepository(val resolver: DependencyResolver) extends Resolver { def name = resolver.getName + override def toString = "Raw(" + resolver.toString + ")" } sealed case class MavenRepository(name: String, root: String) extends Resolver { diff --git a/ivy/ProjectResolver.scala b/ivy/ProjectResolver.scala index aee0cb772..4c2d046db 100644 --- a/ivy/ProjectResolver.scala +++ b/ivy/ProjectResolver.scala @@ -23,6 +23,7 @@ class ProjectResolver(name: String, map: Map[ModuleRevisionId, ModuleDescriptor] { def getName = name def setName(name: String) = error("Setting name not supported by ProjectResolver") + override def toString = "ProjectResolver(" + name + ", mapped: " + map.keys.mkString(", ") + ")" def getDependency(dd: DependencyDescriptor, data: ResolveData): ResolvedModuleRevision = { diff --git a/main/Defaults.scala b/main/Defaults.scala index e0c520eb9..3395719ae 100644 --- a/main/Defaults.scala +++ b/main/Defaults.scala @@ -571,7 +571,10 @@ object Classpaths normalizedName <<= name(StringUtilities.normalize), organization <<= organization or normalizedName.identity, classpathFilter in GlobalScope :== "*.jar", - externalResolvers <<= externalResolvers or (resolvers map Resolver.withDefaultResolvers), + externalResolvers <<= (externalResolvers.task.? zipWith resolvers.identity) { + case (Some(delegated), Seq()) => delegated + case (_, rs) => task { Resolver.withDefaultResolvers(rs) } + }, fullResolvers <<= (projectResolver,externalResolvers,sbtPlugin,sbtResolver) map { (pr,rs,isPlugin,sr) => val base = pr +: rs if(isPlugin) sr +: base else base @@ -607,7 +610,7 @@ object Classpaths retrievePattern in GlobalScope :== "[type]s/[organisation]/[module]/[artifact](-[revision])(-[classifier]).[ext]", updateConfiguration <<= (retrieveConfiguration, ivyLoggingLevel)((conf,level) => new UpdateConfiguration(conf, false, level) ), retrieveConfiguration <<= (managedDirectory, retrievePattern, retrieveManaged) { (libm, pattern, enabled) => if(enabled) Some(new RetrieveConfiguration(libm, pattern)) else None }, - ivyConfiguration <<= ivyConfiguration or mkIvyConfiguration, + ivyConfiguration <<= mkIvyConfiguration, ivyConfigurations <<= (autoCompilerPlugins, internalConfigurationMap, thisProject) { (auto, internalMap, project) => (project.configurations ++ project.configurations.map(internalMap) ++ (if(auto) CompilerPlugin :: Nil else Nil)).distinct }, @@ -629,8 +632,8 @@ object Classpaths new IvySbt(conf) }, ivyModule <<= (ivySbt, moduleSettings) map { (ivySbt, settings) => new ivySbt.Module(settings) }, - update <<= (ivyModule, updateConfiguration, cacheDirectory, scalaInstance, streams) map { (module, config, cacheDirectory, si, s) => - cachedUpdate(cacheDirectory / "update", module, config, Some(si), s.log) + update <<= (ivyModule, thisProjectRef, updateConfiguration, cacheDirectory, scalaInstance, streams) map { (module, ref, config, cacheDirectory, si, s) => + cachedUpdate(cacheDirectory / "update", Project.display(ref), module, config, Some(si), s.log) }, transitiveClassifiers in GlobalScope :== Seq(SourceClassifier, DocClassifier), updateClassifiers <<= (ivySbt, projectID, update, transitiveClassifiers, updateConfiguration, ivyScala, streams) map { (is, pid, up, classifiers, c, ivyScala, s) => @@ -661,13 +664,13 @@ object Classpaths import Cache._ import CacheIvy.{classpathFormat, /*publishIC,*/ updateIC, updateReportF} - def cachedUpdate(cacheFile: File, module: IvySbt#Module, config: UpdateConfiguration, scalaInstance: Option[ScalaInstance], log: Logger): UpdateReport = + def cachedUpdate(cacheFile: File, label: String, module: IvySbt#Module, config: UpdateConfiguration, scalaInstance: Option[ScalaInstance], log: Logger): UpdateReport = { implicit val updateCache = updateIC implicit val updateReport = updateReportF type In = IvyConfiguration :+: ModuleSettings :+: UpdateConfiguration :+: HNil def work = (_: In) match { case conf :+: settings :+: config :+: HNil => - log.info("Updating...") + log.info("Updating " + label + "...") val r = IvyActions.update(module, config, log) log.info("Done updating.") scalaInstance match { case Some(si) => substituteScalaFiles(si, r); case None => r } diff --git a/sbt/src/sbt-test/dependency-management/delegate/project/Build.scala b/sbt/src/sbt-test/dependency-management/delegate/project/Build.scala new file mode 100644 index 000000000..dca5986fc --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/delegate/project/Build.scala @@ -0,0 +1,9 @@ +import sbt._ +import Keys._ + +object B extends Build +{ + lazy val root: Project = Project("root", file(".")) aggregate(logic, ui) + lazy val logic: Project = Project("logic", file("logic"), delegates = root :: Nil) + lazy val ui: Project = Project("ui", file("ui"), delegates = root :: Nil) dependsOn(logic) +} \ No newline at end of file diff --git a/sbt/src/sbt-test/dependency-management/delegate/test b/sbt/src/sbt-test/dependency-management/delegate/test new file mode 100644 index 000000000..73a68203f --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/delegate/test @@ -0,0 +1 @@ +> compile \ No newline at end of file