On Fri, May 10, 2024 at 01:34:42PM -0700, Junio C Hamano wrote: > Emily Shaffer <nasamuffin@xxxxxxxxxx> writes: > > > While I'm at it, since you pointed out ! instead of test_must_fail, I > > wondered if I should change "! test_grep" as well - but when I grep t/ > > it looks like it's not usual to use `test_must_fail test_grep`, but > > instead to use `test_grep ! <omitted pattern> <file>`. I'll change > > that too. > > "! test_grep" is an anti-pattern. We should have a documentation > somewhere in t/README or nearby (if we don't, somebody please add > one). Better than documentation, maybe something like: diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl index b2b28c2ced..7de2c30aa0 100755 --- a/t/check-non-portable-shell.pl +++ b/t/check-non-portable-shell.pl @@ -51,6 +51,7 @@ sub err { err q(quote "$val" in 'local var=$val'); /^\s*([A-Z0-9_]+=(\w*|(["']).*?\3)\s+)+(\w+)/ and exists($func{$4}) and err '"FOO=bar shell_func" assignment extends beyond "shell_func"'; + /! test_grep/ and err 'do not invert test_* functions'; $line = ''; # this resets our $. for each file close ARGV if eof; There's at least one other case already. If you shorten it to just "! test_" to catch more functions, you can see there are a lot of wrong test_cmp invocations, too (maybe not quite as bad because we don't produce a specific message, but we'd yield a confusing diff output). But I think we can't cover everything; there are some like test_have_prereq which obviously are invertible. -Peff