Skip to content

Commit b3ab4f0

Browse files
committed
merge
2 parents 4a9bae2 + 0851475 commit b3ab4f0

File tree

12 files changed

+89
-35
lines changed

12 files changed

+89
-35
lines changed

core/api/daemon/src/mill/api/daemon/Logger.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ trait Logger extends Logger.Actions {
8888
}
8989

9090
object Logger {
91+
private[mill] def formatPrefix(s: Seq[String]) = if (s == Nil) "" else s"[${s.mkString("-")}] "
9192
object DummyLogger extends Logger {
9293
def colored = false
9394

core/api/daemon/src/mill/api/daemon/internal/EvaluatorApi.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ trait ExecutionResultsApi {
4242
private[mill] def transitiveResultsApi: Map[TaskApi[?], ExecResult[Val]]
4343

4444
private[mill] def transitiveFailingApi: Map[TaskApi[?], ExecResult.Failing[Val]]
45+
private[mill] def transitivePrefixesApi: Map[TaskApi[?], Seq[String]] = Map()
4546
def uncached: Seq[TaskApi[?]]
4647

4748
def values: Seq[Val]
@@ -54,7 +55,8 @@ object ExecutionResultsApi {
5455
case ExecResult.Failure(t) => t
5556
case ex: ExecResult.Exception => ex.toString
5657
}
57-
s"$k $fss"
58+
val keyPrefix = Logger.formatPrefix(evaluated.transitivePrefixesApi.getOrElse(k, Nil))
59+
s"$keyPrefix$k $fss"
5860
}).mkString("\n")
5961
}
6062

core/api/src/mill/api/ExecutionResults.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ trait ExecutionResults extends ExecutionResultsApi {
2121
private[mill] def transitiveResultsApi: Map[TaskApi[?], ExecResult[Val]] =
2222
transitiveResults.asInstanceOf[Map[TaskApi[?], ExecResult[Val]]]
2323

24+
def transitivePrefixes: Map[Task[?], Seq[String]] = Map()
25+
private[mill] override def transitivePrefixesApi: Map[TaskApi[?], Seq[String]] =
26+
transitivePrefixes.asInstanceOf[Map[TaskApi[?], Seq[String]]]
27+
2428
/**
2529
* The tasks that were executed without being read from cache
2630
*/

core/exec/src/mill/exec/Execution.scala

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ private[mill] case class Execution(
3030
systemExit: ( /* reason */ String, /* exitCode */ Int) => Nothing,
3131
exclusiveSystemStreams: SystemStreams,
3232
getEvaluator: () => EvaluatorApi,
33-
offline: Boolean
33+
offline: Boolean,
34+
enableTicker: Boolean
3435
) extends GroupExecution with AutoCloseable {
3536

3637
// this (shorter) constructor is used from [[MillBuildBootstrap]] via reflection
@@ -50,7 +51,8 @@ private[mill] case class Execution(
5051
systemExit: ( /* reason */ String, /* exitCode */ Int) => Nothing,
5152
exclusiveSystemStreams: SystemStreams,
5253
getEvaluator: () => EvaluatorApi,
53-
offline: Boolean
54+
offline: Boolean,
55+
enableTicker: Boolean
5456
) = this(
5557
baseLogger,
5658
new JsonArrayLogger.Profile(os.Path(outPath) / millProfile),
@@ -68,7 +70,8 @@ private[mill] case class Execution(
6870
systemExit,
6971
exclusiveSystemStreams,
7072
getEvaluator,
71-
offline
73+
offline,
74+
enableTicker
7275
)
7376

7477
def withBaseLogger(newBaseLogger: Logger) = this.copy(baseLogger = newBaseLogger)
@@ -131,6 +134,7 @@ private[mill] case class Execution(
131134
baseLogger.withChromeProfile("execution") {
132135
val uncached = new ConcurrentHashMap[Task[?], Unit]()
133136
val changedValueHash = new ConcurrentHashMap[Task[?], Unit]()
137+
val prefixes = new ConcurrentHashMap[Task[?], Seq[String]]()
134138

135139
val futures = mutable.Map.empty[Task[?], Future[Option[GroupExecution.Results]]]
136140

@@ -187,6 +191,7 @@ private[mill] case class Execution(
187191
noPrefix = exclusive
188192
)
189193

194+
if (enableTicker) prefixes.put(terminal, contextLogger.logKey)
190195
contextLogger.withPromptLine {
191196
logger.prompt.setPromptHeaderPrefix(formatHeaderPrefix(countMsg, keySuffix))
192197

@@ -316,10 +321,12 @@ private[mill] case class Execution(
316321

317322
val results: Map[Task[?], ExecResult[(Val, Int)]] = results0.toMap
318323

324+
import scala.collection.JavaConverters._
319325
Execution.Results(
320326
goals.toIndexedSeq.map(results(_).map(_._1)),
321327
finishedOptsMap.values.flatMap(_.toSeq.flatMap(_.newEvaluated)).toSeq,
322-
results.map { case (k, v) => (k, v.map(_._1)) }
328+
results.map { case (k, v) => (k, v.map(_._1)) },
329+
prefixes.asScala.toMap
323330
)
324331
}
325332
}
@@ -357,6 +364,7 @@ private[mill] object Execution {
357364
private[Execution] case class Results(
358365
results: Seq[ExecResult[Val]],
359366
uncached: Seq[Task[?]],
360-
transitiveResults: Map[Task[?], ExecResult[Val]]
367+
transitiveResults: Map[Task[?], ExecResult[Val]],
368+
override val transitivePrefixes: Map[Task[?], Seq[String]]
361369
) extends mill.api.ExecutionResults
362370
}

core/exec/src/mill/exec/GroupExecution.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,7 @@ trait GroupExecution {
336336

337337
if (!failFast) taskLabelOpt.foreach { taskLabel =>
338338
val taskFailed = newResults.exists(task => task._2.isInstanceOf[ExecResult.Failing[?]])
339-
if (taskFailed) {
340-
logger.error(s"$taskLabel failed")
341-
}
339+
if (taskFailed) logger.error(s"$taskLabel task failed")
342340
}
343341

344342
(newResults.toMap, newEvaluated)

core/internal/src/mill/internal/PrefixLogger.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ private[mill] class PrefixLogger(
3131
private[mill] override val logKey = logger0.logKey ++ key0
3232

3333
assert(key0.forall(_.nonEmpty))
34-
val linePrefix: String =
35-
if (noPrefix || logKey.isEmpty || !prompt.enableTicker) ""
36-
else s"[${logKey.mkString("-")}] "
34+
val linePrefix: String = Logger.formatPrefix(
35+
if (noPrefix || logKey.isEmpty || !prompt.enableTicker) Nil else logKey
36+
)
37+
3738
override def toString: String =
3839
s"PrefixLogger($logger0, $key0)"
3940

integration/feature/full-run-logs/src/FullRunLogsTests.scala

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,34 @@ object FullRunLogsTests extends UtestIntegrationTestSuite {
7575
"[<digits>/<digits>] compile",
7676
"[<digits>] [info] compiling <digits> Java source to .../out/compile.dest/classes ...",
7777
"[<digits>] [error] .../src/foo/Foo.java:<digits>:<digits>: reached end of file while parsing",
78-
"[<digits>] compile failed",
78+
"[<digits>] compile task failed",
7979
"[<digits>/<digits>, <digits> failed] ============================== jar ============================== <digits>s",
8080
"<digits> tasks failed",
81-
"compile javac returned non-zero exit code"
81+
"[<digits>] compile javac returned non-zero exit code"
82+
)
83+
)
84+
85+
}
86+
test("keepGoingMetaFailure") - integrationTest { tester =>
87+
import tester._
88+
modifyFile(workspacePath / "build.mill", _ + "?")
89+
90+
val res2 = eval(("--ticker", "true", "--keep-going", "jar"))
91+
res2.isSuccess ==> false
92+
93+
assertGoldenLiteral(
94+
normalize(res2.err, workspacePath),
95+
List(
96+
"============================== jar ==============================",
97+
"[build.mill-<digits>/<digits>] compile",
98+
"[build.mill-<digits>] [info] compiling <digits> Scala sources to .../out/mill-build/compile.dest/classes ...",
99+
"[build.mill-<digits>] [error] <dashes> [E<digits>] .../build.mill:<digits>:<digits>",
100+
"[build.mill-<digits>] [error] Illegal start of toplevel definition",
101+
"[build.mill-<digits>] [error] one error found",
102+
"[build.mill-<digits>] compile task failed",
103+
"[<digits>/<digits>, <digits> failed] ============================== jar ============================== <digits>s",
104+
"<digits> tasks failed",
105+
"[build.mill-<digits>] compile Compilation failed"
82106
)
83107
)
84108
}

integration/ide/bsp-server/resources/snapshots/logging

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
[5-compile-55] [error] nope
3737
[5-compile-55] [error] ^
3838
[5-compile-55] [error] one error found
39-
[5-compile-55] errored.compilation-error.semanticDbDataDetailed failed
39+
[5-compile-55] errored.compilation-error.semanticDbDataDetailed task failed
4040
[5-compile] Done
4141
[5-compile] buildTargetCompile took * msec
4242
[6-compile] Entered buildTargetCompile

runner/daemon/src/mill/daemon/MillBuildBootstrap.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ class MillBuildBootstrap(
6060
selectiveExecution: Boolean,
6161
offline: Boolean,
6262
reporter: EvaluatorApi => Int => Option[CompileProblemReporter],
63-
skipSelectiveExecution: Boolean
63+
skipSelectiveExecution: Boolean,
64+
enableTicker: Boolean
6465
) { outer =>
6566
import MillBuildBootstrap.*
6667

@@ -231,7 +232,8 @@ class MillBuildBootstrap(
231232
.map(_.hashCode())
232233
.getOrElse(0),
233234
depth,
234-
actualBuildFileName = nestedState.buildFile
235+
actualBuildFileName = nestedState.buildFile,
236+
enableTicker = enableTicker
235237
)) { evaluator =>
236238
if (depth == requestedDepth) {
237239
processFinalTasks(nestedState, buildFileApi, evaluator)
@@ -412,7 +414,8 @@ object MillBuildBootstrap {
412414
millClassloaderSigHash: Int,
413415
millClassloaderIdentityHash: Int,
414416
depth: Int,
415-
actualBuildFileName: Option[String] = None
417+
actualBuildFileName: Option[String] = None,
418+
enableTicker: Boolean
416419
): EvaluatorApi = {
417420
val bootLogPrefix: Seq[String] =
418421
if (depth == 0) Nil
@@ -450,7 +453,8 @@ object MillBuildBootstrap {
450453
(reason: String, exitCode: Int) => systemExit(reason, exitCode),
451454
streams0,
452455
() => evaluator,
453-
offline
456+
offline,
457+
enableTicker
454458
),
455459
scriptInitCls.getField("MODULE$").get(null)
456460
).asInstanceOf[EvaluatorApi]

runner/daemon/src/mill/daemon/MillMain0.scala

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ object MillMain0 {
206206
Option.when(config.bspInstall.value)(defaultJobCount)
207207
}
208208
}
209+
val enableTicker = config.ticker
210+
.orElse(config.enableTicker)
211+
.orElse(Option.when(config.tabComplete.value)(false))
212+
.orElse(Option.when(config.disableTicker.value)(false))
213+
.getOrElse(true)
209214

210215
val (success, nextStateCache) = {
211216
if (config.repl.value) {
@@ -283,7 +288,8 @@ object MillMain0 {
283288
selectiveExecution = config.watch.value,
284289
offline = config.offline.value,
285290
reporter = reporter,
286-
skipSelectiveExecution = skipSelectiveExecution
291+
skipSelectiveExecution = skipSelectiveExecution,
292+
enableTicker = enableTicker
287293
).evaluate()
288294
}
289295
}
@@ -297,10 +303,7 @@ object MillMain0 {
297303
Using.resource(getLogger(
298304
streams,
299305
config,
300-
enableTicker = config.ticker
301-
.orElse(config.enableTicker)
302-
.orElse(Option.when(config.tabComplete.value)(false))
303-
.orElse(Option.when(config.disableTicker.value)(false)),
306+
enableTicker = enableTicker,
304307
daemonDir,
305308
colored = colored,
306309
colors = colors,
@@ -538,15 +541,15 @@ object MillMain0 {
538541
def getLogger(
539542
streams: SystemStreams,
540543
config: MillCliConfig,
541-
enableTicker: Option[Boolean],
544+
enableTicker: Boolean,
542545
daemonDir: os.Path,
543546
colored: Boolean,
544547
colors: Colors,
545548
out: os.Path
546549
): Logger & AutoCloseable = {
547550
new PromptLogger(
548551
colored = colored,
549-
enableTicker = enableTicker.getOrElse(true),
552+
enableTicker = enableTicker,
550553
infoColor = colors.info,
551554
warnColor = colors.warn,
552555
errorColor = colors.error,

0 commit comments

Comments
 (0)