t: make 'test_i18ngrep' more informative on failure
authorSZEDER Gábor <szeder.dev@gmail.com>
Thu, 8 Feb 2018 15:56:56 +0000 (16:56 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Feb 2018 18:54:27 +0000 (10:54 -0800)
When 'test_i18ngrep' can't find the expected pattern, it exits
completely silently; when its negated form does find the pattern that
shouldn't be there, it prints the matching line(s) but otherwise exits
without any error message. This leaves the developer puzzled about
what could have gone wrong.

Make 'test_i18ngrep' more informative on failure by printing an error
message including the invoked 'grep' command and the contents of the
file it had to scan through.

Note that this "dump the scanned file" part is not quite perfect, as
it dumps only the file specified as the function's last positional
parameter, thus assuming that there is only a single file parameter.
I think that's a reasonable assumption to make, one that holds true in
the current code base. And even if someone were to scan multiple
files at once in the future, the worst thing that could happen is that
the verbose error message won't include the contents of all those
files, only the last one. Alas, we can't really do any better than
this, because checking whether the other positional parameters match a
filename can result in false positives: 't3400-rebase.sh' and
't3404-rebase-interactive.sh' contain one test each, where the
'test_i18ngrep's pattern verbatimly matches a file in the trash
directory.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/test-lib-functions.sh
index 64f793e3d73e6f7e0ab2d813487efb0b237489d0..1de31fae7fd173d0f1e74c8a2eacf3e7e94a1722 100644 (file)
@@ -733,14 +733,30 @@ test_i18ngrep () {
 
        if test -n "$GETTEXT_POISON"
        then
-           : # pretend success
-       elif test "x!" = "x$1"
+               # pretend success
+               return 0
+       fi
+
+       if test "x!" = "x$1"
        then
                shift
-               ! grep "$@"
+               ! grep "$@" && return 0
+
+               echo >&2 "error: '! grep $@' did find a match in:"
        else
-               grep "$@"
+               grep "$@" && return 0
+
+               echo >&2 "error: 'grep $@' didn't find a match in:"
        fi
+
+       if test -s "$last_arg"
+       then
+               cat >&2 "$last_arg"
+       else
+               echo >&2 "<File '$last_arg' is empty>"
+       fi
+
+       return 1
 }
 
 # Call any command "$@" but be more verbose about its