From f6370063f4343471632063a1fba791ce0b2c07cf Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Mon, 24 Jul 2017 23:20:05 -0400 Subject: [PATCH 1/2] Deprecate ansiCodesSupported from the logger --- .../src/main/scala/sbt/internal/util/BufferedLogger.scala | 2 ++ .../src/main/scala/sbt/internal/util/FullLogger.scala | 2 ++ .../src/main/scala/sbt/internal/util/ManagedLogger.scala | 2 ++ .../src/main/scala/sbt/internal/util/MultiLogger.scala | 2 ++ internal/util-logging/src/main/scala/sbt/util/Logger.scala | 1 + 5 files changed, 9 insertions(+) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala index be24152c1..93686c334 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala @@ -116,7 +116,9 @@ class BufferedLogger(delegate: AbstractLogger) extends BasicLogger { /** Plays buffered events and disables buffering. */ def stop(): Unit = synchronized { play(); clear() } + @deprecated("No longer used.", "1.0.0") override def ansiCodesSupported = delegate.ansiCodesSupported + override def setLevel(newLevel: Level.Value): Unit = synchronized { super.setLevel(newLevel) if (recording) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala index 1493e2d0f..c3ad40442 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala @@ -7,7 +7,9 @@ import sbt.util._ /** Promotes the simple Logger interface to the full AbstractLogger interface. */ class FullLogger(delegate: Logger) extends BasicLogger { + @deprecated("No longer used.", "1.0.0") override val ansiCodesSupported: Boolean = delegate.ansiCodesSupported + def trace(t: => Throwable): Unit = { if (traceEnabled) delegate.trace(t) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala index a0b69929c..5f284a77a 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala @@ -54,5 +54,7 @@ class ManagedLogger( new ObjectMessage(entry) ) } + + @deprecated("No longer used.", "1.0.0") override def ansiCodesSupported = ConsoleAppender.formatEnabledInEnv } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala index c72d094af..c43d346f4 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala @@ -9,7 +9,9 @@ import sbt.util._ // note that setting the logging level on this logger has no effect on its behavior, only // on the behavior of the delegates. class MultiLogger(delegates: List[AbstractLogger]) extends BasicLogger { + @deprecated("No longer used.", "1.0.0") override lazy val ansiCodesSupported = delegates exists supported + private[this] lazy val allSupportCodes = delegates forall supported private[this] def supported = (_: AbstractLogger).ansiCodesSupported diff --git a/internal/util-logging/src/main/scala/sbt/util/Logger.scala b/internal/util-logging/src/main/scala/sbt/util/Logger.scala index abcad3428..0bcea3b78 100644 --- a/internal/util-logging/src/main/scala/sbt/util/Logger.scala +++ b/internal/util-logging/src/main/scala/sbt/util/Logger.scala @@ -27,6 +27,7 @@ abstract class Logger extends xLogger { // sys.process.ProcessLogger final def out(message: => String): Unit = log(Level.Info, message) + @deprecated("No longer used.", "1.0.0") def ansiCodesSupported: Boolean = false def trace(t: => Throwable): Unit From d796084ff437b46f630af4abd394b7389392808e Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Mon, 24 Jul 2017 23:54:25 -0400 Subject: [PATCH 2/2] Filter out color in CosoleAppender only Fixes sbt/sbt#3348 Ref #101 The new logger, based on log4j separates the concern of the log producer (Logger) and the handlers that takes actions (Appender, e.g for displaying on Console). As such filtering of color should be performed only in the ConsoleAppender. --- .../sbt/internal/util/ConsoleAppender.scala | 20 ++++++++++------- .../scala/sbt/internal/util/MultiLogger.scala | 22 +++---------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index 422e420fb..d6764463a 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -1,6 +1,5 @@ package sbt.internal.util -import scala.compat.Platform.EOL import sbt.util._ import java.io.{ PrintStream, PrintWriter } import java.util.Locale @@ -269,11 +268,16 @@ class ConsoleAppender private[ConsoleAppender] ( useFormat: Boolean, suppressedMessage: SuppressedTraceContext => Option[String] ) extends AbstractAppender(name, null, LogExchange.dummyLayout, true) { - import scala.Console.{ BLUE, GREEN, RED, RESET, YELLOW } + import scala.Console.{ BLUE, GREEN, RED, YELLOW } - private final val SUCCESS_LABEL_COLOR = GREEN - private final val SUCCESS_MESSAGE_COLOR = RESET - private final val NO_COLOR = RESET + private val reset: String = { + if (ansiCodesSupported && useFormat) scala.Console.RESET + else "" + } + + private val SUCCESS_LABEL_COLOR = GREEN + private val SUCCESS_MESSAGE_COLOR = reset + private val NO_COLOR = reset override def append(event: XLogEvent): Unit = { val level = ConsoleAppender.toLevel(event.getLevel) @@ -333,7 +337,7 @@ class ConsoleAppender private[ConsoleAppender] ( * @return The formatted message. */ private def formatted(format: String, msg: String): String = - s"${RESET}${format}${msg}${RESET}" + s"$reset${format}${msg}$reset" /** * Select the right color for the label given `level`. @@ -362,14 +366,14 @@ class ConsoleAppender private[ConsoleAppender] ( private def appendLog(labelColor: String, label: String, messageColor: String, message: String): Unit = out.lockObject.synchronized { message.lines.foreach { line => - val labeledLine = s"$RESET[${formatted(labelColor, label)}] ${formatted(messageColor, line)}" + val labeledLine = s"$reset[${formatted(labelColor, label)}] ${formatted(messageColor, line)}" write(labeledLine) } } private def write(msg: String): Unit = { val cleanedMsg = - if (!useFormat) EscHelpers.removeEscapeSequences(msg) + if (!useFormat || !ansiCodesSupported) EscHelpers.removeEscapeSequences(msg) else msg out.println(cleanedMsg) } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala index c43d346f4..ef82fa10f 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala @@ -11,8 +11,6 @@ import sbt.util._ class MultiLogger(delegates: List[AbstractLogger]) extends BasicLogger { @deprecated("No longer used.", "1.0.0") override lazy val ansiCodesSupported = delegates exists supported - - private[this] lazy val allSupportCodes = delegates forall supported private[this] def supported = (_: AbstractLogger).ansiCodesSupported override def setLevel(newLevel: Level.Value): Unit = { @@ -33,22 +31,8 @@ class MultiLogger(delegates: List[AbstractLogger]) extends BasicLogger { def logAll(events: Seq[LogEvent]): Unit = delegates.foreach(_.logAll(events)) def control(event: ControlEvent.Value, message: => String): Unit = delegates.foreach(_.control(event, message)) private[this] def dispatch(event: LogEvent): Unit = { - val plainEvent = if (allSupportCodes) event else removeEscapes(event) - for (d <- delegates) - if (d.ansiCodesSupported) - d.log(event) - else - d.log(plainEvent) - } - - private[this] def removeEscapes(event: LogEvent): LogEvent = - { - import EscHelpers.{ removeEscapeSequences => rm } - event match { - case s: Success => new Success(rm(s.msg)) - case l: Log => new Log(l.level, rm(l.msg)) - case ce: ControlEvent => new ControlEvent(ce.event, rm(ce.msg)) - case _: Trace | _: SetLevel | _: SetTrace | _: SetSuccess => event - } + for (d <- delegates) { + d.log(event) } + } }