difftool: Allow specifying unconfigured commands with --extcmd

git-difftool requires difftool.<tool>.cmd configuration even when
tools use the standard "$diffcmd $from $to" form.  This teaches
git-difftool to run these tools in lieu of configuration by
allowing the command to be specified on the command line.

Reference: http://article.gmane.org/gmane.comp.version-control.git/133377
Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
David Aguilar 2010-01-09 20:02:42 -08:00 committed by Junio C Hamano
parent 61ed71dcff
commit 1c6f5b52b7
4 changed files with 50 additions and 8 deletions

View File

@ -58,6 +58,11 @@ is set to the name of the temporary file containing the contents
of the diff post-image. `$BASE` is provided for compatibility of the diff post-image. `$BASE` is provided for compatibility
with custom merge tool commands and has the same value as `$LOCAL`. with custom merge tool commands and has the same value as `$LOCAL`.


--extcmd=<command>::
Specify a custom command for viewing diffs.
'git-difftool' ignores the configured defaults and runs
`$command $LOCAL $REMOTE` when this option is specified.

-g:: -g::
--gui:: --gui::
When 'git-difftool' is invoked with the `-g` or `--gui` option When 'git-difftool' is invoked with the `-g` or `--gui` option

View File

@ -19,6 +19,11 @@ should_prompt () {
fi fi
} }


# Indicates that --extcmd=... was specified
use_ext_cmd () {
test -n "$GIT_DIFFTOOL_EXTCMD"
}

launch_merge_tool () { launch_merge_tool () {
# Merged is the filename as it appears in the work tree # Merged is the filename as it appears in the work tree
# Local is the contents of a/filename # Local is the contents of a/filename
@ -33,18 +38,29 @@ launch_merge_tool () {
# the user with the real $MERGED name before launching $merge_tool. # the user with the real $MERGED name before launching $merge_tool.
if should_prompt; then if should_prompt; then
printf "\nViewing: '$MERGED'\n" printf "\nViewing: '$MERGED'\n"
printf "Hit return to launch '%s': " "$merge_tool" if use_ext_cmd; then
printf "Hit return to launch '%s': " \
"$GIT_DIFFTOOL_EXTCMD"
else
printf "Hit return to launch '%s': " "$merge_tool"
fi
read ans read ans
fi fi


run_merge_tool "$merge_tool" if use_ext_cmd; then
$GIT_DIFFTOOL_EXTCMD "$LOCAL" "$REMOTE"
else
run_merge_tool "$merge_tool"
fi

} }


# GIT_DIFF_TOOL indicates that --tool=... was specified if ! use_ext_cmd; then
if test -n "$GIT_DIFF_TOOL"; then if test -n "$GIT_DIFF_TOOL"; then
merge_tool="$GIT_DIFF_TOOL" merge_tool="$GIT_DIFF_TOOL"
else else
merge_tool="$(get_merge_tool)" || exit merge_tool="$(get_merge_tool)" || exit
fi
fi fi


# Launch the merge tool on each path provided by 'git diff' # Launch the merge tool on each path provided by 'git diff'

View File

@ -62,6 +62,10 @@ sub generate_command
$skip_next = 1; $skip_next = 1;
next; next;
} }
if ($arg =~ /^--extcmd=/) {
$ENV{GIT_DIFFTOOL_EXTCMD} = substr($arg, 9);
next;
}
if ($arg =~ /^--tool=/) { if ($arg =~ /^--tool=/) {
$ENV{GIT_DIFF_TOOL} = substr($arg, 7); $ENV{GIT_DIFF_TOOL} = substr($arg, 7);
next; next;

View File

@ -214,7 +214,24 @@ test_expect_success 'difftool.<tool>.path' '
diff=$(git difftool --tool=tkdiff --no-prompt branch) && diff=$(git difftool --tool=tkdiff --no-prompt branch) &&
git config --unset difftool.tkdiff.path && git config --unset difftool.tkdiff.path &&
lines=$(echo "$diff" | grep file | wc -l) && lines=$(echo "$diff" | grep file | wc -l) &&
test "$lines" -eq 1 test "$lines" -eq 1 &&

restore_test_defaults
'

test_expect_success 'difftool --extcmd=...' '
diff=$(git difftool --no-prompt --extcmd=cat branch) &&

lines=$(echo "$diff" | wc -l) &&
test "$lines" -eq 2 &&

lines=$(echo "$diff" | grep master | wc -l) &&
test "$lines" -eq 1 &&

lines=$(echo "$diff" | grep branch | wc -l) &&
test "$lines" -eq 1 &&

restore_test_defaults
' '


test_done test_done