diff --git a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala index 082c18419..61e93050b 100644 --- a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala +++ b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala @@ -42,7 +42,10 @@ private[sbt] abstract class AbstractTaskExecuteProgress extends ExecuteProgress[ } override def afterWork[A](task: Task[A], result: Either[Task[A], Result[A]]): Unit = { - timings.get(task).stop() + timings.get(task) match { + case null => + case t => t.stop() + } activeTasksMap.remove(task) // we need this to infer anonymous task names @@ -51,6 +54,11 @@ private[sbt] abstract class AbstractTaskExecuteProgress extends ExecuteProgress[ } } + protected def reset(): Unit = { + activeTasksMap.clear() + timings.clear() + } + private[this] val taskNameCache = TrieMap.empty[Task[_], String] protected def taskName(t: Task[_]): String = taskNameCache.getOrElseUpdate(t, taskName0(t)) diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index ed74d20b1..494520fcc 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -101,6 +101,7 @@ private[sbt] class TaskProgress private () } override def afterAllCompleted(results: RMap[Task, Result]): Unit = { + reset() // send an empty progress report to clear out the previous report appendProgress(ProgressEvent("Info", Vector(), Some(lastTaskCount.get), None, None)) } @@ -132,8 +133,12 @@ private[sbt] class TaskProgress private () StandardMain.exchange.updateProgress(event) private[this] def active: Vector[Task[_]] = activeTasks.toVector.filterNot(Def.isDummy) private[this] def activeExceedingThreshold: Vector[(Task[_], Long)] = active.flatMap { task => - val elapsed = timings.get(task).currentElapsedMicros - if (elapsed.micros > threshold) Some[(Task[_], Long)](task -> elapsed) else None + timings.get(task) match { + case null => None + case t => + val elapsed = t.currentElapsedMicros + if (elapsed.micros > threshold) Some[(Task[_], Long)](task -> elapsed) else None + } } private[this] def report(): Unit = { val currentTasks = activeExceedingThreshold