@@ -14,6 +14,7 @@ import java.nio.file.Path
1414import java.util.concurrent.Callable
1515import java.util.concurrent.Executors
1616import java.util.concurrent.TimeUnit
17+ import java.util.function.Predicate
1718import java.util.zip.GZIPInputStream
1819import kotlin.io.path.createDirectories
1920import kotlin.io.path.exists
@@ -50,74 +51,95 @@ object BazelIntegrationTestRunner {
5051 }
5152 }
5253
53- unpack.resolve(" MODULE.bazel" )
54-
5554 val version = bazel.run (workspace, " --version" ).parseVersion()
5655
57- val bazelrc = version.resolveBazelRc(workspace)
56+ val workspaceFlags = FlagSets (
57+ sequence {
58+ if (workspace.hasModule()) {
59+ yield (
60+ listOf (
61+ Flag (" --override_module=rules_kotlin=$unpack " ),
62+ Flag (" --enable_workspace=false" ) { v -> v >= Version .Known (7 , 0 , 0 ) },
63+ ),
64+ )
65+ }
66+ if (workspace.hasWorkspace()) {
67+ yield (
68+ listOf (
69+ Flag (" --override_repository=rules_kotlin=$unpack " ),
70+ Flag (" --enable_workspace=true" ) { v -> v < Version .Known (7 , 0 , 0 ) },
71+ ),
72+ )
73+ }
74+ }.toList(),
75+ )
5876
59- listOf (true , false ).filter { bzlmod ->
60- bzlmod && workspace.hasModule() || ! bzlmod && workspace.hasWorkspace()
61- }.forEach { bzlmod ->
62- listOf (true , false ).forEach { buildToolsApi ->
63- println (" Starting bzlmod $bzlmod test" )
64- val overrideFlag =
65- if (bzlmod) " --override_module=rules_kotlin=$unpack " else " --override_repository=rules_kotlin=$unpack "
66- bazel.run (
67- workspace,
68- " --bazelrc=$bazelrc " ,
69- " clean" ,
70- " --expunge" ,
71- " --async" ,
72- ).onFailThrow()
77+ val deprecationFlags = FlagSets (
78+ listOf (
79+ listOf (
80+ // TODO[https://github.com/bazelbuild/rules_kotlin/issues/1395]: enable when rules_android
81+ // no longer uses local_config_platform
82+ Flag (" --incompatible_disable_native_repo_rules=true" ) { false },
83+ Flag (" --incompatible_autoload_externally=" ) { v -> v > Version .Known (8 , 0 , 0 ) },
84+ Flag (" --incompatible_disallow_empty_glob=false" ),
85+ ),
86+ ),
87+ )
88+
89+ val experimentFlags = FlagSets (
90+ listOf (
91+ listOf (
92+ Flag (" --@rules_kotlin//kotlin/settings:experimental_build_tools_api=false" ),
93+ ),
94+ listOf (
95+ Flag (" --@rules_kotlin//kotlin/settings:experimental_build_tools_api=true" ),
96+ ),
97+ ),
98+ )
99+
100+ val systemFlagSets = workspaceFlags * version.resolveBazelRc(workspace)
101+ val commandFlagSets = deprecationFlags * experimentFlags
102+
103+ systemFlagSets.asStringsFor(version).forEach { systemFlags ->
104+ commandFlagSets.asStringsFor(version).forEach { commandFlags ->
73105 bazel.run (
74106 workspace,
75- " --bazelrc= $bazelrc " ,
107+ * systemFlags ,
76108 " shutdown" ,
77109 ).onFailThrow()
78110 bazel.run (
79111 workspace,
80- " --bazelrc= $bazelrc " ,
112+ * systemFlags ,
81113 " info" ,
82- * version.workspaceFlag(bzlmod),
83- overrideFlag,
114+ * commandFlags,
84115 ).onFailThrow()
85116 bazel.run (
86117 workspace,
87- " --bazelrc= $bazelrc " ,
118+ * systemFlags ,
88119 " build" ,
89- overrideFlag,
90- " --incompatible_disallow_empty_glob=false" ,
91- " --@rules_kotlin//kotlin/settings:experimental_build_tools_api=${buildToolsApi} " ,
120+ * commandFlags,
92121 " //..." ,
93- * version.workspaceFlag(bzlmod),
94122 ).onFailThrow()
95123 bazel.run (
96124 workspace,
97- " --bazelrc= $bazelrc " ,
125+ * systemFlags ,
98126 " query" ,
99- overrideFlag,
100- " --incompatible_disallow_empty_glob=false" ,
127+ * commandFlags,
101128 " @rules_kotlin//..." ,
102- * version.workspaceFlag(bzlmod),
103129 ).onFailThrow()
104130 bazel.run (
105131 workspace,
106- " --bazelrc= $bazelrc " ,
132+ * systemFlags ,
107133 " query" ,
108- * version.workspaceFlag(bzlmod),
109- overrideFlag,
110- " --incompatible_disallow_empty_glob=false" ,
134+ * commandFlags,
111135 " kind(\" .*_test\" , \" //...\" )" ,
112136 ).ok { process ->
113137 if (process.stdOut.isNotEmpty()) {
114138 bazel.run (
115139 workspace,
116- " --bazelrc= $bazelrc " ,
140+ * systemFlags ,
117141 " test" ,
118- * version.workspaceFlag(bzlmod),
119- overrideFlag,
120- " --@rules_kotlin//kotlin/settings:experimental_build_tools_api=${buildToolsApi} " ,
142+ * commandFlags,
121143 " --test_output=all" ,
122144 " //..." ,
123145 ).onFailThrow()
@@ -127,59 +149,82 @@ object BazelIntegrationTestRunner {
127149 }
128150 }
129151
152+ class Flag (val value : String , val condition : Predicate <Version >) {
153+ constructor (value: String ) : this (value, { true })
154+ }
155+
156+ class FlagSets (val sets : List <List <Flag >>) {
157+
158+ operator fun times (other : FlagSets ): FlagSets = FlagSets (
159+ sets.flatMap { set ->
160+ other.sets.map { otherSet -> otherSet + set }
161+ },
162+ )
163+
164+ fun asStringsFor (v : Version ): List <Array <String >> =
165+ sets.map { set ->
166+ set.filter { it.condition.test(v) }.map { flag -> flag.value }.toTypedArray()
167+ }
168+ }
169+
130170 fun Path.hasModule () = resolve(" MODULE" ).exists() || resolve(" MODULE.bazel" ).exists()
131171 private fun Path.hasWorkspace () =
132172 resolve(" WORKSPACE" ).exists() || resolve(" WORKSPACE.bazel" ).exists()
133173
134- sealed class Version {
135- abstract fun resolveBazelRc (workspace : Path ): Path ;
174+ sealed class Version : Comparable <Version > {
175+ override fun compareTo (other : Version ): Int = 1
176+
177+ abstract fun resolveBazelRc (workspace : Path ): FlagSets
136178
137- abstract fun workspaceFlag (isBzlMod : Boolean ): Array <String >
138179
139180 class Head : Version () {
140- override fun resolveBazelRc (workspace : Path ): Path {
141- workspace.resolve(" .bazelrc.head" ).takeIf (Path ::exists)?.let {
142- return it
143- }
144- workspace.resolve(" .bazelrc" ).takeIf (Path ::exists)?.let {
145- return it
146- }
147- return workspace.resolve(" /dev/null" )
148- }
181+ override fun compareTo (other : Version ): Int = (other as ? Head )?.let { 0 } ? : 1
149182
150- override fun workspaceFlag (isBzlMod : Boolean ): Array <String > = arrayOf(" --enable_bzlmod=$isBzlMod " , " --enable_workspace=${! isBzlMod} " )
183+ override fun resolveBazelRc (workspace : Path ) = FlagSets (
184+ listOf (
185+ sequenceOf(" .bazelrc.head" , " .bazelrc" )
186+ .map(workspace::resolve)
187+ .filter(Path ::exists)
188+ .map { Flag (" --bazelrc=$it " ) }
189+ .toList()
190+ .takeIf { it.isNotEmpty() }
191+ ? : listOf (Flag (" --bazelrc=/dev/null" )),
192+ ),
193+ )
151194 }
152195
153196 class Known (private val major : Int , private val minor : Int , private val patch : Int ) :
154197 Version () {
155- override fun resolveBazelRc (workspace : Path ): Path {
156- sequence {
157- val parts = mutableListOf (major, minor, patch)
158- (parts.size downTo 0 ).forEach { index ->
159- yield (" ." + parts.subList(0 , index).joinToString(" -" ))
198+ override fun compareTo (other : Version ): Int {
199+ return (other as ? Known )?.let {
200+ return when {
201+ other.major > major -> - 1
202+ other.major < major -> 1
203+ other.minor > minor -> - 1
204+ other.minor < minor -> 1
205+ other.patch > patch -> - 1
206+ other.patch < patch -> 1
207+ else -> 0
160208 }
161- }
162- .map { suffix -> workspace.resolve(" .bazelrc${suffix} " ) }
163- .find(Path ::exists)
164- ?.let { bazelrc ->
165- return bazelrc
166- }
167- return workspace.resolve(" /dev/null" )
209+ } ? : - 1
168210 }
169211
170- override fun workspaceFlag (isBzlMod : Boolean ): Array <String > = if (isBzlMod) {
171- arrayOf(
172- " --enable_bzlmod=true" ,
173- // TODO[https://github.com/bazelbuild/rules_kotlin/issues/1395]: enable when rules_android
174- // no longer uses local_config_platform
175- // "--incompatible_disable_native_repo_rules=true",
176- " --incompatible_autoload_externally=" ,
177- )
178- } else if (major >= 7 ) {
179- arrayOf(" --enable_workspace=true" , " --enable_bzlmod=false" )
180- } else {
181- arrayOf(" --enable_bzlmod=false" )
182- }
212+ override fun resolveBazelRc (workspace : Path ) = FlagSets (
213+ listOf (
214+ sequence {
215+ val parts = mutableListOf (major, minor, patch)
216+ (parts.size downTo 0 ).forEach { index ->
217+ yield (" ." + parts.subList(0 , index).joinToString(" -" ))
218+ }
219+ }
220+ .map { suffix -> workspace.resolve(" .bazelrc${suffix} " ) }
221+ .filter(Path ::exists)
222+ .map { p -> Flag (" --bazelrc=$p " ) }
223+ .toList()
224+ .takeIf { it.isNotEmpty() }
225+ ? : listOf (Flag (" --bazelrc=/dev/null" )),
226+ ),
227+ )
183228 }
184229 }
185230
@@ -200,7 +245,6 @@ object BazelIntegrationTestRunner {
200245 patch = result.groups[" patch" ]?.value?.toInt() ? : 0 ,
201246 )
202247 }
203-
204248 }
205249 throw IllegalStateException (" Bazel version not available" )
206250 }
0 commit comments