Skip to content
This repository was archived by the owner on Aug 5, 2024. It is now read-only.

Commit 9ad762b

Browse files
sellophaneSpace Team
authored andcommitted
[fix] adding fallback for custom bazel version | #BAZEL-648 Done
Merge-request: BAZEL-MR-597 Merged-by: Blazej Kardys <[email protected]>
1 parent c4503eb commit 9ad762b

File tree

8 files changed

+82
-13
lines changed

8 files changed

+82
-13
lines changed

bazelrunner/src/main/kotlin/org/jetbrains/bsp/bazel/bazelrunner/BazelInfo.kt

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.jetbrains.bsp.bazel.bazelrunner
22

3-
import java.lang.RuntimeException
43
import java.nio.file.Path
4+
import kotlin.io.path.isReadable
5+
import kotlin.io.path.readText
56

67
interface BazelInfo {
78
val execRoot: String
@@ -21,12 +22,30 @@ data class BazelRelease(
2122
}
2223

2324
companion object {
24-
fun fromReleaseString(versionString: String): BazelRelease {
25-
val major = """(?<=release )\d+(?=[0-9.]*)""".toRegex().find(versionString)?.value?.toInt()!!
26-
return BazelRelease(major)
25+
fun fromReleaseString(versionString: String): BazelRelease? =
26+
VERSION_REGEX.find(versionString)?.toBazelRelease()
27+
28+
fun fromBazelVersionFile(workspacePath: Path): BazelRelease? {
29+
val versionString = workspacePath.resolve(".bazelversion")
30+
.takeIf { it.isReadable() }
31+
?.readText()
32+
.orEmpty()
33+
return BAZEL_VERSION_MAJOR_REGEX.find(versionString)?.toBazelRelease()
2734
}
35+
36+
private fun MatchResult.toBazelRelease() =
37+
BazelRelease(value.toInt())
38+
39+
internal val LATEST_SUPPORTED_MAJOR = BazelRelease(6)
40+
41+
private val BAZEL_VERSION_MAJOR_REGEX = """^\d+""".toRegex()
42+
43+
private val VERSION_REGEX = """(?<=release )\d+(?=[0-9.]*)""".toRegex()
2844
}
2945
}
46+
47+
fun BazelRelease?.orLatestSupported() = this ?: BazelRelease.LATEST_SUPPORTED_MAJOR
48+
3049
data class BasicBazelInfo(
3150
override val execRoot: String,
3251
override val outputBase: Path,

bazelrunner/src/main/kotlin/org/jetbrains/bsp/bazel/bazelrunner/BazelInfoResolver.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,14 @@ class BazelInfoResolver(
3434
?: error("Failed to resolve $name from bazel info in ${bazelRunner.workspaceRoot}. " +
3535
"Bazel Info output: '${bazelProcessResult.meaningfulOutput().escapeNewLines()}'")
3636

37+
fun obtainBazelReleaseVersion() = BazelRelease.fromReleaseString(extract("release")) ?:
38+
bazelRunner.workspaceRoot?.let { BazelRelease.fromBazelVersionFile(it) }.orLatestSupported()
39+
3740
return BasicBazelInfo(
3841
execRoot = extract("execution_root"),
3942
outputBase = Paths.get(extract("output_base")),
4043
workspaceRoot = Paths.get(extract("workspace")),
41-
release = BazelRelease.fromReleaseString(extract("release"))
44+
release = obtainBazelReleaseVersion()
4245
)
4346
}
4447

bazelrunner/src/test/kotlin/org/jetbrains/bsp/bazel/bazelrunner/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ kt_test(
1313
name = "BazelReleaseTest",
1414
size = "small",
1515
src = "BazelReleaseTest.kt",
16+
resources = ["//bazelrunner/src/test/resources:workspace"],
1617
deps = [
1718
"//bazelrunner/src/main/kotlin/org/jetbrains/bsp/bazel/bazelrunner",
1819
],
Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package org.jetbrains.bsp.bazel.bazelrunner
22

3+
import com.google.common.base.Charsets
34
import io.kotest.matchers.shouldBe
45
import org.junit.jupiter.api.Test
6+
import java.nio.file.Path
7+
import kotlin.io.path.createDirectories
8+
import kotlin.io.path.createTempDirectory
9+
import kotlin.io.path.writeText
510

611
class BazelReleaseTest {
712

@@ -11,8 +16,8 @@ class BazelReleaseTest {
1116
val release = BazelRelease.fromReleaseString("release 4.0.0")
1217

1318
// then
14-
release.major shouldBe 4
15-
release.mainRepositoryReferencePrefix() shouldBe "//"
19+
release?.major shouldBe 4
20+
release?.mainRepositoryReferencePrefix() shouldBe "//"
1621
}
1722

1823
@Test
@@ -21,8 +26,8 @@ class BazelReleaseTest {
2126
val release = BazelRelease.fromReleaseString("release 6.0.0")
2227

2328
// then
24-
release.major shouldBe 6
25-
release.mainRepositoryReferencePrefix() shouldBe "@//"
29+
release?.major shouldBe 6
30+
release?.mainRepositoryReferencePrefix() shouldBe "@//"
2631
}
2732

2833
@Test
@@ -31,7 +36,7 @@ class BazelReleaseTest {
3136
val release = BazelRelease.fromReleaseString("release 6.0.0-pre20230102")
3237

3338
// then
34-
release.major shouldBe 6
39+
release?.major shouldBe 6
3540
}
3641

3742
@Test
@@ -40,6 +45,34 @@ class BazelReleaseTest {
4045
val release = BazelRelease.fromReleaseString("release 16.0.0")
4146

4247
// then
43-
release.major shouldBe 16
48+
release?.major shouldBe 16
49+
}
50+
51+
@Test
52+
fun `should fall back to last supported version in case of error`() {
53+
// given & when
54+
val release = BazelRelease.fromReleaseString("debug test").orLatestSupported()
55+
56+
// then
57+
release.major shouldBe 6
58+
}
59+
60+
@Test
61+
fun `should correctly parse bazelversion`() {
62+
// given & when
63+
val path = copyBazelVersionToTmp()
64+
val release = BazelRelease.fromBazelVersionFile(path.parent)
65+
66+
// then
67+
release?.major shouldBe 6
68+
}
69+
70+
private fun copyBazelVersionToTmp() : Path {
71+
val inputStream = BazelReleaseTest::class.java.getResourceAsStream("/.bazelversion")
72+
val content = inputStream?.bufferedReader(Charsets.UTF_8)?.readText()
73+
val tempDir = createTempDirectory("workspace").createDirectories()
74+
val tempFile = tempDir.resolve(".bazelversion")
75+
content?.let { tempFile.writeText(it) }
76+
return tempFile
4477
}
4578
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6.3.0

bazelrunner/src/test/resources/BUILD

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
filegroup(
2+
name = "workspace",
3+
srcs = [".bazelversion"],
4+
visibility = ["//bazelrunner/src/test/kotlin/org/jetbrains/bsp/bazel:__subpackages__"],
5+
)

server/src/test/kotlin/org/jetbrains/bsp/bazel/server/sync/languages/LanguagePluginServiceTest.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.kotest.matchers.shouldBe
44
import io.kotest.matchers.shouldNotBe
55
import org.jetbrains.bsp.bazel.bazelrunner.BasicBazelInfo
66
import org.jetbrains.bsp.bazel.bazelrunner.BazelRelease
7+
import org.jetbrains.bsp.bazel.bazelrunner.orLatestSupported
78
import org.jetbrains.bsp.bazel.server.sync.BazelPathsResolver
89
import org.jetbrains.bsp.bazel.server.sync.languages.cpp.CppLanguagePlugin
910
import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaLanguagePlugin
@@ -31,7 +32,12 @@ class LanguagePluginServiceTest {
3132

3233
@BeforeEach
3334
fun beforeEach() {
34-
val bazelInfo = BasicBazelInfo("", Paths.get(""), Paths.get(""), BazelRelease.fromReleaseString("release 6.0.0"))
35+
val bazelInfo = BasicBazelInfo(
36+
execRoot = "",
37+
outputBase = Paths.get(""),
38+
workspaceRoot = Paths.get(""),
39+
release = BazelRelease.fromReleaseString("release 6.0.0").orLatestSupported(),
40+
)
3541
val bazelPathsResolver = BazelPathsResolver(bazelInfo)
3642
val jdkResolver = JdkResolver(bazelPathsResolver, JdkVersionResolver())
3743
val javaLanguagePlugin = JavaLanguagePlugin(bazelPathsResolver, jdkResolver, bazelInfo)

server/src/test/kotlin/org/jetbrains/bsp/bazel/server/sync/languages/java/IdeClasspathResolverTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.jetbrains.bsp.bazel.server.sync.languages.java
33
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
44
import org.jetbrains.bsp.bazel.bazelrunner.BasicBazelInfo
55
import org.jetbrains.bsp.bazel.bazelrunner.BazelRelease
6+
import org.jetbrains.bsp.bazel.bazelrunner.orLatestSupported
67
import org.jetbrains.bsp.bazel.server.sync.BazelPathsResolver
78
import org.jetbrains.bsp.bazel.server.sync.model.Label
89
import org.junit.jupiter.api.BeforeEach
@@ -23,7 +24,7 @@ class IdeClasspathResolverTest {
2324
execRoot = execRoot,
2425
outputBase = Paths.get(outputBase),
2526
workspaceRoot = Paths.get("/Users/user/workspace/bazel-bsp"),
26-
release = BazelRelease.fromReleaseString("release 6.0.0")
27+
release = BazelRelease.fromReleaseString("release 6.0.0").orLatestSupported()
2728
)
2829

2930
bazelPathsResolver = BazelPathsResolver(bazelInfo)

0 commit comments

Comments
 (0)