Fix Java version parsing

Fixes #4731
This commit is contained in:
Eugene Yokota 2019-05-29 23:11:20 -04:00
parent 0994b7c104
commit 41eca47e66
2 changed files with 41 additions and 11 deletions

View File

@ -29,19 +29,28 @@ import sbt.internal.CommandStrings.{
private[sbt] object CrossJava { private[sbt] object CrossJava {
// parses jabba style version number adopt@1.8 // parses jabba style version number adopt@1.8
def parseJavaVersion(version: String): JavaVersion = { def parseJavaVersion(version: String): JavaVersion = {
val Num = """([0-9]+)""".r
def splitDot(s: String): Vector[Long] = def splitDot(s: String): Vector[Long] =
Option(s) match { Option(s) match {
case Some(x) => x.split('.').toVector.filterNot(_ == "").map(_.toLong) case Some(x) =>
case _ => Vector() x.split('.').toVector collect {
case Num(n) => n.toLong
}
case _ => Vector()
} }
def splitDash(str: String): Vector[String] =
Option(str).fold(Vector.empty[String])(_.split('-').toVector)
def splitAt(s: String): Vector[String] = def splitAt(s: String): Vector[String] =
Option(s) match { Option(s).fold(Vector.empty[String])(_.split('@').toVector)
case Some(x) => x.split('@').toVector def parse0(str: String): JavaVersion =
case _ => Vector() splitDash(str) match {
case Vector() => sys.error(s"Invalid JavaVersion: $version")
case Vector(h) => JavaVersion(splitDot(h), Vector(), None)
case xs => JavaVersion(splitDot(xs.head), xs.tail, None)
} }
splitAt(version) match { splitAt(version) match {
case Vector(vendor, rest) => JavaVersion(splitDot(rest), Option(vendor)) case Vector(vendor, rest) => parse0(rest).withVendor(vendor)
case Vector(rest) => JavaVersion(splitDot(rest), None) case Vector(rest) => parse0(rest)
case _ => sys.error(s"Invalid JavaVersion: $version") case _ => sys.error(s"Invalid JavaVersion: $version")
} }
} }
@ -49,10 +58,7 @@ private[sbt] object CrossJava {
def parseSdkmanString(version: String): Try[JavaVersion] = Try { def parseSdkmanString(version: String): Try[JavaVersion] = Try {
val Num = """([0-9]+)""".r val Num = """([0-9]+)""".r
def splitDash(str: String): Vector[String] = def splitDash(str: String): Vector[String] =
Option(str) match { Option(str).fold(Vector.empty[String])(_.split('-').toVector)
case Some(x) => x.split('-').toVector
case _ => Vector()
}
def splitDot(str: String): Vector[String] = def splitDot(str: String): Vector[String] =
Option(str) match { Option(str) match {
case Some(x) => x.split('.').toVector.filterNot(_ == "") case Some(x) => x.split('.').toVector.filterNot(_ == "")

View File

@ -157,4 +157,28 @@ class CrossJavaTest extends FunSuite with DiagrammedAssertions {
) )
) )
} }
test("SDKMAN version can round trip") {
assert(
CrossJava.parseJavaVersion(
CrossJava
.parseSdkmanString("11.0.2.hs-adpt")
.get
.toString
) == JavaVersion(Vector(11L, 0L, 2L), Some("adopt"))
)
assert(
CrossJava.parseJavaVersion(
CrossJava
.parseSdkmanString("1.0.0-rc-14-grl")
.get
.toString
) == JavaVersion(
Vector(1L, 0L, 0L),
Vector("rc14"),
Some("graalvm")
)
)
}
} }