From 11627be173a1ddd83b34e3462fe0050b4812b548 Mon Sep 17 00:00:00 2001 From: Evan Typanski Date: Mon, 17 Aug 2026 13:26:13 -0400 Subject: [PATCH] Error for `-u` without a TTY Agents often use `-u` then abort when they realize they can't actually interactively update changes, which sometimes caused processes to sit around. Instead, just abort early. --- btest | 3 +++ .../Baseline/tests.update-interactive-requires-tty/output | 2 ++ testing/tests/update-interactive-requires-tty.test | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 testing/Baseline/tests.update-interactive-requires-tty/output create mode 100644 testing/tests/update-interactive-requires-tty.test diff --git a/btest b/btest index 0d69f77..4dba2ac 100755 --- a/btest +++ b/btest @@ -3041,6 +3041,9 @@ def parse_options(): warning("ignoring requested parallelism in interactive-update mode") options.threads = 1 + if options.mode == "UPDATE_INTERACTIVE" and not sys.stdout.isatty(): + error("interactive-update mode must have a TTY") + return options, parsed_args diff --git a/testing/Baseline/tests.update-interactive-requires-tty/output b/testing/Baseline/tests.update-interactive-requires-tty/output new file mode 100644 index 0000000..d3a6859 --- /dev/null +++ b/testing/Baseline/tests.update-interactive-requires-tty/output @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +interactive-update mode must have a TTY diff --git a/testing/tests/update-interactive-requires-tty.test b/testing/tests/update-interactive-requires-tty.test new file mode 100644 index 0000000..d716ead --- /dev/null +++ b/testing/tests/update-interactive-requires-tty.test @@ -0,0 +1,8 @@ +# %TEST-DOC: --update-interactive errors out early when stdout is not a TTY. +# +# Running btest inside btest redirects the inner stdout, so it is not a +# TTY and the guard must fire before any test would prompt for input. +# %TEST-EXEC-FAIL: btest -u . >output 2>&1 +# %TEST-EXEC: btest-diff output + +@TEST-EXEC: exit 1