diff options
Diffstat (limited to 'git-difftool--helper.sh')
-rwxr-xr-x | git-difftool--helper.sh | 83 |
1 files changed, 61 insertions, 22 deletions
diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh index 57e8e3256d..2b11b1d6fe 100755 --- a/git-difftool--helper.sh +++ b/git-difftool--helper.sh @@ -3,24 +3,29 @@ # This script is typically launched by using the 'git difftool' # convenience command. # -# Copyright (c) 2009 David Aguilar +# Copyright (c) 2009, 2010 David Aguilar -# Load common functions from git-mergetool--lib TOOL_MODE=diff . git-mergetool--lib # difftool.prompt controls the default prompt/no-prompt behavior # and is overridden with $GIT_DIFFTOOL*_PROMPT. should_prompt () { - prompt=$(git config --bool difftool.prompt || echo true) - if test "$prompt" = true; then + prompt_merge=$(git config --bool mergetool.prompt || echo true) + prompt=$(git config --bool difftool.prompt || echo $prompt_merge) + if test "$prompt" = true + then test -z "$GIT_DIFFTOOL_NO_PROMPT" else test -n "$GIT_DIFFTOOL_PROMPT" fi } -# Sets up shell variables and runs a merge tool +# 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,27 +38,61 @@ launch_merge_tool () { # $LOCAL and $REMOTE are temporary files so prompt # 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" - read ans + if should_prompt + then + printf "\nViewing (%s/%s): '%s'\n" "$GIT_DIFF_PATH_COUNTER" \ + "$GIT_DIFF_PATH_TOTAL" "$MERGED" + if use_ext_cmd + then + printf "Launch '%s' [Y/n]: " \ + "$GIT_DIFFTOOL_EXTCMD" + else + printf "Launch '%s' [Y/n]: " "$merge_tool" + fi + read ans || return + if test "$ans" = n + then + return + fi fi - # Run the appropriate merge tool command - run_merge_tool "$merge_tool" + if use_ext_cmd + then + export BASE + eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"' + else + run_merge_tool "$merge_tool" + fi } -# Allow GIT_DIFF_TOOL and GIT_MERGE_TOOL to provide default values -test -n "$GIT_MERGE_TOOL" && merge_tool="$GIT_MERGE_TOOL" -test -n "$GIT_DIFF_TOOL" && merge_tool="$GIT_DIFF_TOOL" +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 -if test -z "$merge_tool"; then - merge_tool="$(get_merge_tool)" || exit +if test -n "$GIT_DIFFTOOL_DIRDIFF" +then + LOCAL="$1" + REMOTE="$2" + run_merge_tool "$merge_tool" false +else + # Launch the merge tool on each path provided by 'git diff' + 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 -# Launch the merge tool on each path provided by 'git diff' -while test $# -gt 6 -do - launch_merge_tool "$1" "$2" "$5" - shift 7 -done +exit 0 |