Skip to content

Commit 450c07e

Browse files
Add CI command alias derived from the sbt-github-actions matrix, resolves #202
1 parent bc913e6 commit 450c07e

File tree

1 file changed

+93
-4
lines changed

1 file changed

+93
-4
lines changed

ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package org.typelevel.sbt
1818

19-
import sbt._
19+
import com.typesafe.tools.mima.plugin.MimaPlugin
2020
import org.typelevel.sbt.gha.GenerativePlugin
21-
import org.typelevel.sbt.gha.GitHubActionsPlugin
2221
import org.typelevel.sbt.gha.GenerativePlugin.autoImport._
23-
import com.typesafe.tools.mima.plugin.MimaPlugin
22+
import org.typelevel.sbt.gha.GitHubActionsPlugin
23+
import sbt._
2424

2525
object TypelevelCiPlugin extends AutoPlugin {
2626

@@ -46,12 +46,101 @@ object TypelevelCiPlugin extends AutoPlugin {
4646
cond = Some(primaryJavaCond.value)
4747
)
4848
),
49-
githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8"))
49+
githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8")),
50+
GlobalScope / Keys.onLoad := {
51+
val oses = githubWorkflowOSes.value.toList
52+
val javas = githubWorkflowJavaVersions.value.toList
53+
val scalas = githubWorkflowScalaVersions.value.toList
54+
val additions = githubWorkflowBuildMatrixAdditions.value
55+
val inclusions = githubWorkflowBuildMatrixInclusions.value.toList
56+
val exclusions = githubWorkflowBuildMatrixExclusions.value.toList
57+
val stepPreamble = githubWorkflowBuildSbtStepPreamble.value.toList
58+
59+
(GlobalScope / Keys.onLoad).value.compose { (state: State) =>
60+
addCiAlias(
61+
state,
62+
oses,
63+
javas,
64+
scalas,
65+
additions,
66+
inclusions,
67+
exclusions,
68+
stepPreamble,
69+
githubWorkflowBuild.value
70+
)
71+
}
72+
},
73+
GlobalScope / Keys.onUnload := {
74+
(GlobalScope / Keys.onUnload)
75+
.value
76+
.compose((state: State) => BasicCommands.removeAlias(state, "ci"))
77+
}
5078
)
5179

5280
private val primaryJavaCond = Def.setting {
5381
val java = githubWorkflowJavaVersions.value.head
5482
s"matrix.java == '${java.render}'"
5583
}
5684

85+
private def addCiAlias(
86+
state: State,
87+
oses: List[String],
88+
javaVersions: List[JavaSpec],
89+
scalaVersions: List[String],
90+
matrixAdditions: Map[String, List[String]],
91+
matrixInclusions: List[MatrixInclude],
92+
matrixExclusions: List[MatrixExclude],
93+
sbtStepPreamble: List[String],
94+
workflowSteps: Seq[WorkflowStep]) = {
95+
96+
val buildMatrix = GenerativePlugin.expandMatrix(
97+
// Cannot meaningfully iterate OS or Java version here
98+
oses = oses.take(1),
99+
javas = javaVersions.take(1),
100+
scalas = scalaVersions,
101+
matrixAdds = matrixAdditions,
102+
includes = matrixInclusions,
103+
excludes = matrixExclusions
104+
)
105+
106+
val keys = "os" :: "scala" :: "java" :: matrixAdditions.keys.toList.sorted
107+
108+
val commands = for {
109+
matrixRow <- buildMatrix
110+
matrixValues = keys.zip(matrixRow).toMap
111+
step <- workflowSteps.collect {
112+
case sbt: WorkflowStep.Sbt if matchingCondition(sbt, matrixValues) => sbt
113+
}
114+
command <- sbtStepPreamble ++ step.commands
115+
} yield replaceMatrixVars(command, matrixValues)
116+
117+
val commandAlias = TypelevelKernelPlugin.mkCommand(commands)
118+
119+
BasicCommands.addAlias(
120+
state,
121+
"ci",
122+
commandAlias
123+
)
124+
}
125+
126+
private def matchingCondition(
127+
command: WorkflowStep.Sbt,
128+
matrixValues: Map[String, String]) = {
129+
// For all matrix values
130+
matrixValues.forall {
131+
case (k, v) =>
132+
val renderedCond = s"matrix.$k == '$v'"
133+
134+
command.cond.forall { cond =>
135+
// If the condition starts with this matrix variable, whole condition must be equal
136+
if (cond.startsWith(s"matrix.$k")) cond == renderedCond else true
137+
}
138+
}
139+
}
140+
141+
private def replaceMatrixVars(command: String, matrixValues: Map[String, String]): String =
142+
matrixValues.foldLeft(command) {
143+
case (cmd, (matrixVar, matrixVarValue)) =>
144+
cmd.replaceAll(s"\\$$\\{\\{ matrix.${matrixVar} \\}\\}", matrixVarValue)
145+
}
57146
}

0 commit comments

Comments
 (0)