Fix #8344: Skip interactive prompt in batch mode when project loading fails

When project loading fails in batch mode, sbt was showing an interactive
prompt asking the user to choose between retry, quit, last, or ignore.
However, in batch mode there is no interactive terminal, causing the
process to hang waiting for input that will never come.

This fix checks if we're in batch mode (Prompt.Batch) and automatically
exits with failure (equivalent to 'q' quit option) without prompting the
user. This prevents infinite retry loops on persistent errors and allows
batch mode scripts to fail fast, which is appropriate for CI/CD environments.

The interactive behavior remains unchanged for non-batch mode.
This commit is contained in:
Francluob 2026-01-08 17:57:54 +01:00
parent a4ad73ddf6
commit 4976ec7dc7
1 changed files with 23 additions and 18 deletions

View File

@ -869,6 +869,10 @@ object BuiltinCommands {
@tailrec @tailrec
private def doLoadFailed(s: State, loadArg: String): State = { private def doLoadFailed(s: State, loadArg: String): State = {
// In batch mode, exit with failure to avoid infinite retry loops on persistent errors
if (ITerminal.console.prompt == Prompt.Batch) {
s.exit(ok = false)
} else {
s.log.warn("Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r)") s.log.warn("Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? (default: r)")
val result: Int = val result: Int =
try try
@ -890,6 +894,7 @@ object BuiltinCommands {
case c => println(s"Invalid response: '$c'"); doLoadFailed(s, loadArg) case c => println(s"Invalid response: '$c'"); doLoadFailed(s, loadArg)
} }
} }
}
def loadProjectCommands(arg: String): List[String] = def loadProjectCommands(arg: String): List[String] =
StashOnFailure :: StashOnFailure ::