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
parent
61ed71dcff
commit
1c6f5b52b7
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue