[PATCH 3/4] difftool: Allow specifying unconfigured commands with --extcmd
From: David Aguilar <hidden>
Date: 2016-06-15 22:47:59
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
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 <redacted> --- Documentation/git-difftool.txt | 5 +++++ git-difftool--helper.sh | 30 +++++++++++++++++++++++------- git-difftool.perl | 4 ++++ t/t7800-difftool.sh | 19 ++++++++++++++++++- 4 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index a5bce62..f67d2db 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt@@ -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 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:: --gui:: When 'git-difftool' is invoked with the `-g` or `--gui` option
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh
index 3621f28..d806eae 100755
--- a/git-difftool--helper.sh
+++ b/git-difftool--helper.sh@@ -19,6 +19,11 @@ should_prompt () { fi } +# Indicates that --extcmd=... was specified +use_ext_cmd () { + test -n "$GIT_DIFFTOOL_EXTCMD" +} + launch_merge_tool () { # Merged is the filename as it appears in the work tree # 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. if should_prompt; then 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 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 test -n "$GIT_DIFF_TOOL"; then - merge_tool="$GIT_DIFF_TOOL" -else - merge_tool="$(get_merge_tool)" || exit +if ! use_ext_cmd; then + if test -n "$GIT_DIFF_TOOL"; then + merge_tool="$GIT_DIFF_TOOL" + else + merge_tool="$(get_merge_tool)" || exit + fi fi # Launch the merge tool on each path provided by 'git diff'
diff --git a/git-difftool.perl b/git-difftool.perl
index 8c836e4..f8ff245 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl@@ -62,6 +62,10 @@ sub generate_command $skip_next = 1; next; } + if ($arg =~ /^--extcmd=/) { + $ENV{GIT_DIFFTOOL_EXTCMD} = substr($arg, 9); + next; + } if ($arg =~ /^--tool=/) { $ENV{GIT_DIFF_TOOL} = substr($arg, 7); next;
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index eca51a8..8ee186a 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh@@ -214,7 +214,24 @@ test_expect_success 'difftool.<tool>.path' ' diff=$(git difftool --tool=tkdiff --no-prompt branch) && git config --unset difftool.tkdiff.path && 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
--
1.6.6.4.g20a38b.dirty