diff --git a/ivy/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala b/ivy/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala index a1fc5ddfc..06e253ab5 100644 --- a/ivy/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala +++ b/ivy/src/main/scala/sbt/ivyint/CachedResolutionResolveEngine.scala @@ -327,12 +327,41 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine { Left(new ResolveException(messages, failed, failedPaths)) } } - val results = mds map { + val (internal, external) = mds.partition { case (_, _, dd) => cache.internalDependency(dd, projectResolver).isDefined } + val internalResults = internal map { case (md, changing, dd) => cache.getOrElseUpdateMiniGraph(md, changing, logicalClock, miniGraphPath, cachedDescriptor, log) { doWork(md, dd) } } + val externalResults = external map { + case (md0, changing, dd) => + val configurationsInInternal = internalResults flatMap { + case Right(ur) => ur.allModules.flatMap { + case md => + val sameName = md.name == dd.getDependencyId.getName + val sameOrg = md.organization == dd.getDependencyId.getOrganisation + if (sameName && sameOrg) md.configurations + else None + } + case _ => Nil + } + + dd match { + case d: DefaultDependencyDescriptor => + configurationsInInternal foreach { c => + val configurations = c.split(";").map(_.split("->")) + configurations foreach { conf => d.addDependencyConfiguration(conf(0), conf(1)) } + } + + case _ => () + } + + cache.getOrElseUpdateMiniGraph(md0, changing, logicalClock, miniGraphPath, cachedDescriptor, log) { + doWork(md0, dd) + } + } + val results = internalResults ++ externalResults val uReport = mergeResults(md0, results, missingOk, System.currentTimeMillis - start, os, log) val cacheManager = getSettings.getResolutionCacheManager cacheManager.saveResolvedModuleDescriptor(md0) diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/a/A.scala b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/a/A.scala new file mode 100644 index 000000000..4e33d90d9 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/a/A.scala @@ -0,0 +1,5 @@ +package a + +object A { + romanowski.sbt.bug.MissingClass("A") +} diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/b/B.scala b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/b/B.scala new file mode 100644 index 000000000..acf3023b8 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/b/B.scala @@ -0,0 +1,5 @@ +package b + +object B { + romanowski.sbt.bug.MissingClass("A") +} diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/build.sbt b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/build.sbt new file mode 100644 index 000000000..3665d3634 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/build.sbt @@ -0,0 +1,22 @@ +def myResolver = resolvers += Resolver.file("buggy", file("repo"))( + Patterns( + ivyPatterns = Seq("[organization]/[module]/[revision]/ivy.xml"), + artifactPatterns = Seq("[organization]/[module]/[revision]/[artifact]"), + isMavenCompatible = false, + descriptorOptional = true, + skipConsistencyCheck = true + ) +) + +lazy val a = project settings( + myResolver, + updateOptions := updateOptions.value.withCachedResolution(true), //comment this line to make ws compile + libraryDependencies += "a" % "b" % "1.0.0" % "compile->runtime", + libraryDependencies += "a" % "b" % "1.0.0" % "compile->runtime2" +) + +lazy val b = project dependsOn(a) settings( + myResolver, + updateOptions := updateOptions.value.withCachedResolution(true), //comment this line to make ws compile + libraryDependencies += "a" % "b" % "1.0.1" % "compile->runtime" +) diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b1.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b1.jar new file mode 100644 index 000000000..619fa9368 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b1.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b2.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b2.jar new file mode 100644 index 000000000..619fa9368 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b2.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b3.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b3.jar new file mode 100644 index 000000000..1c3f8c4e1 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/b3.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/ivy.xml b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/ivy.xml new file mode 100644 index 000000000..19fab2e82 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.0/ivy.xml @@ -0,0 +1,16 @@ + + + a + + + + + + + + + + + + + diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b1.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b1.jar new file mode 100644 index 000000000..619fa9368 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b1.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b2.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b2.jar new file mode 100644 index 000000000..619fa9368 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b2.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b3.jar b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b3.jar new file mode 100644 index 000000000..1c3f8c4e1 Binary files /dev/null and b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/b3.jar differ diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/ivy.xml b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/ivy.xml new file mode 100644 index 000000000..a734f26d0 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/repo/a/b/1.0.1/ivy.xml @@ -0,0 +1,16 @@ + + + a + + + + + + + + + + + + + diff --git a/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/test b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/test new file mode 100644 index 000000000..6fdf810e0 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/cached-resolution-configurations/test @@ -0,0 +1,11 @@ +# In this test, we have a project `a`, on which a project `b` depends. +# project `a` has a library dependency on: +# - "a" % "b" % "1.0.0" % "compile->runtime" +# - "a" % "b" % "1.0.0" % "compile->runtime2" +# project "b" depends on: +# - project `a` +# - "b" % "b" % "1.0.1" % "compile->runtime" +# "a" % "b" % "1.0.0" will be evicted in favor of "a" % "b" % "1.0.1", but we +# have to keep the dependency on the two configurations "runtime" and "runtime2". +# This test makes sure that we actually do. +> compile