git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2] parallel-checkout: avoid dash local bug in tests

From
René Scharfe <l.s.r@web.de>
Date
Jun 6, 2021, 01:01 UTC
Message-ID
<6a111a2e-ed65-9c22-1f0d-cdd54b144692@web.de>
In-Reply-To
<20210605190910.GJ2947267@szeder.dev>
Am 05.06.21 um 21:09 schrieb SZEDER Gábor:
Show 17 quoted lines
> 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.
OK.
Show 23 quoted lines
>
> 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'.

Yes, but that would cement the use of grep and wc -l and I still can't let go of the idea that grep -c would be slightly quicker. And it would add file I/O.

Something like this would be more efficient in the expected case:
	if test $expected_count -ne $(grep -c -e "$pattern" "$file")
	then
		echo "Expected $expected_count lines matching $patter, but got:"
		grep -e "$pattern" "$file"
		return 1
	fi

I have no performance numbers to show, just the vague feeling that the test suite takes way too long already.

Anyway, for now a minimal fix should do. Debug features can be added to this case and several similar ones later.

Show 31 quoted lines
>
>> 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
>>
Previous: SZEDER GáborNext: Ævar Arnfjörð Bjarmason
Message 7 of 14 in “parallel-checkout: use grep -c to count workers in tests”
  1. parallel-checkout: use grep -c to count workers in testsRené Scharfe, Jun 5, 2021
  2. Matheus Tavares BernardinoJun 5, 2021
  3. René ScharfeJun 5, 2021
  4. René ScharfeJun 5, 2021
  5. parallel-checkout: avoid dash local bug in testsRené Scharfe, Jun 5, 2021
  6. SZEDER GáborJun 5, 2021
  7. René ScharfeJun 6, 2021
  8. Ævar Arnfjörð BjarmasonJun 5, 2021
  9. Matheus Tavares BernardinoJun 5, 2021
  10. Matheus Tavares BernardinoJun 5, 2021
  11. René ScharfeJun 6, 2021
  12. Junio C HamanoJun 6, 2021
  13. parallel-checkout: avoid dash local bug in testsRené Scharfe, Jun 6, 2021
  14. Junio C HamanoJun 6, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.