From: "SZEDER Gábor" <szeder.dev@gmail.com>
To: "René Scharfe" <l.s.r@web.de>
Cc: Git List <git@vger.kernel.org>,
Matheus Tavares <matheus.bernardino@usp.br>,
Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH v2] parallel-checkout: avoid dash local bug in tests
Date: Sat, 5 Jun 2021 21:09:10 +0200 [thread overview]
Message-ID: <20210605190910.GJ2947267@szeder.dev> (raw)
In-Reply-To: <472c1411-fcf8-862b-cef9-52c2c994914b@web.de>
On Sat, Jun 05, 2021 at 08:11:24PM +0200, René Scharfe wrote:
> The parallel checkout tests fail when run with /bin/dash on MacOS 11.4,
> reporting the following error:
>
> ./t2080-parallel-checkout-basics.sh: 33: local: 0: bad variable name
>
> That's because wc's output contains leading spaces and this version of
> dash erroneously expands the variable declaration as "local workers= 0",
> i.e. it tries to set the "workers" variable to the empty string and also
> declare a variable named "0", which not a valid name. This is a known
> dash bug (https://bugs.launchpad.net/ubuntu/+source/dash/+bug/139097).
Perhaps a more accurate wording for this bug would be:
... and even fairly recent versions of dash erroneously perform
field splitting on the expansion of the command substitution before
assigning it to a local variable.
I think the relevant part of POSIX is section 2.9.1 Simple Commands:
4. Each variable assignment shall be expanded for tilde expansion,
parameter expansion, command substitution, arithmetic expansion,
and quote removal prior to assigning the value.
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01
Note that it didn't mention field splitting; though POSIX doesn't
specifies local variables in the first place, so...
Anyway, this bug has been fixed in v0.5.11 (2020-06-01).
This is an old bug, it was already present in v0.5.5 (2009-01-13); I
didn't check earlier versions.
> Work around it by passing the command output directly to test instead of
> storing it in a variable first. While at it, let grep count the number
> of lines instead of piping its output to wc, which is a bit shorter and
> more efficient.
A more debug-friendly alternative would be to save 'grep's output to a
temporary file and use 'test_line_count = $expected_workers'.
> Helped-by: Matheus Tavares Bernardino <matheus.bernardino@usp.br>
> Signed-off-by: René Scharfe <l.s.r@web.de>
> ---
> Changes since v1:
> - Explain the root cause.
> - Get rid of the local variable "workers".
> - Adjust title accordingly.
> - Still use grep -c, though.
> - Remove input redirection.
>
> t/lib-parallel-checkout.sh | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/t/lib-parallel-checkout.sh b/t/lib-parallel-checkout.sh
> index 21f5759732..66350d5207 100644
> --- a/t/lib-parallel-checkout.sh
> +++ b/t/lib-parallel-checkout.sh
> @@ -27,8 +27,7 @@ test_checkout_workers () {
> rm -f "$trace_file" &&
> GIT_TRACE2="$(pwd)/$trace_file" "$@" 2>&8 &&
>
> - local workers=$(grep "child_start\[..*\] git checkout--worker" "$trace_file" | wc -l) &&
> - test $workers -eq $expected_workers &&
> + test $(grep -c "child_start\[..*\] git checkout--worker" "$trace_file") -eq $expected_workers &&
> rm "$trace_file"
> } 8>&2 2>&4
>
> --
> 2.31.1
>
next prev parent reply other threads:[~2021-06-05 19:10 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-05 12:27 [PATCH] parallel-checkout: use grep -c to count workers in tests René Scharfe
2021-06-05 14:31 ` Matheus Tavares Bernardino
2021-06-05 15:20 ` René Scharfe
2021-06-05 15:30 ` René Scharfe
2021-06-05 18:11 ` [PATCH v2] parallel-checkout: avoid dash local bug " René Scharfe
2021-06-05 19:09 ` SZEDER Gábor [this message]
2021-06-06 1:01 ` René Scharfe
2021-06-05 19:56 ` Ævar Arnfjörð Bjarmason
2021-06-05 22:17 ` Matheus Tavares Bernardino
2021-06-05 22:21 ` Matheus Tavares Bernardino
2021-06-06 1:01 ` René Scharfe
2021-06-06 1:28 ` Junio C Hamano
2021-06-06 1:01 ` [PATCH v3] " René Scharfe
2021-06-06 1:41 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210605190910.GJ2947267@szeder.dev \
--to=szeder.dev@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=l.s.r@web.de \
--cc=matheus.bernardino@usp.br \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.