On Fri, Jan 26, 2018 at 01:37:06PM +0100, SZEDER Gábor wrote: > When checking a git command's output with 'test_i18ngrep', it's > tempting to conveniently pipe the git command's standard output into > 'test_i18ngrep'. Unfortunately, this is an anti-pattern, because it > hides the git command's exit code, and the test could continue even if > the command exited with error. > > Add a bit of linting to 'test_i18ngrep' to detect when data is fed to > its standard input and to error out with a "bug in the test script" > message. > > Note that this change will also forbid cases where 'test_i18ngrep' > would legitimately read its standard input, e.g. > > - when its standard input is redirected from a file, or > > - when a git command's standard output is first written to an > intermediate file, which is then preprocessed by a non-git command > before the results are piped into 'test_i18ngrep'. > > See two of the previous patches for the only such cases we had in our > test suite. However, reliably preventing this antipattern is arguably > more important than supporting these cases, which can be worked around > by only minor inconveniences. The idea seems reasonable to me. Let's think about what the escape hatch looks like to work around it if you need to. I guess you've got: cat >file && test_i18ngrep ... file which is not too bad. You've also got: test_i18ngrep ... - though that relies on the underlying grep understanding "-" (which is in POSIX, though with a rather vague "if the implementations supports it"). And it wouldn't work with the "read" test in this patch. > diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh > index 92ed02937..e381d50d0 100644 > --- a/t/test-lib-functions.sh > +++ b/t/test-lib-functions.sh > @@ -719,6 +719,10 @@ test_i18ncmp () { > # under GETTEXT_POISON this pretends that the command produced expected > # results. > test_i18ngrep () { > + ( read line ) && > + error "bug in the test script: data on test_i18ngrep's stdin;" \ > + "perhaps a git command's output is piped into it?" > + This seems kind of hacky compared to just seeing if there is a file argument. But I suppose that is hard to do, since we just pass through the arguments to grep. Though looking at our test_18ngrep invocations, they are simple enough that would just ask "are there two non-option arguments at the end of the command line". The exception is "-e", but IMHO we could just drop that. It serves no purpose unless you're trying to hide a "-" at the start of your pattern, and in fact we used to ban it since sysv grep didn't understand it (e.g., aadbe44f883). -Peff