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

Re: [PATCH v4 1/1] help: cleanup the contruction of keys_uniq

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 11, 2026, 21:11 UTC
Message-ID
<xmqqfr66m5qj.fsf@gitster.g>
In-Reply-To
<CAPvEtrf7gqyQYMcsii===kXY5Vut0EC_VsJ=xWUKNrq6YmA=nA@mail.gmail.com>
Amisha Chhajed <amishhhaaaa@gmail.com> writes:
Show 15 quoted lines
>> Perhaps something like this would replace the original "grep | sed"
>> pipeline?
>>
>>         sed -E -e "
>>                 /^[^.]+\.[^.]+$/b out
>>                 /^[^.]+\.[^.]+\.[^.]+$/b out
>>                 d
>>                 : out
>>                 s/\..*//
>>         " human |
>>         sort -u
>>
>>
>
> Thank you for pointing me in the right direction!

This unfortunately runs afoul of t/check-non-portable-shell.pl aka "make -C t test-lint". The particular rule was introduced in early 2019 with e62e225f (test-lint: only use only sed [-n] [-e command] [-f command_file], 2019-01-20). See the attached patch at the end.

It does cite the then-current POSIX.1 (Issue 7, 2018 edition) but the latest edition (Issue 8) documents "-E" as an option to use ERE

I wonder if the situation has improved in the past 7 years.

We seem to have started using "sed -E" without anybody complaining in 2022, with 461fec41 (bisect run: keep some of the post-v2.30.0 output, 2022-11-10). It was hidden because the 'E' was squished with another single letter option.

t/t6030-bisect-porcelain.sh:	sed -En 's/.*(bisect.*code) (-?[0-9]+) (from.*)/\1 -1 \3/p' err >actual &&

So I think of no strong reason to reject another new use of "sed -E". I am tempted to revert e62e225f (test-lint: only use only sed [-n] [-e command] [-f command_file], 2019-01-20), whose intention was to reject anything other than "-[efn]", to its previous form which rejected only "sed -i".

Alternatively, I would of course welcome volunteers to revamp the check-non-portable-shell.pl script to make the pattern more robust, and then add 'E' to the set of allowed options, but I somehow do not think that is a good use of our engineering resources.

For example, in addition to the escape we see in t6030 above, the current pattern would not catch use of -E if it is written this way:

	sed "-E" -e "
		...
	" human |
	sort -u
or
	sed \
		-E -e "
		...
	" human |
	sort -u

and million other ways to subvert the simple-minded pattern-match based check.

Opinions?
commit e62e225ffb589e59c4f64d90b0a393aa6a0a5ace
Author: Torsten Bögershausen <tboegi@web.de>
Date:   Sun Jan 20 08:53:50 2019 +0100
    test-lint: only use only sed [-n] [-e command] [-f command_file]
    
    From `man sed` (on a Mac OS X box):
    The -E, -a and -i options are non-standard FreeBSD extensions and may not be available
    on other operating systems.
    
    From `man sed` on a Linux box:
    REGULAR EXPRESSIONS
           POSIX.2 BREs should be supported, but they aren't completely because of
           performance problems.  The \n sequence in a regular expression matches the newline
           character,  and  similarly  for \a, \t, and other sequences.
           The -E option switches to using extended regular expressions instead; the -E option
           has been supported for years by GNU sed, and is now included in POSIX.
    
    Well, there are still a lot of systems out there, which don't support it.
    Beside that, IEEE Std 1003.1TM-2017, see
    http://pubs.opengroup.org/onlinepubs/9699919799/
    does not mention -E either.
    
    To be on the safe side, don't allow -E (or -r, which is GNU).
    Change check-non-portable-shell.pl to only accept the portable options:
    sed [-n] [-e command] [-f command_file]
    
    Reported-by: SZEDER Gábor <szeder.dev@gmail.com>
    Helped-by: Eric Sunshine <sunshine@sunshineco.com>
    Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    Signed-off-by: Torsten Bögershausen <tboegi@web.de>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl
index b45bdac688..f0edcf8eb0 100755
--- a/t/check-non-portable-shell.pl
+++ b/t/check-non-portable-shell.pl
@@ -35,7 +35,7 @@ sub err {
 		chomp;
 	}
 
-	/\bsed\s+-i/ and err 'sed -i is not portable';
+	/\bsed\s+-[^efn]\s+/ and err 'sed option not portable (use only -n, -e, -f)';
 	/\becho\s+-[neE]/ and err 'echo with option is not portable (use printf)';
 	/^\s*declare\s+/ and err 'arrays/declare not portable';
 	/^\s*[^#]\s*which\s/ and err 'which is not portable (use type)';
Previous: Amisha ChhajedNext: Eric Sunshine
Message 26 of 31 in “clean leftover calls to string_list_remove_duplicates”
  1. 0/2 clean leftover calls to string_list_remove_duplicatesAmisha Chhajed, Feb 12, 2026
  2. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 12, 2026
  3. Junio C HamanoFeb 12, 2026
  4. 2/2 help: ensure &keys_uniq follows sort -uAmisha Chhajed, Feb 12, 2026
  5. Junio C HamanoFeb 12, 2026
  6. Amisha ChhajedFeb 12, 2026
  7. Junio C HamanoFeb 12, 2026
  8. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 13, 2026
  9. 2/2 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 13, 2026
  10. Junio C HamanoFeb 13, 2026
  11. Eric SunshineFeb 13, 2026
  12. Junio C HamanoFeb 13, 2026
  13. Amisha ChhajedFeb 21, 2026
  14. 1/2 sparse-checkout: use string_list_sort_uAmisha Chhajed, Feb 21, 2026
  15. 2/2 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 21, 2026
  16. Junio C HamanoFeb 22, 2026
  17. Amisha ChhajedFeb 22, 2026
  18. Junio C HamanoFeb 26, 2026
  19. Amisha ChhajedFeb 28, 2026
  20. Junio C HamanoMar 2, 2026
  21. Junio C HamanoFeb 22, 2026
  22. 0/1 Make keys_uniq stop depending on sort of keys_uniqAmisha Chhajed, Feb 28, 2026
  23. 1/1 help: cleanup the contruction of keys_uniqAmisha Chhajed, Feb 28, 2026
  24. Junio C HamanoMar 2, 2026
  25. Amisha ChhajedMar 11, 2026
  26. Junio C HamanoMar 11, 2026
  27. Eric SunshineMar 11, 2026
  28. Junio C HamanoMar 11, 2026
  29. Eric SunshineMar 11, 2026
  30. help: cleanup the contruction of keys_uniqAmisha Chhajed, Mar 11, 2026
  31. Junio C HamanoMar 11, 2026

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.