From 4b9533b12488b20c0484a23072409e1af2714978 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 9 May 2019 01:59:03 -0400 Subject: [PATCH] ignore bad SDKMAN directories Fixes #4655 --- .../main/scala/sbt/internal/CrossJava.scala | 24 +++++++++----- .../scala/sbt/internal/CrossJavaTest.scala | 32 +++++++++++++++---- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index eea281007..9501a19eb 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -11,6 +11,7 @@ package internal import java.io.File import scala.collection.immutable.ListMap import scala.annotation.tailrec +import scala.util.{ Try, Success, Failure } import sbt.io.Path import sbt.io.syntax._ import sbt.Cross._ @@ -45,7 +46,7 @@ private[sbt] object CrossJava { } } - def parseSdkmanString(version: String): JavaVersion = { + def parseSdkmanString(version: String): Try[JavaVersion] = Try { val Num = """([0-9]+)""".r def splitDash(str: String): Vector[String] = Option(str) match { @@ -60,13 +61,19 @@ private[sbt] object CrossJava { splitDash(version) match { case xs if xs.size < 2 => sys.error(s"Invalid SDKMAN Java version: $version") case xs => - val ds = splitDot(xs.init.head) + val first = xs.init.head + val ds = + if (!first.contains(".") && first.contains("u")) splitDot(first.replaceFirst("u", ".0.")) + else splitDot(first) val nums = ds.takeWhile( _ match { case Num(_) => true case _ => false } ) map { _.toLong } + if (nums.isEmpty) { + sys.error(s"Invalid SDKMAN Java version: $version") + } val nonNum = ds.drop(nums.size).mkString("") // last dash indicates vendor code val (vnd0, tag0) = (xs.last, nonNum) match { @@ -424,12 +431,13 @@ private[sbt] object CrossJava { val base: File = Path.userHome / ".sdkman" / "candidates" / "java" def candidates(): Vector[String] = wrapNull(base.list()) def javaHomes: Vector[(String, File)] = - candidates - .collect { - case dir if dir.contains("-") => - val v = CrossJava.parseSdkmanString(dir).toString - v -> (base / dir) - } + candidates.collect { + case dir if dir.contains("-") => + CrossJava.parseSdkmanString(dir) match { + case Success(v) => Some(v.toString -> (base / dir)) + case Failure(_) => None + } + }.flatten } class WindowsDiscoverConfig(base: File) extends JavaDiscoverConf { diff --git a/main/src/test/scala/sbt/internal/CrossJavaTest.scala b/main/src/test/scala/sbt/internal/CrossJavaTest.scala index 2a9aba62b..f409c9216 100644 --- a/main/src/test/scala/sbt/internal/CrossJavaTest.scala +++ b/main/src/test/scala/sbt/internal/CrossJavaTest.scala @@ -97,18 +97,21 @@ class CrossJavaTest extends FunSuite with DiagrammedAssertions { test("SDKMAN candidate parsing") { assert( CrossJava - .parseSdkmanString("11.0.2.hs-adpt") == JavaVersion(Vector(11L, 0L, 2L), Some("adopt")) + .parseSdkmanString("11.0.2.hs-adpt") + .get == JavaVersion(Vector(11L, 0L, 2L), Some("adopt")) ) assert( CrossJava - .parseSdkmanString("11.0.2.j9-adpt") == JavaVersion( + .parseSdkmanString("11.0.2.j9-adpt") + .get == JavaVersion( Vector(11L, 0L, 2L), Some("adopt-openj9") ) ) assert( CrossJava - .parseSdkmanString("13.ea.13-open") == JavaVersion( + .parseSdkmanString("13.ea.13-open") + .get == JavaVersion( Vector(13L), Vector("ea13"), Some("openjdk") @@ -116,21 +119,38 @@ class CrossJavaTest extends FunSuite with DiagrammedAssertions { ) assert( CrossJava - .parseSdkmanString("12.0.0-zulu") == JavaVersion( + .parseSdkmanString("12.0.0-zulu") + .get == JavaVersion( Vector(12L, 0L, 0L), Some("zulu") ) ) assert( CrossJava - .parseSdkmanString("8.0.201-oracle") == JavaVersion( + .parseSdkmanString("8u152-zulu") + .get == JavaVersion( + Vector(8L, 0L, 152L), + Vector(), + Some("zulu") + ) + ) + assert( + CrossJava + .parseSdkmanString("8x152-zulu") + .isFailure + ) + assert( + CrossJava + .parseSdkmanString("8.0.201-oracle") + .get == JavaVersion( Vector(8L, 0L, 201L), Some("oracle") ) ) assert( CrossJava - .parseSdkmanString("1.0.0-rc-14-grl") == JavaVersion( + .parseSdkmanString("1.0.0-rc-14-grl") + .get == JavaVersion( Vector(1L, 0L, 0L), Vector("rc14"), Some("graalvm")