Skip to content

Commit 45a4f5d

Browse files
johnkeepinggitster
authored andcommitted
difftool: always honor fatal error exit codes
At the moment difftool's "trust exit code" logic always suppresses the exit status of the diff utility we invoke. This is useful because we don't want to exit just because diff returned "1" because the files differ, but it's confusing if the shell returns an error because the selected diff utility is not found. POSIX specifies 127 as the exit status for "command not found", 126 for "command found but is not executable" and values greater than 128 if the command terminated because it received a signal [1] and at least bash and dash follow this specification, while diff utilities generally use "1" for the exit status we want to ignore. Handle any value of 126 or greater as a special value indicating that some form of fatal error occurred. [1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_08_02 Signed-off-by: John Keeping <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e0c1cea commit 45a4f5d

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

git-difftool--helper.sh

+7
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ else
8686
do
8787
launch_merge_tool "$1" "$2" "$5"
8888
status=$?
89+
if test $status -ge 126
90+
then
91+
# Command not found (127), not executable (126) or
92+
# exited via a signal (>= 128).
93+
exit $status
94+
fi
95+
8996
if test "$status" != 0 &&
9097
test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
9198
then

t/t7800-difftool.sh

+6
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
124124
test_cmp expect actual
125125
'
126126

127+
test_expect_success PERL 'difftool honors exit status if command not found' '
128+
test_config difftool.nonexistent.cmd i-dont-exist &&
129+
test_config difftool.trustExitCode false &&
130+
test_must_fail git difftool -y -t nonexistent branch
131+
'
132+
127133
test_expect_success PERL 'difftool honors --gui' '
128134
difftool_test_setup &&
129135
test_config merge.tool bogus-tool &&

0 commit comments

Comments
 (0)