From 41eca47e66306c2986e45c8bd4c672f0c7b83fec Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 29 May 2019 23:11:20 -0400 Subject: [PATCH] Fix Java version parsing Fixes #4731 --- .../main/scala/sbt/internal/CrossJava.scala | 28 +++++++++++-------- .../scala/sbt/internal/CrossJavaTest.scala | 24 ++++++++++++++++ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index 9501a19eb..3ff12112d 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -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(_ == "") diff --git a/main/src/test/scala/sbt/internal/CrossJavaTest.scala b/main/src/test/scala/sbt/internal/CrossJavaTest.scala index f409c9216..b7a21fdf6 100644 --- a/main/src/test/scala/sbt/internal/CrossJavaTest.scala +++ b/main/src/test/scala/sbt/internal/CrossJavaTest.scala @@ -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") + ) + ) + } }