From 0d0476eaa90a86fbf0db87fffa3d7e4792e2eb19 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sun, 8 Jan 2017 21:59:19 +0100 Subject: [PATCH 1/4] OverrideScalaMediator: fix bootstrapping a Scala compiler Fixes #2867, #2896 --- ivy/src/main/scala/sbt/IvyScala.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ivy/src/main/scala/sbt/IvyScala.scala b/ivy/src/main/scala/sbt/IvyScala.scala index 0c43f662b..20490ce54 100644 --- a/ivy/src/main/scala/sbt/IvyScala.scala +++ b/ivy/src/main/scala/sbt/IvyScala.scala @@ -64,13 +64,22 @@ 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.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 } From 89d5e96ed0bf4af0e36d69738eb9fa3f1c3278bf Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Sun, 8 Jan 2017 22:24:36 +0100 Subject: [PATCH 2/4] Add testcase for scala bootstrap Before the previous commit, this failed with: [error] (*:update) java.lang.IllegalArgumentException: a module is not authorized to depend on itself: org.foo#scala-library;2.99.0 --- .../scala-bootstrap/build.sbt | 43 +++++++++++++++++++ .../org.foo/scala-compiler/2.99.0/dummy.jar | 0 .../org.foo/scala-compiler/2.99.0/ivy.xml | 34 +++++++++++++++ .../org.foo/scala-library/2.99.0/dummy.jar | 0 .../repo/org.foo/scala-library/2.99.0/ivy.xml | 33 ++++++++++++++ .../org.foo/scala-reflect/2.99.0/dummy.jar | 0 .../repo/org.foo/scala-reflect/2.99.0/ivy.xml | 34 +++++++++++++++ .../repo/org.foo/scalap/2.99.0/dummy.jar | 0 .../repo/org.foo/scalap/2.99.0/ivy.xml | 35 +++++++++++++++ .../scala-bootstrap/test | 1 + 10 files changed, 180 insertions(+) create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/build.sbt create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/dummy.jar create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-compiler/2.99.0/ivy.xml create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/dummy.jar create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-library/2.99.0/ivy.xml create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/dummy.jar create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scala-reflect/2.99.0/ivy.xml create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/dummy.jar create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/repo/org.foo/scalap/2.99.0/ivy.xml create mode 100644 sbt/src/sbt-test/dependency-management/scala-bootstrap/test 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 From c76832fbc7af8674e49b9a89f3515f8aa8c3d8c1 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Mon, 9 Jan 2017 01:15:08 +0100 Subject: [PATCH 3/4] Avoid NullPointerException in sbt.ScalaOverrideTest --- ivy/src/main/scala/sbt/IvyScala.scala | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ivy/src/main/scala/sbt/IvyScala.scala b/ivy/src/main/scala/sbt/IvyScala.scala index 20490ce54..43b3f112e 100644 --- a/ivy/src/main/scala/sbt/IvyScala.scala +++ b/ivy/src/main/scala/sbt/IvyScala.scala @@ -67,12 +67,14 @@ private object IvyScala { // Do not rewrite the dependencies of Scala dependencies themselves, this prevents bootstrapping // a Scala compiler using another Scala compiler. def dependeeQualifies: Boolean = - dd.getParentRevisionId.getName match { - case name @ (CompilerID | LibraryID | ReflectID | ActorsID | ScalapID) => - false - case _ => - true - } + 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 = { From 47148f3fde099b0e4fd602781b59a1b1df287c0b Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Mon, 9 Jan 2017 03:49:03 +0100 Subject: [PATCH 4/4] snapshot-resolution: add a sleep to ensure timestamp change This test suddenly started failing for no reason at line 25, adding this sleep seems to have fixed that. Every other publish was preceded by a sleep in this test, so this makes some sense. --- sbt/src/sbt-test/dependency-management/snapshot-resolution/test | 2 ++ 1 file changed, 2 insertions(+) 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