Merge pull request #5837 from eatkins/terminal-color

Refactor color settings
This commit is contained in:
eugene yokota 2020-09-11 05:48:27 -04:00 committed by GitHub
commit 96b4f7b8e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 32 deletions

View File

@ -150,7 +150,11 @@ object ConsoleAppender {
*/
lazy val formatEnabledInEnv: Boolean = Terminal.formatEnabledInEnv
private[sbt] def parseLogOption(s: String): LogOption = Terminal.parseLogOption(s)
private[sbt] def parseLogOption(s: String): LogOption = Terminal.parseLogOption(s) match {
case Some(true) => LogOption.Always
case Some(false) => LogOption.Never
case _ => LogOption.Auto
}
private[this] val generateId: AtomicInteger = new AtomicInteger

View File

@ -275,14 +275,14 @@ object Terminal {
private[this] val hasProgress: AtomicBoolean = new AtomicBoolean(false)
private[sbt] def parseLogOption(s: String): LogOption =
private[sbt] def parseLogOption(s: String): Option[Boolean] =
s.toLowerCase match {
case "always" => LogOption.Always
case "auto" => LogOption.Auto
case "never" => LogOption.Never
case "true" => LogOption.Always
case "false" => LogOption.Never
case _ => LogOption.Auto
case "always" => Some(true)
case "auto" => None
case "never" => Some(false)
case "true" => Some(true)
case "false" => Some(false)
case _ => None
}
/**
@ -292,30 +292,21 @@ object Terminal {
* 3. -Dsbt.colour=always/auto/never/true/false
* 4. -Dsbt.log.format=always/auto/never/true/false
*/
private[sbt] lazy val formatEnabledInEnv: Boolean = {
def useColorDefault: Boolean = {
// This approximates that both stdin and stdio are connected,
// so by default color will be turned off for pipes and redirects.
val hasConsole = Option(java.lang.System.console).isDefined
props.map(_.color).getOrElse(hasConsole)
}
private[this] lazy val logFormatEnabled: Option[Boolean] = {
sys.props.get("sbt.log.noformat") match {
case Some(_) => !java.lang.Boolean.getBoolean("sbt.log.noformat")
case _ =>
sys.props
.get("sbt.color")
.orElse(sys.props.get("sbt.colour"))
.orElse(sys.props.get("sbt.log.format"))
.flatMap({ s =>
parseLogOption(s) match {
case LogOption.Always => Some(true)
case LogOption.Never => Some(false)
case _ => None
}
})
.getOrElse(useColorDefault)
case Some(_) => Some(!java.lang.Boolean.getBoolean("sbt.log.noformat"))
case _ => sys.props.get("sbt.log.format").flatMap(parseLogOption)
}
}
private[sbt] lazy val formatEnabledInEnv: Boolean = logFormatEnabled.getOrElse(useColorDefault)
private[this] def useColorDefault: Boolean = {
// This approximates that both stdin and stdio are connected,
// so by default color will be turned off for pipes and redirects.
val hasConsole = Option(java.lang.System.console).isDefined
props.map(_.color).orElse(isColorEnabledProp).getOrElse(hasConsole)
}
private[this] lazy val isColorEnabledProp: Option[Boolean] =
sys.props.get("sbt.color").orElse(sys.props.get("sbt.colour")).flatMap(parseLogOption)
/**
*
@ -326,7 +317,7 @@ object Terminal {
*/
private[sbt] def withStreams[T](isServer: Boolean)(f: => T): T =
// In ci environments, don't touch the io streams unless run with -Dsbt.io.virtual=true
if (System.getProperty("sbt.io.virtual", "") == "true" || (formatEnabledInEnv && !isCI)) {
if (System.getProperty("sbt.io.virtual", "") == "true" || (logFormatEnabled.getOrElse(true) && !isCI)) {
hasProgress.set(isServer)
consoleTerminalHolder.set(wrap(jline.TerminalFactory.get))
activeTerminal.set(consoleTerminalHolder.get)
@ -737,7 +728,7 @@ object Terminal {
override def isSupported: Boolean = terminal.isSupported
override def getWidth: Int = props.map(_.width).getOrElse(terminal.getWidth)
override def getHeight: Int = props.map(_.height).getOrElse(terminal.getHeight)
override def isAnsiSupported: Boolean = formatEnabledInEnv
override val isAnsiSupported: Boolean = terminal.isAnsiSupported && formatEnabledInEnv
override def wrapOutIfNeeded(out: OutputStream): OutputStream = terminal.wrapOutIfNeeded(out)
override def wrapInIfNeeded(in: InputStream): InputStream = terminal.wrapInIfNeeded(in)
override def hasWeirdWrap: Boolean = terminal.hasWeirdWrap
@ -855,7 +846,10 @@ object Terminal {
term.setEchoEnabled(true)
}
}
override def isColorEnabled: Boolean = props.map(_.color).getOrElse(formatEnabledInEnv)
override def isColorEnabled: Boolean =
props
.map(_.color)
.getOrElse(isColorEnabledProp.getOrElse(term.isAnsiSupported && formatEnabledInEnv))
override def isSupershellEnabled: Boolean =
props