Skip to content

Commit

Permalink
t4020: test exit code with external diffs
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
rscharfe authored and gitster committed Jun 10, 2024
1 parent 1b76f06 commit 33be6cf
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions Documentation/diff-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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[]

Expand Down
53 changes: 53 additions & 0 deletions t/t4020-diff-external.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"' '
Expand Down

0 comments on commit 33be6cf

Please sign in to comment.