Skip to content

Commit 2e15c74

Browse files
authored
Make selective execution work via Tasks rather than Strings (#6291)
This works around #4119 in selective execution, which was causing problems in bootstrapping in #6289. Instead of serializing strings that we parse again (which fails if they contain `.super`), we just pass the tasks directly preserving all the information intact Tested manually
1 parent e3ba147 commit 2e15c74

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

core/api/src/mill/api/SelectiveExecution.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ private[mill] trait SelectiveExecution {
2727

2828
def resolve0(tasks: Seq[String]): Result[Array[String]]
2929

30+
def resolveTasks0(tasks: Seq[String]): Result[Array[Task.Named[?]]]
31+
3032
def resolveChanged(tasks: Seq[String]): Result[Seq[String]]
3133

3234
def resolveTree(tasks: Seq[String]): Result[ujson.Value]

core/eval/src/mill/eval/SelectiveExecutionImpl.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,18 @@ class SelectiveExecutionImpl(evaluator: Evaluator)
133133
}
134134

135135
def resolve0(tasks: Seq[String]): Result[Array[String]] = {
136+
resolveTasks0(tasks).map(_.map(_.ctx.segments.render))
137+
}
138+
def resolveTasks0(tasks: Seq[String]): Result[Array[Task.Named[?]]] = {
136139
for {
137140
(resolved, changedTasks) <-
138141
evaluator.resolveTasks(tasks, SelectMode.Separated).zip(this.computeChangedTasks(tasks))
139142
} yield {
140-
val resolvedSet = resolved.map(_.ctx.segments.render).toSet
141-
val downstreamSet = changedTasks.downstreamTasks.map(_.ctx.segments.render).toSet
142-
resolvedSet.intersect(downstreamSet).toArray.sorted
143+
val downstreamTasksRendered = changedTasks.downstreamTasks.map(_.ctx.segments.render).toSet
144+
145+
resolved
146+
.filter(t => downstreamTasksRendered.contains(t.ctx.segments.render))
147+
.toArray
143148
}
144149
}
145150

libs/util/src/mill/util/SelectiveExecutionModule.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ trait SelectiveExecutionModule extends mill.api.Module {
7979
if (!os.exists(evaluator.outPath / OutFiles.millSelectiveExecution)) {
8080
Result.Failure("`selective.run` can only be run after `selective.prepare`")
8181
} else {
82-
evaluator.selective.resolve0(tasks).flatMap { resolved =>
83-
if (resolved.isEmpty) Result.Success(())
84-
else evaluator.evaluate(resolved.toSeq, SelectMode.Multi).flatMap {
82+
evaluator.selective.resolveTasks0(tasks).flatMap { resolvedTasks =>
83+
if (resolvedTasks.isEmpty) Result.Success(())
84+
else evaluator.execute(resolvedTasks) match {
8585
case Evaluator.Result(_, f: Result.Failure, _, _) => f
8686
case Evaluator.Result(_, Result.Success(_), _, _) =>
8787
}

0 commit comments

Comments
 (0)