diff --git a/main/LogManager.scala b/main/LogManager.scala index 652a39d98..54ced9ba4 100644 --- a/main/LogManager.scala +++ b/main/LogManager.scala @@ -39,11 +39,13 @@ object LogManager def getOr[T](key: AttributeKey[T], default: T): T = data.get(scope, key) getOrElse default val screenLevel = getOr(logLevel.key, Level.Info) val backingLevel = getOr(persistLogLevel.key, Level.Debug) - val screenTrace = getOr(traceLevel.key, -1) + val screenTrace = getOr(traceLevel.key, defaultTraceLevel(state)) val backingTrace = getOr(persistTraceLevel.key, Int.MaxValue) val extraBacked = state.globalLogging.backed :: Nil multiLogger( new MultiLoggerConfig(console, backed, extraBacked ::: extra, screenLevel, backingLevel, screenTrace, backingTrace) ) } + def defaultTraceLevel(state: State): Int = + if(state.interactive) -1 else Int.MaxValue def suppressedMessage(key: ScopedKey[_], state: State): SuppressedTraceContext => Option[String] = { lazy val display = Project.showContextKey(state) diff --git a/main/command/BasicCommands.scala b/main/command/BasicCommands.scala index 31aec43a2..c0f435816 100644 --- a/main/command/BasicCommands.scala +++ b/main/command/BasicCommands.scala @@ -118,9 +118,9 @@ object BasicCommands val line = reader.readLine(prompt) line match { case Some(line) => - val newState = s.copy(onFailure = Some(Shell), remainingCommands = line +: Shell +: s.remainingCommands) + val newState = s.copy(onFailure = Some(Shell), remainingCommands = line +: Shell +: s.remainingCommands).setInteractive(true) if(line.trim.isEmpty) newState else newState.clearGlobalLog - case None => s + case None => s.setInteractive(false) } } diff --git a/main/command/BasicKeys.scala b/main/command/BasicKeys.scala index d11e55977..80409672c 100644 --- a/main/command/BasicKeys.scala +++ b/main/command/BasicKeys.scala @@ -7,4 +7,5 @@ object BasicKeys val historyPath = AttributeKey[Option[File]]("history", "The location where command line history is persisted.", 40) val shellPrompt = AttributeKey[State => String]("shell-prompt", "The function that constructs the command prompt from the current build state.", 10000) val watch = AttributeKey[Watched]("watch", "Continuous execution configuration.", 1000) + private[sbt] val interactive = AttributeKey[Boolean]("interactive", "True if commands are currently being entered from an interactive environment.", 10) } diff --git a/main/command/State.scala b/main/command/State.scala index d0abeb05c..f7f9310a0 100644 --- a/main/command/State.scala +++ b/main/command/State.scala @@ -38,6 +38,13 @@ trait Identity { override final def toString = super.toString } +/** StateOps methods to be merged at the next binary incompatible release. */ +private[sbt] trait NewStateOps +{ + def interactive: Boolean + def setInteractive(flag: Boolean): State +} + /** Convenience methods for State transformations and operations. */ trait StateOps { def process(f: (String, State) => State): State @@ -151,6 +158,11 @@ object State new Reboot(app.scalaProvider.version, state.remainingCommands, app.id, state.configuration.baseDirectory) } + private[sbt] implicit def newStateOps(s: State): NewStateOps = new NewStateOps { + def interactive = s.get(BasicKeys.interactive).getOrElse(false) + def setInteractive(i: Boolean) = s.put(BasicKeys.interactive, i) + } + /** Provides operations and transformations on State. */ implicit def stateOps(s: State): StateOps = new StateOps { def process(f: (String, State) => State): State =