Subject: Re: [PATCH v4 12/12] t: detect errors outside of test cases

From: Jeff King <[email-masked]>
Date: Sat, 18 Apr 2026 02:50:09 -0400

On Fri, Apr 17, 2026 at 12:50:58PM +0200, Patrick Steinhardt wrote:

> --- a/ci/run-build-and-tests.sh
> +++ b/ci/run-build-and-tests.sh
> @@ -15,6 +15,11 @@ fedora-breaking-changes-musl|linux-breaking-changes)
>  	MESONFLAGS="$MESONFLAGS -Drust=enabled"
>  	;;
>  linux-TEST-vars)
> +	# Ubuntu uses Dash by default, but we only enable use of `set -e`
> +	# when using Bash 5+. Ensure that we have at least one CI job that uses
> +	# it.
> +	export TEST_SHELL_PATH=/usr/bin/bash

Thinking on this a little more, it is a shame we cannot easily enable
this for dash. That would hit most CI jobs, but also the local builds of
most developers. And finding problems early and locally often saves a
lot of time versus finding them in CI.

Unfortunately I could not find a way to detect whether we are running
dash at all, let alone a recent version. But what if we let the user
tell us? Something like:

diff --git a/t/test-lib.sh b/t/test-lib.sh
index 1f7868c537..a0d07f75fb 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -17,9 +17,10 @@
 
 # Enable the use of errexit so that any unexpected failures will cause us to
 # abort tests, even when outside of a specific test case. Note that we only
-# enable this on Bash 5 and newer, as `set -e` has wildly different behaviour
-# across shells. The list of allowed shells may be extended going forward.
-if test "${BASH_VERSINFO:=0}" -ge 5
+# enable this by default on Bash 5 and newer, as `set -e` has wildly different
+# behaviour across shells. If you trust your shell's `set -e` implementation,
+# you can set GIT_TEST_USE_SET_E manually.
+if test "$GIT_TEST_USE_SET_E" = 1 && test "${BASH_VERSINFO:=0}" -ge 5
 then
 	set -e
 fi

And then those of us who want to stick:

  export GIT_TEST_USE_SET_E = 1

in our config.mak can do so, and we could even set it in the ci/ scripts
for all of the ubuntu builds.

-Peff