]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t4020: test exit code with external diffs
authorRené Scharfe <l.s.r@web.de>
Sun, 9 Jun 2024 07:38:24 +0000 (09:38 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Jun 2024 16:19:20 +0000 (09:19 -0700)
Add tests to check the exit code of git diff with its options --quiet
and --exit-code when using an external diff program.  Currently we
cannot tell whether it found significant changes or not.

While at it, document briefly that --quiet turns off execution of
external diff programs because that behavior surprised me for a moment
while writing the tests.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/diff-options.txt
t/t4020-diff-external.sh

index c7df20e571ddf4ef3f5e7bcbcb5fc1f37ad4cd53..6b73daf54050231bec6889ecfa5fd5816b761fbc 100644 (file)
@@ -820,6 +820,7 @@ ifndef::git-log[]
 
 --quiet::
        Disable all output of the program. Implies `--exit-code`.
+       Disables execution of external diff helpers.
 endif::git-log[]
 endif::git-format-patch[]
 
index fdd865f7c38dea5b60910b46c2a113ec7f5c2a09..4070523cdbedcd99cfc8a2f9844eaeb14c9a0377 100755 (executable)
@@ -172,6 +172,59 @@ test_expect_success 'no diff with -diff' '
        grep Binary out
 '
 
+check_external_diff () {
+       expect_code=$1
+       expect_out=$2
+       expect_err=$3
+       command_code=$4
+       shift 4
+       options="$@"
+
+       command="echo output; exit $command_code;"
+       desc="external diff '$command'"
+       with_options="${options:+ with }$options"
+
+       test_expect_success "$desc via attribute$with_options" "
+               test_config diff.foo.command \"$command\" &&
+               echo \"file diff=foo\" >.gitattributes &&
+               test_expect_code $expect_code git diff $options >out 2>err &&
+               test_cmp $expect_out out &&
+               test_cmp $expect_err err
+       "
+
+       test_expect_success "$desc via diff.external$with_options" "
+               test_config diff.external \"$command\" &&
+               >.gitattributes &&
+               test_expect_code $expect_code git diff $options >out 2>err &&
+               test_cmp $expect_out out &&
+               test_cmp $expect_err err
+       "
+
+       test_expect_success "$desc via GIT_EXTERNAL_DIFF$with_options" "
+               >.gitattributes &&
+               test_expect_code $expect_code env \
+                       GIT_EXTERNAL_DIFF=\"$command\" \
+                       git diff $options >out 2>err &&
+               test_cmp $expect_out out &&
+               test_cmp $expect_err err
+       "
+}
+
+test_expect_success 'setup output files' '
+       : >empty &&
+       echo output >output &&
+       echo "fatal: external diff died, stopping at file" >error
+'
+
+check_external_diff   0 output empty 0
+check_external_diff 128 output error 1
+
+check_external_diff   1 output empty 0 --exit-code
+check_external_diff 128 output error 1 --exit-code
+
+check_external_diff   1 empty  empty 0 --quiet
+check_external_diff   1 empty  empty 1 --quiet # we don't even call the program
+
 echo NULZbetweenZwords | perl -pe 'y/Z/\000/' > file
 
 test_expect_success 'force diff with "diff"' '