diff options
author | John Keeping <john@keeping.me.uk> | 2016-08-15 22:54:39 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-08-15 15:24:05 -0700 |
commit | 45a4f5d9f99334151af90b2199004ec49a651d7a (patch) | |
tree | 578d5f3d91b2729173c3460d0332c0f3cf448e15 | |
parent | e0c1ceafc5bece92d35773a75fff59497e1d9bd5 (diff) | |
download | git-45a4f5d9f99334151af90b2199004ec49a651d7a.tar.gz git-45a4f5d9f99334151af90b2199004ec49a651d7a.tar.xz |
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>
-rwxr-xr-x | git-difftool--helper.sh | 7 | ||||
-rwxr-xr-x | t/t7800-difftool.sh | 6 |
2 files changed, 13 insertions, 0 deletions
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh index 84d6cc021..7bfb6737d 100755 --- a/git-difftool--helper.sh +++ b/git-difftool--helper.sh @@ -86,6 +86,13 @@ else do launch_merge_tool "$1" "$2" "$5" status=$? + if test $status -ge 126 + then + # Command not found (127), not executable (126) or + # exited via a signal (>= 128). + exit $status + fi + if test "$status" != 0 && test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true then diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 297490057..70a2de461 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -124,6 +124,12 @@ test_expect_success PERL 'difftool stops on error with --trust-exit-code' ' test_cmp expect actual ' +test_expect_success PERL 'difftool honors exit status if command not found' ' + test_config difftool.nonexistent.cmd i-dont-exist && + test_config difftool.trustExitCode false && + test_must_fail git difftool -y -t nonexistent branch +' + test_expect_success PERL 'difftool honors --gui' ' difftool_test_setup && test_config merge.tool bogus-tool && |