From a471e7384d8d2e70073945e5a5e40749e6fa4c85 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Fri, 11 Sep 2020 10:50:20 -0700 Subject: [PATCH] Honor shellPrompt override sbt 1.4.0 generates the shell prompt using the terminal properties for the specific terminal for which the prompt is rendered. The mechanism for doing this broke the prompt for projects that overrode the shellPrompt key, notably the play plugin. After this change, the play custom prompt is correctly rendered with 1.4.0-SNAPSHOT. --- .../src/main/scala/sbt/internal/ui/UITask.scala | 17 ++++++++++++----- main/src/main/scala/sbt/Defaults.scala | 7 +++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/main-command/src/main/scala/sbt/internal/ui/UITask.scala b/main-command/src/main/scala/sbt/internal/ui/UITask.scala index f47def3a6..614fd05df 100644 --- a/main-command/src/main/scala/sbt/internal/ui/UITask.scala +++ b/main-command/src/main/scala/sbt/internal/ui/UITask.scala @@ -44,6 +44,9 @@ private[sbt] trait UITask extends Runnable with AutoCloseable { } private[sbt] object UITask { + case object NoShellPrompt extends (State => String) { + override def apply(state: State): String = "" + } trait Reader extends AutoCloseable { def readLine(): Either[String, String] override def close(): Unit = {} @@ -93,11 +96,15 @@ private[sbt] object UITask { private[this] def history(s: State): Option[File] = s.get(historyPath).getOrElse(Some(new File(s.baseDir, ".history"))) private[sbt] def shellPrompt(terminal: Terminal, s: State): String = - s.get(terminalShellPrompt) match { - case Some(pf) => pf(terminal, s) - case None => - def ansi(s: String): String = if (terminal.isAnsiSupported) s"$s" else "" - s"${ansi(DeleteLine)}> ${ansi(ClearScreenAfterCursor)}" + s.get(sbt.BasicKeys.shellPrompt) match { + case Some(NoShellPrompt) | None => + s.get(terminalShellPrompt) match { + case Some(pf) => pf(terminal, s) + case None => + def ansi(s: String): String = if (terminal.isAnsiSupported) s"$s" else "" + s"${ansi(DeleteLine)}> ${ansi(ClearScreenAfterCursor)}" + } + case Some(p) => p(s) } private[sbt] class AskUserTask( state: State, diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 3b37e8ad1..241b7e0c1 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2558,9 +2558,12 @@ object Classpaths { val base = ModuleID(id.groupID, id.name, sbtVersion.value).withCrossVersion(cross) CrossVersion(scalaVersion, binVersion)(base).withCrossVersion(Disabled()) }, - shellPrompt := shellPromptFromState, + shellPrompt := sbt.internal.ui.UITask.NoShellPrompt, terminalShellPrompt := { (t, s) => - shellPromptFromState(t)(s) + shellPrompt.value match { + case sbt.internal.ui.UITask.NoShellPrompt => shellPromptFromState(t)(s) + case p => p(s) + } }, dynamicDependency := { (): Unit }, transitiveClasspathDependency := { (): Unit },