1616
1717package org .typelevel .sbt
1818
19- import sbt . _
19+ import com . typesafe . tools . mima . plugin . MimaPlugin
2020import org .typelevel .sbt .gha .GenerativePlugin
21- import org .typelevel .sbt .gha .GitHubActionsPlugin
2221import 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
2525object 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