From e5443141b14f2bda70fe6bc123c88562019ee911 Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Mon, 30 May 2011 22:10:01 -0400 Subject: [PATCH] error handling adjustments, including showing failing task in red (for #29) --- main/EvaluteTask.scala | 7 ++++++- main/Main.scala | 18 ++++++++++++------ util/control/ErrorHandling.scala | 9 +++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/main/EvaluteTask.scala b/main/EvaluteTask.scala index 24bbb2492..ef4d92afe 100644 --- a/main/EvaluteTask.scala +++ b/main/EvaluteTask.scala @@ -8,6 +8,7 @@ package sbt import Keys.{streams, Streams, TaskStreams} import Keys.{dummyState, dummyStreamsManager, parseResult, resolvedScoped, streamsManager, taskDefinitionKey} import Scope.{GlobalScope, ThisScope} + import scala.Console.{RED, RESET} object EvaluateTask { @@ -48,7 +49,11 @@ object EvaluateTask getStreams(key, streams).log.trace(ex) log.error("Incomplete tasks (run 'last ' for the full log):") for( (key, msg, ex) <- keyed if(msg.isDefined || ex.isDefined) ) - getStreams(key, streams).log.error(" " + Project.display(key) + ": " + (msg.toList ++ ex.toList).mkString("\n\t")) + { + val msgString = (msg.toList ++ ex.toList.map(ErrorHandling.reducedToString)).mkString("\n\t") + val keyString = if(log.ansiCodesSupported) RED + key.key.label + RESET else key.key.label + getStreams(key, streams).log.error(" " + Scope.display(key.scope, keyString) + ": " + msgString) + } for(u <- un) log.debug(u.toString) } diff --git a/main/Main.scala b/main/Main.scala index 053f5ba17..dde26e91a 100644 --- a/main/Main.scala +++ b/main/Main.scala @@ -15,6 +15,7 @@ package sbt import scala.collection.JavaConversions._ import Function.tupled import java.net.URI + import java.lang.reflect.InvocationTargetException import Path._ import java.io.File @@ -380,15 +381,20 @@ object BuiltinCommands { case _: Incomplete => () // already handled by evaluateTask case _: NoMessageException => () - case _: MessageOnlyException => - log.error(e.toString) - case _ => - log.trace(e) - log.error(e.toString) - log.error("Use 'last' for the full log.") + case ite: InvocationTargetException => + val cause = ite.getCause + if(cause == null || cause == ite) logFullException(ite, log) else handleException(cause, s, log) + case _: MessageOnlyException => log.error(e.toString) + case _ => logFullException(e, log) } s.fail } + def logFullException(e: Throwable, log: Logger) + { + log.trace(e) + log.error(ErrorHandling reducedToString e) + log.error("Use 'last' for the full log.") + } def addAlias(s: State, name: String, value: String): State = if(Command validID name) { diff --git a/util/control/ErrorHandling.scala b/util/control/ErrorHandling.scala index 4072edff3..a346e0d14 100644 --- a/util/control/ErrorHandling.scala +++ b/util/control/ErrorHandling.scala @@ -21,6 +21,15 @@ object ErrorHandling def convert[T](f: => T): Either[Exception, T] = try { Right(f) } catch { case e: Exception => Left(e) } + + def reducedToString(e: Throwable): String = + if(e.getClass == classOf[RuntimeException]) + { + val msg = e.getMessage + if(msg == null || msg.isEmpty) e.toString else msg + } + else + e.toString } final class TranslatedException private[sbt](msg: String, cause: Throwable) extends RuntimeException(msg, cause) {