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