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 <john@keeping.me.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>

John Keeping committed Aug 15, 2016 at 22:54 UTC 45a4f5d9f99334151af90b2199004ec49a651d7a
2 files changed +13
git-difftool--helper.sh
+7
@@ -86,6 +86,13 @@ else
86 do
87 launch_merge_tool "$1" "$2" "$5"
88 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 +
96 if test "$status" != 0 &&
97 test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
98 then
t/t7800-difftool.sh
+6
@@ -124,6 +124,12 @@ test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
124 test_cmp expect actual
125 '
126
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 +
133 test_expect_success PERL 'difftool honors --gui' '
134 difftool_test_setup &&
135 test_config merge.tool bogus-tool &&