diff --git a/core/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala b/core/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala index 12a8fbf69..e9c9c242b 100644 --- a/core/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala +++ b/core/src/main/scala/sbt/librarymanagement/UpdateReportExtra.scala @@ -70,7 +70,7 @@ abstract class ModuleReportExtra { reportStr("problem", problem) + reportStr("homepage", homepage) + reportStr( - "textraAttributes", + "extraAttributes", if (extraAttributes.isEmpty) None else { Some(extraAttributes.toString) } ) + diff --git a/ivy/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala b/ivy/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala index 75616642f..7f751ba3d 100644 --- a/ivy/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala +++ b/ivy/src/main/scala/sbt/internal/librarymanagement/ivyint/CachedResolutionResolveEngine.scala @@ -180,17 +180,25 @@ private[sbt] class CachedResolutionResolveCache { ): Either[ResolveException, UpdateReport] = { import sbt.io.syntax._ val mrid = md.getResolvedModuleRevisionId - val (pathOrg, pathName, pathRevision) = md match { + def extraPath(id: ModuleRevisionId, key: String, pattern: String): String = + Option(id.getExtraAttribute(key)).fold(".")(pattern.format(_)) // "." has no affect on paths + def scalaVersion(id: ModuleRevisionId): String = extraPath(id, "e:scalaVersion", "scala_%s") + def sbtVersion(id: ModuleRevisionId): String = extraPath(id, "e:sbtVersion", "sbt_%s") + val (pathOrg, pathName, pathRevision, pathScalaVersion, pathSbtVersion) = md match { case x: ArtificialModuleDescriptor => val tmrid = x.targetModuleRevisionId - (tmrid.getOrganisation, tmrid.getName, tmrid.getRevision + "_" + mrid.getName) + (tmrid.getOrganisation, + tmrid.getName, + tmrid.getRevision + "_" + mrid.getName, + scalaVersion(tmrid), + sbtVersion(tmrid)) case _ => - (mrid.getOrganisation, mrid.getName, mrid.getRevision) + (mrid.getOrganisation, mrid.getName, mrid.getRevision, scalaVersion(mrid), sbtVersion(mrid)) } val staticGraphDirectory = miniGraphPath / "static" val dynamicGraphDirectory = miniGraphPath / "dynamic" - val staticGraphPath = staticGraphDirectory / pathOrg / pathName / pathRevision / "graphs" / "graph.json" - val dynamicGraphPath = dynamicGraphDirectory / todayStr / logicalClock.toString / pathOrg / pathName / pathRevision / "graphs" / "graph.json" + val staticGraphPath = staticGraphDirectory / pathScalaVersion / pathSbtVersion / pathOrg / pathName / pathRevision / "graphs" / "graph.json" + val dynamicGraphPath = dynamicGraphDirectory / todayStr / logicalClock.toString / pathScalaVersion / pathSbtVersion / pathOrg / pathName / pathRevision / "graphs" / "graph.json" def cleanDynamicGraph(): Unit = { val list = IO.listFiles(dynamicGraphDirectory, DirectoryFilter).toList list filterNot { d => diff --git a/ivy/src/test/scala/CachedResolutionSpec.scala b/ivy/src/test/scala/CachedResolutionSpec.scala index ebab80288..e16a864ab 100644 --- a/ivy/src/test/scala/CachedResolutionSpec.scala +++ b/ivy/src/test/scala/CachedResolutionSpec.scala @@ -1,5 +1,6 @@ package sbt.internal.librarymanagement +import org.scalatest.LoneElement._ import sbt.util.ShowLines import sbt.librarymanagement._ import sbt.librarymanagement.ivy.UpdateOptions @@ -7,6 +8,11 @@ import sbt.librarymanagement.ivy.UpdateOptions class CachedResolutionSpec extends BaseIvySpecification { import ShowLines._ + override val resolvers = Vector( + Resolver.mavenCentral, + Resolver.sbtPluginRepo("releases") + ) + "Resolving the same module twice" should "work" in { cleanIvyCache() val m = module( @@ -76,6 +82,30 @@ class CachedResolutionSpec extends BaseIvySpecification { })) } + "Resolving a module with sbt cross build" should "work" in { + cleanIvyCache() + val attributes013 = Map("e:sbtVersion" -> "0.13", "e:scalaVersion" -> "2.10") + val attributes10 = Map("e:sbtVersion" -> "1.0", "e:scalaVersion" -> "2.12") + val module013 = module( + ModuleID("com.example", "foo", "0.4.0").withConfigurations(Some("compile")), + Vector(sbtRelease.withExtraAttributes(attributes013)), + Some("2.10.6"), + UpdateOptions().withCachedResolution(true) + ) + val module10 = module( + ModuleID("com.example", "foo", "0.4.0").withConfigurations(Some("compile")), + Vector(sbtRelease.withExtraAttributes(attributes10)), + Some("2.12.3"), + UpdateOptions().withCachedResolution(true) + ) + ivyUpdate(module013).configurations.head.modules.map(_.toString).loneElement should include( + "com.github.gseitz:sbt-release:1.0.6 (scalaVersion=2.10, sbtVersion=0.13)" + ) + ivyUpdate(module10).configurations.head.modules.map(_.toString).loneElement should include( + "com.github.gseitz:sbt-release:1.0.6 (scalaVersion=2.12, sbtVersion=1.0)" + ) + } + def commonsIo13 = ModuleID("commons-io", "commons-io", "1.3").withConfigurations(Some("compile")) def mavenCayennePlugin302 = ModuleID("org.apache.cayenne.plugins", "maven-cayenne-plugin", "3.0.2").withConfigurations( @@ -85,6 +115,8 @@ class CachedResolutionSpec extends BaseIvySpecification { ModuleID("com.linkedin.pegasus", "data-avro", "1.9.40").withConfigurations(Some("compile")) def netty320 = ModuleID("org.jboss.netty", "netty", "3.2.0.Final").withConfigurations(Some("compile")) + def sbtRelease = + ModuleID("com.github.gseitz", "sbt-release", "1.0.6").withConfigurations(Some("compile")) def defaultOptions = EvictionWarningOptions.default }