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 {
// parses jabba style version number adopt@1.8
def parseJavaVersion(version: String): JavaVersion = {
val Num = """([0-9]+)""".r
def splitDot(s: String): Vector[Long] =
Option(s) match {
case Some(x) => x.split('.').toVector.filterNot(_ == "").map(_.toLong)
case _ => Vector()
case Some(x) =>
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] =
Option(s) match {
case Some(x) => x.split('@').toVector
case _ => Vector()
Option(s).fold(Vector.empty[String])(_.split('@').toVector)
def parse0(str: String): JavaVersion =
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 {
case Vector(vendor, rest) => JavaVersion(splitDot(rest), Option(vendor))
case Vector(rest) => JavaVersion(splitDot(rest), None)
case Vector(vendor, rest) => parse0(rest).withVendor(vendor)
case Vector(rest) => parse0(rest)
case _ => sys.error(s"Invalid JavaVersion: $version")
}
}
@ -49,10 +58,7 @@ private[sbt] object CrossJava {
def parseSdkmanString(version: String): Try[JavaVersion] = Try {
val Num = """([0-9]+)""".r
def splitDash(str: String): Vector[String] =
Option(str) match {
case Some(x) => x.split('-').toVector
case _ => Vector()
}
Option(str).fold(Vector.empty[String])(_.split('-').toVector)
def splitDot(str: String): Vector[String] =
Option(str) match {
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")
)
)
}
}