Merge pull request #105 from eed3si9n/wip/success

Use event logging to send success
This commit is contained in:
Dale Wijnand 2017-07-26 08:52:33 +01:00 committed by GitHub
commit aefbbae6ec
7 changed files with 109 additions and 24 deletions

View File

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

View File

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

View File

@ -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()
}
}
}

View File

@ -21,3 +21,7 @@ type TraceEvent implements sbt.internal.util.AbstractEntry {
channelName: String
execId: String
}
type SuccessEvent {
message: String!
}

View File

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

View File

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

View File

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