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 48b81e786..b0f68e88a 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 @@ -353,8 +353,10 @@ class ConsoleAppender private[ConsoleAppender] ( * @param msg The message to format * @return The formatted message. */ - private def formatted(format: String, msg: String): String = - s"$reset${format}${msg}$reset" + private def formatted(format: String, msg: String): String = { + val builder = new java.lang.StringBuilder(reset.length * 2 + format.length + msg.length) + builder.append(reset).append(format).append(msg).append(reset).toString + } /** * Select the right color for the label given `level`. @@ -388,9 +390,14 @@ class ConsoleAppender private[ConsoleAppender] ( ): Unit = out.lockObject.synchronized { message.lines.foreach { line => - val labeledLine = - s"$reset[${formatted(labelColor, label)}] ${formatted(messageColor, line)}" - write(labeledLine) + val builder = new java.lang.StringBuilder( + labelColor.length + label.length + messageColor.length + line.length + reset.length * 3 + 3) + def fmted(a: String, b: String) = builder.append(reset).append(a).append(b).append(reset) + builder.append(reset).append('[') + fmted(labelColor, label) + builder.append("] ") + fmted(messageColor, line) + write(builder.toString) } } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala index 37af255cb..717be2cfd 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala @@ -37,7 +37,7 @@ object ConsoleOut { lockObject.print(OverwriteLine) lockObject.println(s) last = Some(s) - current = new java.lang.StringBuffer + current.setLength(0) } } 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 d4cef3fe0..3add4cd04 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 @@ -25,9 +25,11 @@ class ManagedLogger( ) } + private val SuccessEventTag = scala.reflect.runtime.universe.typeTag[SuccessEvent] // send special event for success since it's not a real log level override def success(message: => String): Unit = { - infoEvent[SuccessEvent](SuccessEvent(message)) + infoEvent[SuccessEvent](SuccessEvent(message))(implicitly[JsonFormat[SuccessEvent]], + SuccessEventTag) } def registerStringCodec[A: ShowLines: TypeTag]: Unit = {