Skip to content

Commit d734a1b

Browse files
authored
Cleanup terminal handling (#4477)
Since #4181 landed, we no longer need to track `Terminal.Labelled#segments` separately and can just use `Terminal.Labelled#task#ctx#segments#render`
1 parent 6d7f3b2 commit d734a1b

File tree

17 files changed

+172
-218
lines changed

17 files changed

+172
-218
lines changed

example/fundamentals/libraries/4-mainargs/build.mill

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ def customPlanCommand(evaluator: Evaluator, tasks: String*) = Task.Command {
9191
) match {
9292
case Left(err) => Left(err)
9393
case Right(resolved) =>
94-
val (sortedGroups, _) = evaluator.plan(resolved)
95-
val plan = sortedGroups
94+
val plan = evaluator.plan(resolved)
95+
.sortedGroups
9696
.keys()
97-
.collect { case r: Terminal.Labelled[_] => r.render }
97+
.map(_.render)
9898
.toArray
9999

100100
plan.foreach(println)

example/large/selective/9-selective-execution/build.mill

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,6 @@ bar.sources
181181
}
182182
}
183183

184-
185-
186184
*/
187185

188186
// Similarly, if we make a change `qux/`, using selective execution will only run tests

main/api/src/mill/api/AggWrapper.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ private[mill] sealed class AggWrapper(strictUniqueness: Boolean) {
149149
def iterator: Iterator[V] = items
150150
override def hashCode(): Int = items.map(_.hashCode()).sum
151151
override def equals(other: Any): Boolean = other match {
152-
case s: Agg[?] => items.sameElements(s.items)
152+
case s: Loose.Agg[?] => items.sameElements(s.items)
153+
case s: Strict.Agg[?] => items.sameElements(s.items)
153154
case _ => super.equals(other)
154155
}
155156
override def toString: String = items.mkString("Agg(", ", ", ")")

main/eval/src/mill/eval/CodeSigUtils.scala

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
package mill.eval
22

3-
import mill.api.{BuildInfo, MillException}
4-
import mill.define.{NamedTask, Task}
5-
import mill.util.MultiBiMap
3+
import mill.api.{BuildInfo, MillException, Strict}
4+
import mill.define.NamedTask
65

76
import scala.reflect.NameTransformer.encode
87
import java.lang.reflect.Method
98

109
private[mill] object CodeSigUtils {
11-
def precomputeMethodNamesPerClass(sortedGroups: MultiBiMap[Terminal, Task[_]])
10+
def precomputeMethodNamesPerClass(transitiveNamed: Strict.Agg[NamedTask[?]])
1211
: (Map[Class[_], IndexedSeq[Class[_]]], Map[Class[_], Map[String, Method]]) = {
1312
def resolveTransitiveParents(c: Class[_]): Iterator[Class[_]] = {
1413
Iterator(c) ++
1514
Option(c.getSuperclass).iterator.flatMap(resolveTransitiveParents) ++
1615
c.getInterfaces.iterator.flatMap(resolveTransitiveParents)
1716
}
1817

19-
val classToTransitiveClasses: Map[Class[?], IndexedSeq[Class[?]]] = sortedGroups
20-
.values()
21-
.flatten
22-
.collect { case namedTask: NamedTask[?] => namedTask.ctx.enclosingCls }
18+
val classToTransitiveClasses: Map[Class[?], IndexedSeq[Class[?]]] = transitiveNamed
19+
.iterator
20+
.map { case namedTask: NamedTask[?] => namedTask.ctx.enclosingCls }
2321
.map(cls => cls -> resolveTransitiveParents(cls).toVector)
2422
.toMap
2523

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ trait Evaluator extends AutoCloseable {
6060
def withBaseLogger(newBaseLogger: ColorLogger): Evaluator
6161
def withFailFast(newFailFast: Boolean): Evaluator
6262
def allowPositionalCommandArgs: Boolean = false
63-
def plan(goals: Agg[Task[_]]): (MultiBiMap[Terminal, Task[_]], Agg[Task[_]])
63+
def plan(goals: Agg[Task[_]]): Plan
6464

6565
/**
6666
* Evaluate given task(s) and return the successful result(s), or throw an exception.

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

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,20 +71,20 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
7171
os.makeDir.all(outPath)
7272

7373
val threadNumberer = new ThreadNumberer()
74-
val (sortedGroups, transitive) = Plan.plan(goals)
75-
val interGroupDeps = EvaluatorCore.findInterGroupDeps(sortedGroups)
76-
val terminals0 = sortedGroups.keys().toVector
74+
val plan = Plan.plan(goals)
75+
val interGroupDeps = EvaluatorCore.findInterGroupDeps(plan.sortedGroups)
76+
val terminals0 = plan.sortedGroups.keys().toVector
7777
val failed = new AtomicBoolean(false)
7878
val count = new AtomicInteger(1)
79-
val indexToTerminal = sortedGroups.keys().toArray
79+
val indexToTerminal = plan.sortedGroups.keys().toArray
8080

8181
EvaluatorLogs.logDependencyTree(interGroupDeps, indexToTerminal, outPath)
8282

8383
// Prepare a lookup tables up front of all the method names that each class owns,
8484
// and the class hierarchy, so during evaluation it is cheap to look up what class
8585
// each target belongs to determine of the enclosing class code signature changed.
8686
val (classToTransitiveClasses, allTransitiveClassMethods) =
87-
CodeSigUtils.precomputeMethodNamesPerClass(sortedGroups)
87+
CodeSigUtils.precomputeMethodNamesPerClass(Plan.transitiveNamed(goals))
8888

8989
val uncached = new ConcurrentHashMap[Terminal, Unit]()
9090
val changedValueHash = new ConcurrentHashMap[Terminal, Unit]()
@@ -106,7 +106,7 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
106106
for (terminal <- terminals) {
107107
val deps = interGroupDeps(terminal)
108108

109-
val group = sortedGroups.lookupKey(terminal)
109+
val group = plan.sortedGroups.lookupKey(terminal)
110110
val exclusiveDeps = deps.filter(d => d.task.isExclusiveCommand)
111111

112112
if (!terminal.task.isExclusiveCommand && exclusiveDeps.nonEmpty) {
@@ -162,7 +162,7 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
162162

163163
val res = evaluateGroupCached(
164164
terminal = terminal,
165-
group = sortedGroups.lookupKey(terminal),
165+
group = plan.sortedGroups.lookupKey(terminal),
166166
results = upstreamResults,
167167
countMsg = countMsg,
168168
verboseKeySuffix = verboseKeySuffix,
@@ -205,15 +205,13 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
205205
}
206206

207207
val tasks0 = terminals0.filter {
208-
case Terminal.Labelled(c: Command[_], _) => false
208+
case Terminal.Labelled(c: Command[_]) => false
209209
case _ => true
210210
}
211211

212-
val (_, tasksTransitive0) = Plan.plan(Agg.from(tasks0.map(_.task)))
213-
214-
val tasksTransitive = tasksTransitive0.toSet
212+
val tasksTransitive = Plan.transitiveTargets(Agg.from(tasks0.map(_.task))).toSet
215213
val (tasks, leafExclusiveCommands) = terminals0.partition {
216-
case Terminal.Labelled(t, _) => tasksTransitive.contains(t) || !t.isExclusiveCommand
214+
case Terminal.Labelled(t) => tasksTransitive.contains(t) || !t.isExclusiveCommand
217215
case _ => !serialCommandExec
218216
}
219217

@@ -237,7 +235,7 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
237235

238236
val results0: Vector[(Task[_], TaskResult[(Val, Int)])] = terminals0
239237
.flatMap { t =>
240-
sortedGroups.lookupKey(t).flatMap { t0 =>
238+
plan.sortedGroups.lookupKey(t).flatMap { t0 =>
241239
finishedOptsMap(t) match {
242240
case None => Some((t0, TaskResult(Aborted, () => Aborted)))
243241
case Some(res) => res.newResults.get(t0).map(r => (t0, r))
@@ -255,8 +253,8 @@ private[mill] trait EvaluatorCore extends GroupEvaluator {
255253
Strict.Agg.from(
256254
finishedOptsMap.values.flatMap(_.toSeq.flatMap(_.newEvaluated)).iterator.distinct
257255
),
258-
transitive,
259-
getFailing(sortedGroups, results),
256+
plan.transitive,
257+
getFailing(plan.sortedGroups, results),
260258
results.map { case (k, v) => (k, v.map(_._1)) }
261259
)
262260
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ private[mill] case class EvaluatorImpl(
4747
override def withFailFast(newFailFast: Boolean): Evaluator =
4848
this.copy(failFast = newFailFast)
4949

50-
override def plan(goals: Agg[Task[_]]): (MultiBiMap[Terminal, Task[_]], Agg[Task[_]]) = {
50+
override def plan(goals: Agg[Task[_]]): Plan = {
5151
Plan.plan(goals)
5252
}
5353

main/eval/src/mill/eval/Graph.scala

Lines changed: 0 additions & 85 deletions
This file was deleted.

main/eval/src/mill/eval/GroupEvaluator.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private[mill] trait GroupEvaluator {
111111

112112
case labelled: Terminal.Labelled[_] =>
113113
val out = if (!labelled.task.ctx.external) outPath else externalOutPath
114-
val paths = EvaluatorPaths.resolveDestPaths(out, labelled.segments)
114+
val paths = EvaluatorPaths.resolveDestPaths(out, labelled.task.ctx.segments)
115115
val cached = loadCachedJson(logger, inputsHash, labelled, paths)
116116

117117
// `cached.isEmpty` means worker metadata file removed by user so recompute the worker
@@ -343,7 +343,7 @@ private[mill] trait GroupEvaluator {
343343
.orElse {
344344
labelled.task.asWorker.map { w =>
345345
ujson.Obj(
346-
"worker" -> ujson.Str(labelled.segments.render),
346+
"worker" -> ujson.Str(labelled.task.ctx.segments.render),
347347
"toString" -> ujson.Str(v.value.toString),
348348
"inputsHash" -> ujson.Num(inputsHash)
349349
)
@@ -397,7 +397,7 @@ private[mill] trait GroupEvaluator {
397397
catch {
398398
case e: PathRef.PathRefValidationException =>
399399
logger.debug(
400-
s"${labelled.segments.render}: re-evaluating; ${e.getMessage}"
400+
s"${labelled.render}: re-evaluating; ${e.getMessage}"
401401
)
402402
None
403403
case NonFatal(_) => None
@@ -430,12 +430,12 @@ private[mill] trait GroupEvaluator {
430430
case (_, Val(obsolete: AutoCloseable)) =>
431431
// worker cached but obsolete, needs to be closed
432432
try {
433-
logger.debug(s"Closing previous worker: ${labelled.segments.render}")
433+
logger.debug(s"Closing previous worker: ${labelled.render}")
434434
obsolete.close()
435435
} catch {
436436
case NonFatal(e) =>
437437
logger.error(
438-
s"${labelled.segments.render}: Errors while closing obsolete worker: ${e.getMessage()}"
438+
s"${labelled.render}: Errors while closing obsolete worker: ${e.getMessage()}"
439439
)
440440
}
441441
// make sure, we can no longer re-use a closed worker

main/eval/src/mill/eval/KeyLock.scala

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)