From dea7bdfa89d08134dd4ed94073d120e899ba99d3 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Fri, 10 Jul 2020 13:15:16 -0700 Subject: [PATCH] Don't start an ask user thread for dead console If there is no system console available, then there is no point in making an ask user thread. An ask user thread can only be created when the terminal prompt is in the Prompt.Running or Prompt.Loading state. The console channel will now set itself to be in the Prompt.NoPrompt state if it detects that there is no System.console available. The motivation for this change is that jline was printing a lot of extra text during scripted and server tests. Whenever a jline3 linereader is closed, it prints a newline so the logs were filled with unnecessary newlines. --- .../sbt/internal/util/ConsoleAppender.scala | 23 +++++++++++-------- .../main/scala/sbt/internal/util/Prompt.scala | 1 + .../scala/sbt/internal/util/Terminal.scala | 3 ++- .../scala/sbt/internal/ConsoleChannel.scala | 1 + 4 files changed, 17 insertions(+), 11 deletions(-) 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 f12e06d1f..ddc2cb647 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 @@ -644,20 +644,23 @@ private[sbt] object ProgressState { val isRunning = terminal.prompt == Prompt.Running val isBatch = terminal.prompt == Prompt.Batch val isWatch = terminal.prompt == Prompt.Watch + val noPrompt = terminal.prompt == Prompt.NoPrompt if (terminal.isSupershellEnabled) { if (!pe.skipIfActive.getOrElse(false) || (!isRunning && !isBatch)) { terminal.withPrintStream { ps => - val info = if (isRunning || isBatch && pe.channelName.fold(true)(_ == terminal.name)) { - pe.items.map { item => - val elapsed = item.elapsedMicros / 1000000L - s" | => ${item.name} ${elapsed}s" + val info = + if ((isRunning || isBatch || noPrompt) && pe.channelName + .fold(true)(_ == terminal.name)) { + pe.items.map { item => + val elapsed = item.elapsedMicros / 1000000L + s" | => ${item.name} ${elapsed}s" + } + } else { + pe.command.toSeq.flatMap { cmd => + val tail = if (isWatch) Nil else "enter 'cancel' to stop evaluation" :: Nil + s"sbt server is running '$cmd'" :: tail + } } - } else { - pe.command.toSeq.flatMap { cmd => - val tail = if (isWatch) Nil else "enter 'cancel' to stop evaluation" :: Nil - s"sbt server is running '$cmd'" :: tail - } - } val currentLength = info.foldLeft(0)(_ + terminal.lineCount(_)) val previousLines = state.progressLines.getAndSet(info) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala index 53c4f3849..bd50e9e75 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala @@ -45,4 +45,5 @@ private[sbt] object Prompt { private[sbt] case object Batch extends NoPrompt private[sbt] case object Watch extends NoPrompt private[sbt] case object Loading extends NoPrompt + private[sbt] case object NoPrompt extends NoPrompt } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index 0c2d50414..a416840ac 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -126,7 +126,8 @@ trait Terminal extends AutoCloseable { private[sbt] val progressState = new ProgressState(1) private[this] val promptHolder: AtomicReference[Prompt] = new AtomicReference(Prompt.Running) private[sbt] final def prompt: Prompt = promptHolder.get - private[sbt] final def setPrompt(newPrompt: Prompt): Unit = promptHolder.set(newPrompt) + private[sbt] final def setPrompt(newPrompt: Prompt): Unit = + if (prompt != Prompt.NoPrompt) promptHolder.set(newPrompt) /** * Returns the number of lines that the input string will cover given the current width of the diff --git a/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala b/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala index dac0c9565..397dba7a0 100644 --- a/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala +++ b/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala @@ -25,6 +25,7 @@ private[sbt] final class ConsoleChannel( override val userThread: UserThread = new UserThread(this) private[sbt] def terminal = Terminal.console + if (System.console == null) terminal.setPrompt(Prompt.NoPrompt) } private[sbt] object ConsoleChannel { private[sbt] def defaultName = "console0"