diff --git a/internal/util-logging/src/main/contraband-scala/sbt/internal/util/SuccessEvent.scala b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/SuccessEvent.scala new file mode 100644 index 000000000..9fdcc8e09 --- /dev/null +++ b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/SuccessEvent.scala @@ -0,0 +1,32 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.util +final class SuccessEvent private ( + val message: String) extends Serializable { + + + + override def equals(o: Any): Boolean = o match { + case x: SuccessEvent => (this.message == x.message) + case _ => false + } + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.util.SuccessEvent".##) + message.##) + } + override def toString: String = { + "SuccessEvent(" + message + ")" + } + protected[this] def copy(message: String = message): SuccessEvent = { + new SuccessEvent(message) + } + def withMessage(message: String): SuccessEvent = { + copy(message = message) + } +} +object SuccessEvent { + + def apply(message: String): SuccessEvent = new SuccessEvent(message) +} diff --git a/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/JsonProtocol.scala b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/JsonProtocol.scala index 4696c9612..a94906dda 100644 --- a/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/JsonProtocol.scala +++ b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/JsonProtocol.scala @@ -8,4 +8,5 @@ trait JsonProtocol extends sjsonnew.BasicJsonProtocol with sbt.internal.util.codec.StringEventFormats with sbt.internal.util.codec.TraceEventFormats with sbt.internal.util.codec.AbstractEntryFormats + with sbt.internal.util.codec.SuccessEventFormats object JsonProtocol extends JsonProtocol \ No newline at end of file diff --git a/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/SuccessEventFormats.scala b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/SuccessEventFormats.scala new file mode 100644 index 000000000..19621d7c1 --- /dev/null +++ b/internal/util-logging/src/main/contraband-scala/sbt/internal/util/codec/SuccessEventFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.util.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait SuccessEventFormats { self: sjsonnew.BasicJsonProtocol => +implicit lazy val SuccessEventFormat: JsonFormat[sbt.internal.util.SuccessEvent] = new JsonFormat[sbt.internal.util.SuccessEvent] { + override def read[J](jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.util.SuccessEvent = { + jsOpt match { + case Some(js) => + unbuilder.beginObject(js) + val message = unbuilder.readField[String]("message") + unbuilder.endObject() + sbt.internal.util.SuccessEvent(message) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.util.SuccessEvent, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("message", obj.message) + builder.endObject() + } +} +} diff --git a/internal/util-logging/src/main/contraband/logging.contra b/internal/util-logging/src/main/contraband/logging.contra index 5cd31c230..19b019c66 100644 --- a/internal/util-logging/src/main/contraband/logging.contra +++ b/internal/util-logging/src/main/contraband/logging.contra @@ -21,3 +21,7 @@ type TraceEvent implements sbt.internal.util.AbstractEntry { channelName: String execId: String } + +type SuccessEvent { + message: String! +} 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 d6764463a..14cfe6ab2 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 @@ -285,13 +285,6 @@ class ConsoleAppender private[ConsoleAppender] ( appendMessage(level, message) } - // TODO: - // success is called by ConsoleLogger. - // This should turn into an event. - private[sbt] def success(message: => String): Unit = { - appendLog(SUCCESS_LABEL_COLOR, Level.SuccessLabel, SUCCESS_MESSAGE_COLOR, message) - } - /** * Logs the stack trace of `t`, possibly shortening it. * @@ -371,6 +364,11 @@ class ConsoleAppender private[ConsoleAppender] ( } } + // success is called by ConsoleLogger. + private[sbt] def success(message: => String): Unit = { + appendLog(SUCCESS_LABEL_COLOR, Level.SuccessLabel, SUCCESS_MESSAGE_COLOR, message) + } + private def write(msg: String): Unit = { val cleanedMsg = if (!useFormat || !ansiCodesSupported) EscHelpers.removeEscapeSequences(msg) @@ -380,27 +378,30 @@ class ConsoleAppender private[ConsoleAppender] ( private def appendMessage(level: Level.Value, msg: Message): Unit = msg match { - case o: ObjectMessage => objectToLines(o.getParameter) foreach { appendLog(level, _) } - case o: ReusableObjectMessage => objectToLines(o.getParameter) foreach { appendLog(level, _) } + case o: ObjectMessage => appendMessageContent(level, o.getParameter) + case o: ReusableObjectMessage => appendMessageContent(level, o.getParameter) case _ => appendLog(level, msg.getFormattedMessage) } - private def objectToLines(o: AnyRef): Vector[String] = + private def appendMessageContent(level: Level.Value, o: AnyRef): Unit = { + def appendEvent(oe: ObjectEvent[_]): Unit = + { + val contentType = oe.contentType + LogExchange.stringCodec[AnyRef](contentType) match { + case Some(codec) if contentType == "sbt.internal.util.SuccessEvent" => + codec.showLines(oe.message.asInstanceOf[AnyRef]).toVector foreach { success(_) } + case Some(codec) => + codec.showLines(oe.message.asInstanceOf[AnyRef]).toVector foreach { appendLog(level, _) } + case _ => appendLog(level, oe.message.toString) + } + } + o match { - case x: StringEvent => Vector(x.message) - case x: ObjectEvent[_] => objectEventToLines(x) - case _ => Vector(o.toString) + case x: StringEvent => Vector(x.message) foreach { appendLog(level, _) } + case x: ObjectEvent[_] => appendEvent(x) + case _ => Vector(o.toString) foreach { appendLog(level, _) } } - - private def objectEventToLines(oe: ObjectEvent[_]): Vector[String] = - { - val contentType = oe.contentType - LogExchange.stringCodec[AnyRef](contentType) match { - case Some(codec) => codec.showLines(oe.message.asInstanceOf[AnyRef]).toVector - case _ => Vector(oe.message.toString) - } - } - + } } final class SuppressedTraceContext(val traceLevel: Int, val useFormat: Boolean) 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 5f284a77a..5a9215ba8 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 @@ -7,6 +7,7 @@ import sjsonnew.JsonFormat import scala.reflect.runtime.universe.TypeTag import sbt.internal.util.codec.ThrowableShowLines._ import sbt.internal.util.codec.TraceEventShowLines._ +import sbt.internal.util.codec.SuccessEventShowLines._ import sbt.internal.util.codec.JsonProtocol._ /** @@ -27,7 +28,11 @@ class ManagedLogger( new ObjectMessage(StringEvent(level.toString, message, channelName, execId)) ) } - override def success(message: => String): Unit = xlogger.info(message) + + // send special event for success since it's not a real log level + override def success(message: => String): Unit = { + infoEvent[SuccessEvent](SuccessEvent(message)) + } def registerStringCodec[A: ShowLines: TypeTag]: Unit = { @@ -38,6 +43,7 @@ class ManagedLogger( } registerStringCodec[Throwable] registerStringCodec[TraceEvent] + registerStringCodec[SuccessEvent] final def debugEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Debug, event) final def infoEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Info, event) final def warnEvent[A: JsonFormat: TypeTag](event: => A): Unit = logEvent(Level.Warn, event) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala new file mode 100644 index 000000000..e3b338719 --- /dev/null +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala @@ -0,0 +1,14 @@ +package sbt +package internal.util.codec + +import sbt.util.ShowLines +import sbt.internal.util.SuccessEvent + +trait SuccessEventShowLines { + implicit val sbtSuccessEventShowLines: ShowLines[SuccessEvent] = + ShowLines[SuccessEvent]( (e: SuccessEvent) => { + Vector(e.message) + }) +} + +object SuccessEventShowLines extends SuccessEventShowLines