Skip to content

Commit

Permalink
difftool: add support for --trust-exit-code
Browse files Browse the repository at this point in the history
Teach difftool to exit when a diff tool returns a non-zero exit
code when either --trust-exit-code is specified or
difftool.trustExitCode is true.

Forward exit codes from invoked diff tools to the caller when
--trust-exit-code is used.

Suggested-by: Adri Farr <14farresa@gmail.com>
Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
davvid authored and gitster committed Oct 28, 2014
1 parent 2509869 commit 2b52123
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 0 deletions.
14 changes: 14 additions & 0 deletions Documentation/git-difftool.txt
Expand Up @@ -91,6 +91,15 @@ instead. `--no-symlinks` is the default on Windows.
the default diff tool will be read from the configured
`diff.guitool` variable instead of `diff.tool`.

--[no-]trust-exit-code::
'git-difftool' invokes a diff tool individually on each file.
Errors reported by the diff tool are ignored by default.
Use `--trust-exit-code` to make 'git-difftool' exit when an
invoked diff tool returns a non-zero exit code.
+
'git-difftool' will forward the exit code of the invoked tool when
'--trust-exit-code' is used.

See linkgit:git-diff[1] for the full list of supported options.

CONFIG VARIABLES
Expand All @@ -116,6 +125,11 @@ See the `--tool=<tool>` option above for more details.
difftool.prompt::
Prompt before each invocation of the diff tool.

difftool.trustExitCode::
Exit difftool if the invoked diff tool returns a non-zero exit status.
+
See the `--trust-exit-code` option above for more details.

SEE ALSO
--------
linkgit:git-diff[1]::
Expand Down
6 changes: 6 additions & 0 deletions git-difftool--helper.sh
Expand Up @@ -85,6 +85,12 @@ else
while test $# -gt 6
do
launch_merge_tool "$1" "$2" "$5"
status=$?
if test "$status" != 0 &&
test "$GIT_DIFFTOOL_TRUST_EXIT_CODE" = true
then
exit $status
fi
shift 7
done
fi
12 changes: 12 additions & 0 deletions git-difftool.perl
Expand Up @@ -346,6 +346,7 @@ sub main
symlinks => $^O ne 'cygwin' &&
$^O ne 'MSWin32' && $^O ne 'msys',
tool_help => undef,
trust_exit_code => undef,
);
GetOptions('g|gui!' => \$opts{gui},
'd|dir-diff' => \$opts{dirdiff},
Expand All @@ -356,6 +357,8 @@ sub main
'no-symlinks' => sub { $opts{symlinks} = 0; },
't|tool:s' => \$opts{difftool_cmd},
'tool-help' => \$opts{tool_help},
'trust-exit-code' => \$opts{trust_exit_code},
'no-trust-exit-code' => sub { $opts{trust_exit_code} = 0; },
'x|extcmd:s' => \$opts{extcmd});

if (defined($opts{help})) {
Expand Down Expand Up @@ -387,6 +390,15 @@ sub main
}
}

if (!defined $opts{trust_exit_code}) {
$opts{trust_exit_code} = Git::config_bool('difftool.trustExitCode');
}
if ($opts{trust_exit_code}) {
$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'true';
} else {
$ENV{GIT_DIFFTOOL_TRUST_EXIT_CODE} = 'false';
}

# In directory diff mode, 'git-difftool--helper' is called once
# to compare the a/b directories. In file diff mode, 'git diff'
# will invoke a separate instance of 'git-difftool--helper' for
Expand Down
43 changes: 43 additions & 0 deletions t/t7800-difftool.sh
Expand Up @@ -76,6 +76,49 @@ test_expect_success PERL 'difftool forwards arguments to diff' '
rm for-diff
'

test_expect_success PERL 'difftool ignores exit code' '
test_config difftool.error.cmd false &&
git difftool -y -t error branch
'

test_expect_success PERL 'difftool forwards exit code with --trust-exit-code' '
test_config difftool.error.cmd false &&
test_must_fail git difftool -y --trust-exit-code -t error branch
'

test_expect_success PERL 'difftool honors difftool.trustExitCode = true' '
test_config difftool.error.cmd false &&
test_config difftool.trustExitCode true &&
test_must_fail git difftool -y -t error branch
'

test_expect_success PERL 'difftool honors difftool.trustExitCode = false' '
test_config difftool.error.cmd false &&
test_config difftool.trustExitCode false &&
git difftool -y -t error branch
'

test_expect_success PERL 'difftool ignores exit code with --no-trust-exit-code' '
test_config difftool.error.cmd false &&
test_config difftool.trustExitCode true &&
git difftool -y --no-trust-exit-code -t error branch
'

test_expect_success PERL 'difftool stops on error with --trust-exit-code' '
test_when_finished "rm -f for-diff .git/fail-right-file" &&
test_when_finished "git reset -- for-diff" &&
write_script .git/fail-right-file <<-\EOF &&
echo "$2"
exit 1
EOF
>for-diff &&
git add for-diff &&
echo file >expect &&
test_must_fail git difftool -y --trust-exit-code \
--extcmd .git/fail-right-file branch >actual &&
test_cmp expect actual
'

test_expect_success PERL 'difftool honors --gui' '
difftool_test_setup &&
test_config merge.tool bogus-tool &&
Expand Down

0 comments on commit 2b52123

Please sign in to comment.