error handling adjustments, including showing failing task in red (for #29)

This commit is contained in:
Mark Harrah 2011-05-30 22:10:01 -04:00
parent 2432642571
commit e5443141b1
3 changed files with 27 additions and 7 deletions

View File

@ -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 <task>' 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)
}

View File

@ -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) {

View File

@ -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)
{