difftool: Allow specifying unconfigured commands with --extcmd
authorDavid Aguilar <davvid@gmail.com>
Sun, 10 Jan 2010 04:02:42 +0000 (20:02 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 10 Jan 2010 06:41:30 +0000 (22:41 -0800)
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>
Documentation/git-difftool.txt
git-difftool--helper.sh
git-difftool.perl
t/t7800-difftool.sh

index a5bce6278b6570e9feb94cfbe0f67f3814a36aa5..f67d2db761e28aa1d69a182c0361718ee1ec751c 100644 (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
 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
index 3621f28c7969b7848e3fbcac49647f32028f18e7..d806eaef541742f0cd3ab47c855e01749d7b6535 100755 (executable)
@@ -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'
index 8c836e4c76528e52b010dd37e904f132d5386000..f8ff245756c237894523c01068170955f988df75 100755 (executable)
@@ -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;
index eca51a8fe8090e22f49b3c983a95fe1388be4584..8ee186a5fbda8b52cf3dd817a76f2f560505a253 100755 (executable)
@@ -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