Skip to content

Commit e5eb648

Browse files
authored
Make serial command execution at the evaluation end optional (#3429)
Introduced a new `serialCommandExec` parameter in `Evaluator.evaluate` and added required binary compatibility shims. Fix #3359 Pull request: #3429
1 parent 12194ac commit e5eb648

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

main/eval/src/mill/eval/Evaluator.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import mill.define.{BaseModule, BaseModuleTree, Segments, Task}
66
import mill.eval.Evaluator.{Results, formatFailing}
77
import mill.util.{ColorLogger, MultiBiMap}
88

9+
import scala.annotation.nowarn
910
import scala.jdk.CollectionConverters._
1011
import scala.reflect.ClassTag
1112
import scala.util.DynamicVariable
@@ -24,12 +25,30 @@ trait Evaluator {
2425
def pathsResolver: EvaluatorPathsResolver
2526
def workerCache: collection.Map[Segments, (Int, Val)]
2627
def disableCallgraphInvalidation: Boolean = false
28+
29+
@deprecated(
30+
"Binary compatibility shim. Use overload with parameter serialCommandExec=false instead",
31+
"Mill 0.12.0-RC1"
32+
)
33+
def evaluate(
34+
goals: Agg[Task[_]],
35+
reporter: Int => Option[CompileProblemReporter],
36+
testReporter: TestReporter,
37+
logger: ColorLogger
38+
): Evaluator.Results = evaluate(goals, reporter, testReporter, logger, serialCommandExec = false)
39+
2740
def evaluate(
2841
goals: Agg[Task[_]],
2942
reporter: Int => Option[CompileProblemReporter] = _ => Option.empty[CompileProblemReporter],
3043
testReporter: TestReporter = DummyTestReporter,
31-
logger: ColorLogger = baseLogger
32-
): Evaluator.Results
44+
logger: ColorLogger = baseLogger,
45+
serialCommandExec: Boolean = false
46+
): Evaluator.Results = {
47+
// TODO: cleanup once we break bin-compat in Mill 0.13
48+
// this method should be abstract, but to preserve bin-compat, we default-implement
49+
// by delegating to an binary pre-existing overload, by ignoring the new parameters
50+
evaluate(goals, reporter, testReporter, logger): @nowarn("cat=deprecation")
51+
}
3352

3453
def withBaseLogger(newBaseLogger: ColorLogger): Evaluator
3554
def withFailFast(newFailFast: Boolean): Evaluator

main/eval/src/mill/eval/EvaluatorCore.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
2929
goals: Agg[Task[_]],
3030
reporter: Int => Option[CompileProblemReporter] = _ => Option.empty[CompileProblemReporter],
3131
testReporter: TestReporter = DummyTestReporter,
32-
logger: ColorLogger = baseLogger
32+
logger: ColorLogger = baseLogger,
33+
serialCommandExec: Boolean = false
3334
): Evaluator.Results = {
3435
os.makeDir.all(outPath)
3536

@@ -42,7 +43,7 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
4243
if (effectiveThreadCount == 1) ""
4344
else s"[#${if (effectiveThreadCount > 9) f"$threadId%02d" else threadId}] "
4445

45-
try evaluate0(goals, logger, reporter, testReporter, ec, contextLoggerMsg)
46+
try evaluate0(goals, logger, reporter, testReporter, ec, contextLoggerMsg, serialCommandExec)
4647
finally ec.close()
4748
}
4849
}
@@ -68,7 +69,8 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
6869
reporter: Int => Option[CompileProblemReporter] = _ => Option.empty[CompileProblemReporter],
6970
testReporter: TestReporter = DummyTestReporter,
7071
ec: ExecutionContext with AutoCloseable,
71-
contextLoggerMsg0: Int => String
72+
contextLoggerMsg0: Int => String,
73+
serialCommandExec: Boolean
7274
): Evaluator.Results = {
7375
os.makeDir.all(outPath)
7476
val chromeProfileLogger = new ChromeProfileLogger(outPath / millChromeProfile)
@@ -170,7 +172,7 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
170172
val tasksTransitive = tasksTransitive0.toSet
171173
val (tasks, leafCommands) = terminals0.partition {
172174
case Terminal.Labelled(t, _) if tasksTransitive.contains(t) => true
173-
case _ => false
175+
case _ => !serialCommandExec
174176
}
175177

176178
// Run all non-command tasks according to the threads

main/eval/src/mill/eval/EvaluatorImpl.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package mill.eval
22

3-
import mill.api.Val
3+
import mill.api.{CompileProblemReporter, Strict, TestReporter, Val}
44
import mill.api.Strict.Agg
55
import mill.define._
66
import mill.util._
7+
78
import scala.collection.mutable
89
import scala.reflect.ClassTag
910

@@ -43,6 +44,18 @@ private[mill] case class EvaluatorImpl(
4344
Plan.plan(goals)
4445
}
4546

47+
override def evaluate(
48+
goals: Strict.Agg[Task[_]],
49+
reporter: Int => Option[CompileProblemReporter],
50+
testReporter: TestReporter,
51+
logger: ColorLogger,
52+
serialCommandExec: Boolean
53+
): Evaluator.Results = {
54+
// TODO: cleanup once we break bin-compat in Mill 0.13
55+
// disambiguate override hierarchy
56+
super.evaluate(goals, reporter, testReporter, logger, serialCommandExec)
57+
}
58+
4659
override def evalOrThrow(exceptionFactory: Evaluator.Results => Throwable)
4760
: Evaluator.EvalOrThrow =
4861
new EvalOrThrow(this, exceptionFactory)

main/src/mill/main/RunScript.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ object RunScript {
3535
evaluator: Evaluator,
3636
targets: Agg[Task[Any]]
3737
): (Seq[Watchable], Either[String, Seq[(Any, Option[(TaskName, ujson.Value)])]]) = {
38-
val evaluated: Results = evaluator.evaluate(targets)
38+
val evaluated: Results = evaluator.evaluate(targets, serialCommandExec = true)
3939

4040
val watched = evaluated.results
4141
.iterator

0 commit comments

Comments
 (0)