diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/SbtBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/SbtBuildTool.scala index 4633bc92..dcafb928 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/SbtBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/SbtBuildTool.scala @@ -63,8 +63,13 @@ class SbtBuildTool(index: IndexCommand) extends BuildTool("sbt", index) { } private def isSupportedSbtVersion(version: String): Boolean = { - (!version.startsWith("0.13") || version.startsWith("0.13.17")) && - !version.startsWith("1.0") && !version.startsWith("1.1") + SbtBuildTool.isSupportedSbtVersion(version) match { + case Left(message) => + index.app.error(message) + false + case Right(value) => + value + } } private def sbtVersion(): Option[String] = { @@ -96,3 +101,30 @@ class SbtBuildTool(index: IndexCommand) extends BuildTool("sbt", index) { ) } } + +object SbtBuildTool { + def isSupportedSbtVersion(version: String): Either[String, Boolean] = { + SbtVersionParser.versionSegments(version) match { + case major :: minor :: patch :: _ => + Right { + (major == 0 && minor == 13 && patch >= 17) || + (major == 1 && minor >= 2) + } + + case _ => + Left( + s"Failed to parse SBT version: [$version]. Only SBT 0.13.17+ or SBT 1.2+ are supported" + ) + + } + } +} + +object SbtVersionParser { + def versionSegments(raw: String) = + raw + .takeWhile(c => c.isDigit || c == '.') + .split("\\.", 3) + .toList + .flatMap(_.toIntOption) +} diff --git a/tests/buildTools/src/test/scala/tests/SbtBuildToolSuite.scala b/tests/buildTools/src/test/scala/tests/SbtBuildToolSuite.scala index 7cd7f6ef..45004272 100644 --- a/tests/buildTools/src/test/scala/tests/SbtBuildToolSuite.scala +++ b/tests/buildTools/src/test/scala/tests/SbtBuildToolSuite.scala @@ -63,4 +63,4 @@ abstract class SbtBuildToolSuite(sbt: Tool.SBT) extends BaseBuildToolSuite { import Tool._ class Sbt_15_BuildToolSuite extends SbtBuildToolSuite(SBT15) -class Sbt_19_BuildToolSuite extends SbtBuildToolSuite(SBT19) +class Sbt_110_BuildToolSuite extends SbtBuildToolSuite(SBT110) diff --git a/tests/buildTools/src/test/scala/tests/Tool.scala b/tests/buildTools/src/test/scala/tests/Tool.scala index 0b1f56d2..7ad99d49 100644 --- a/tests/buildTools/src/test/scala/tests/Tool.scala +++ b/tests/buildTools/src/test/scala/tests/Tool.scala @@ -45,7 +45,7 @@ object Tool { extends Tool("sbt", version, support) // See https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html#build-tool-compatibility-table case object SBT15 extends SBT("1.5.2", atMostJava(17)) - case object SBT19 extends SBT("1.9.9", noRestrictions) + case object SBT110 extends SBT("1.10.0", noRestrictions) sealed abstract class Scala(version: String, support: JVMSupport) extends Tool("scala", version, support) diff --git a/tests/unit/src/test/scala/tests/SbtSupportedVersionsSuite.scala b/tests/unit/src/test/scala/tests/SbtSupportedVersionsSuite.scala new file mode 100644 index 00000000..d65d9b5f --- /dev/null +++ b/tests/unit/src/test/scala/tests/SbtSupportedVersionsSuite.scala @@ -0,0 +1,47 @@ +package tests + +import com.sourcegraph.scip_java.buildtools.SbtBuildTool +import com.sourcegraph.scip_java.buildtools.SbtVersionParser + +class SbtVersionParserSuite extends munit.FunSuite { + test("parsing sbt versions") { + import SbtVersionParser.{versionSegments => parse} + assertEquals(parse("1.9.7"), List(1, 9, 7)) + assertEquals(parse("1.10.0"), List(1, 10, 0)) + assertEquals(parse("1.10.0-RC1"), List(1, 10, 0)) + assertEquals(parse("0.13.17"), List(0, 13, 17)) + assertEquals(parse("0.13"), List(0, 13)) + } + + test("supported sbt versions") { + import SbtBuildTool.{isSupportedSbtVersion => check} + + def checkSupported(version: String) = { + assert(check(version).contains(true), check(version)) + } + + def checkUnsupported(version: String) = { + assert(check(version).contains(false), check(version)) + } + + def checkFailed(version: String) = { + assert(check(version).isLeft, check(version)) + } + + checkSupported("1.10.0-RC1") + checkSupported("0.13.17") + checkSupported("1.5.6") + checkSupported("1.9.7") + + checkUnsupported("1.0.0-RC1") + checkUnsupported("0.13.16") + checkUnsupported("1.1.6") + checkUnsupported("0.12.15") + + checkFailed("1.0-RC1") + checkFailed("0.13") + checkFailed("BLA") + checkFailed("") + } + +}