diff --git a/ivy/src/main/scala/sbt/IvyScala.scala b/ivy/src/main/scala/sbt/IvyScala.scala
index 0c43f662b..43b3f112e 100644
--- a/ivy/src/main/scala/sbt/IvyScala.scala
+++ b/ivy/src/main/scala/sbt/IvyScala.scala
@@ -64,13 +64,24 @@ private object IvyScala {
// Mediate only for the dependencies in scalaVersion configurations. https://github.com/sbt/sbt/issues/2786
def configQualifies: Boolean =
(dd.getModuleConfigurations exists { scalaVersionConfigs })
+ // Do not rewrite the dependencies of Scala dependencies themselves, this prevents bootstrapping
+ // a Scala compiler using another Scala compiler.
+ def dependeeQualifies: Boolean =
+ dd.getParentRevisionId == null || (
+ dd.getParentRevisionId.getName match {
+ case name @ (CompilerID | LibraryID | ReflectID | ActorsID | ScalapID) =>
+ false
+ case _ =>
+ true
+ }
+ )
val transformer =
new NamespaceTransformer {
def transform(mrid: ModuleRevisionId): ModuleRevisionId = {
if (mrid == null) mrid
else
mrid.getName match {
- case name @ (CompilerID | LibraryID | ReflectID | ActorsID | ScalapID) if configQualifies =>
+ case name @ (CompilerID | LibraryID | ReflectID | ActorsID | ScalapID) if configQualifies && dependeeQualifies =>
ModuleRevisionId.newInstance(scalaOrganization, name, mrid.getBranch, scalaVersion, mrid.getQualifiedExtraAttributes)
case _ => mrid
}
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/build.sbt b/sbt/src/sbt-test/dependency-management/scala-bootstrap/build.sbt
new file mode 100644
index 000000000..3e326e3fa
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/build.sbt
@@ -0,0 +1,43 @@
+organization := "org.dummy"
+
+scalaOrganization := "org.foo"
+
+scalaVersion := "2.99.0"
+
+resolvers += Resolver.file("buggy", (baseDirectory in LocalRootProject).value / "repo")(
+ Patterns(
+ ivyPatterns = Seq("[organization]/[module]/[revision]/ivy.xml"),
+ artifactPatterns = Seq("[organization]/[module]/[revision]/dummy.jar"),
+ isMavenCompatible = false,
+ descriptorOptional = true,
+ skipConsistencyCheck = true
+ )
+)
+
+libraryDependencies += "org.scala-lang.modules" % "scala-parser-combinators_2.11" % "1.0.5"
+
+// Adapted from the scala-organization test
+val checkDependencies = taskKey[Unit]("Checks that dependencies are correct.")
+
+checkDependencies := {
+ val expected: Set[ModuleID] = Set(
+ "org.foo" % "scala-library" % "2.99.0",
+ "org.foo" % "scala-compiler" % "2.99.0",
+
+ "org.scala-lang" % "scala-library" % "2.11.8",
+ "org.scala-lang" % "scala-compiler" % "2.11.8",
+ "org.scala-lang" % "scala-reflect" % "2.11.8",
+
+ "org.scala-lang.modules" % "scala-parser-combinators_2.11" % "1.0.5",
+ "org.scala-lang.modules" % "scala-xml_2.11" % "1.0.4",
+ "org.scala-lang.modules" % "scala-parser-combinators_2.11" % "1.0.4"
+ )
+
+ val resolved: Set[ModuleID] =
+ (for {
+ c <- update.value.configurations
+ m <- c.modules
+ if !m.evicted
+ } yield m.module.copy(extraAttributes = Map.empty)).toSet
+ assert(resolved == expected)
+}
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/dummy.jar b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/dummy.jar
new file mode 100644
index 000000000..e69de29bb
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/ivy.xml b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/ivy.xml
new file mode 100644
index 000000000..58789e5a0
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/ivy.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ scala-compiler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/dummy.jar b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/dummy.jar
new file mode 100644
index 000000000..e69de29bb
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/ivy.xml b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/ivy.xml
new file mode 100644
index 000000000..173e6d28c
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/ivy.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ scala-library
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/dummy.jar b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/dummy.jar
new file mode 100644
index 000000000..e69de29bb
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/ivy.xml b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/ivy.xml
new file mode 100644
index 000000000..494adb7d5
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/ivy.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ scala-reflect
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/dummy.jar b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/dummy.jar
new file mode 100644
index 000000000..e69de29bb
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/ivy.xml b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/ivy.xml
new file mode 100644
index 000000000..af1f617f7
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/ivy.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+ scalap
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sbt/src/sbt-test/dependency-management/scala-bootstrap/test b/sbt/src/sbt-test/dependency-management/scala-bootstrap/test
new file mode 100644
index 000000000..9329a1c80
--- /dev/null
+++ b/sbt/src/sbt-test/dependency-management/scala-bootstrap/test
@@ -0,0 +1 @@
+> checkDependencies
diff --git a/sbt/src/sbt-test/dependency-management/snapshot-resolution/test b/sbt/src/sbt-test/dependency-management/snapshot-resolution/test
index 85317974a..0b6a7eedb 100644
--- a/sbt/src/sbt-test/dependency-management/snapshot-resolution/test
+++ b/sbt/src/sbt-test/dependency-management/snapshot-resolution/test
@@ -18,6 +18,8 @@ $ sleep 1000
# Now let's try this on the opposite order: pubishLocal => publish
$ copy-file changes/BadCommon.scala common/src/main/scala/Common.scala
+# Sleep to ensure timestamp change
+$ sleep 1000
> common/publishLocal
# Force dep resolution to be successful, then compilation to fail