Fixes sbtApiVersion logic

The NonRelease pattern matcher is ony checking for the third segment, but for sbt 1.x, we need to check both the second and third segment since 1.1.0-M1 would be bincompat with 1.0.

Fixes sbt/sbt#3360
This commit is contained in:
Eugene Yokota 2017-07-23 02:34:36 -04:00
parent 63867968bb
commit c3ebcd64d8
2 changed files with 46 additions and 5 deletions

View File

@ -60,6 +60,36 @@ object CrossVersionTest extends Specification {
"return binary sbt version for 0.12.1 as 0.12" in {
CrossVersion.binarySbtVersion("0.12.1") must_== "0.12"
}
"return binary sbt version for 1.0.0-M6 as 1.0.0-M6" in {
CrossVersion.binarySbtVersion("1.0.0-M6") must_== "1.0.0-M6"
}
"return binary sbt version for 1.0.0-RC1 as 1.0" in {
CrossVersion.binarySbtVersion("1.0.0-RC1") must_== "1.0"
}
"return binary sbt version for 1.0.0 as 1.0" in {
CrossVersion.binarySbtVersion("1.0.0") must_== "1.0"
}
"return binary sbt version for 1.0.2-M1 as 1.0" in {
CrossVersion.binarySbtVersion("1.0.2-M1") must_== "1.0"
}
"return binary sbt version for 1.0.2-RC1 as 1.0" in {
CrossVersion.binarySbtVersion("1.0.2-RC1") must_== "1.0"
}
"return binary sbt version for 1.0.2 as 1.0" in {
CrossVersion.binarySbtVersion("1.0.2") must_== "1.0"
}
"return binary sbt version for 1.3.0 as 1.0" in {
CrossVersion.binarySbtVersion("1.3.0") must_== "1.0"
}
"return binary sbt version for 1.3.0-SNAPSHOT as 1.0" in {
CrossVersion.binarySbtVersion("1.3.0-SNAPSHOT") must_== "1.0"
}
"return binary sbt version for 1.10.0 as 1.0" in {
CrossVersion.binarySbtVersion("1.10.0") must_== "1.0"
}
"return binary sbt version for 2.0.0 as 2.0" in {
CrossVersion.binarySbtVersion("2.0.0") must_== "2.0"
}
"return Scala API for xyz as None" in {
CrossVersion.scalaApiVersion("xyz") must_== None
@ -121,11 +151,9 @@ object CrossVersionTest extends Specification {
"return binary Scala version for 2.20170314093845.0-87654321 as 2.20170314093845.0-87654321" in {
CrossVersion.binaryScalaVersion("2.20170314093845.0-87654321") must_== "2.20170314093845.0-87654321"
}
"return binary Scala version for Dotty 0.1.1 as 0.1" in {
CrossVersion.binaryScalaVersion("0.1.1") must_== "0.1"
}
"return patch Scala version for 2.11.8 as 2.11.8" in {
CrossVersion(CrossVersion.patch, "2.11.8", "dummy").map(_("artefact")) must_== Some("artefact_2.11.8")
}

View File

@ -30,12 +30,25 @@ object CrossVersionUtil
val CandidateV = (basicVersion + """(-RC\d+)""").r
val NonReleaseV = (basicVersion + """([-\w+]*)""").r
v match {
case ReleaseV(x, y, z, ht) => Some((x.toInt, y.toInt))
case CandidateV(x, y, z, ht) => Some((x.toInt, y.toInt))
case NonReleaseV(x, y, z, ht) if z.toInt > 0 => Some((x.toInt, y.toInt))
case ReleaseV(x, y, z, ht) => Some(sbtApiVersion(x.toInt, y.toInt))
case CandidateV(x, y, z, ht) => Some(sbtApiVersion(x.toInt, y.toInt))
case NonReleaseV(x, y, z, ht) if x.toInt == 0 && z.toInt > 0 =>
Some(sbtApiVersion(x.toInt, y.toInt))
case NonReleaseV(x, y, z, _) if x.toInt > 0 && (y.toInt > 0 || z.toInt > 0) =>
Some(sbtApiVersion(x.toInt, y.toInt))
case _ => None
}
}
private[${{cross.package0}}] def sbtApiVersion(x: Int, y: Int): (Int, Int) = {
// Prior to sbt 1 the "sbt api version" was the X.Y in the X.Y.Z version.
// For example for sbt 0.13.x releases, the sbt api version is 0.13
// As of sbt 1 it is now X.0.
// This means, for example, that all versions of sbt 1.x have sbt api version 1.0
if (x > 0) (x, 0)
else (x, y)
}
private[${{cross.package0}}] def isScalaApiCompatible(v: String): Boolean = scalaApiVersion(v).isDefined
/** Returns Scala binary interface x.y API compatible with the given version string v.
* Compatibile versions include 2.10.0-1 and 2.10.1-M1 for Some(2, 10), but not 2.10.0-RC1.