Subject: Re: [PATCH v3 11/12] t9902: fix use of `read` with `set -e`

From: SZEDER Gábor <[email-masked]>
Date: Thu, 16 Apr 2026 22:12:26 +0200

On Thu, Apr 16, 2026 at 01:19:28PM +0200, Patrick Steinhardt wrote:
> In t9902 we're using the `read` builtin to read some values into a
> variable. This is done by using `-d ""`, which cause us to read until
> the end of the heredoc. There is a gotcha though: when the delimiter
> isn't found at all, then the read builtin will return an error.

The absence of the delimiter doesn't make "read" return an error, EOF
does (that's why a "while read ..." loop works).

> This
> hasn't been an issue until now as we didn't run with `set -e`, but
> that'll change in a subsequent commit.
> 
> Prepare for this change by silencing the error.
> 
> Signed-off-by: Patrick Steinhardt <[email-masked]>
> ---
>  t/t9902-completion.sh | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index 2f9a597ec7..e3a7df7691 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -590,7 +590,7 @@ test_expect_success '__gitcomp - doesnt fail because of invalid variable name' '
>  	__gitcomp "$invalid_variable_name"
>  '
>  
> -read -r -d "" refs <<-\EOF
> +read -r -d "" refs <<-\EOF || :
>  main
>  maint
>  next

So AFAICT what this "read" does is equivalent to:

refs='main
maint
next
seen'

Isn't this much easier to read!?  OK, the first ref is not aligned
with the rest...  But I admit I had to look up the docs to see what
the empty string as delimiter actually does, and even after that I had
to add a printf '>%s<\n' "$refs" command to the test script to see
what's exactly going on.