Merge branch 'jk/difftool-command-not-found' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:54 +0000 (21:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:54 +0000 (21:35 -0700)
"git difftool" by default ignores the error exit from the backend
commands it spawns, because often they signal that they found
differences by exiting with a non-zero status code just like "diff"
does; the exit status codes 126 and above however are special in
that they are used to signal that the command is not executable,
does not exist, or killed by a signal. "git difftool" has been
taught to notice these exit status codes.

* jk/difftool-command-not-found:
difftool: always honor fatal error exit codes

git-difftool--helper.sh
t/t7800-difftool.sh
index 84d6cc021c51ac53b68a8b9fdbdd3ed0f8d9d30a..7bfb6737dfe7be46f3f29903bef844c3c2b1be11 100755 (executable)
@@ -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
index 2974900578d3f21b57d5773973344a1743e8e6e0..70a2de461af58119f507a915104ba139dd0245df 100755 (executable)
@@ -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 &&