#!/bin/sh # git-difftool--helper is a GIT_EXTERNAL_DIFF-compatible diff tool launcher. # This script is typically launched by using the 'git difftool' # convenience command. # # Copyright (c) 2009, 2010 David Aguilar setglobal TOOL_MODE = 'diff' source git-mergetool--lib # difftool.prompt controls the default prompt/no-prompt behavior # and is overridden with $GIT_DIFFTOOL*_PROMPT. proc should_prompt { setglobal prompt_merge = $[git config --bool mergetool.prompt || echo true] setglobal prompt = $[git config --bool difftool.prompt || echo $prompt_merge] if test $prompt = true { test -z $GIT_DIFFTOOL_NO_PROMPT } else { test -n $GIT_DIFFTOOL_PROMPT } } # Indicates that --extcmd=... was specified proc use_ext_cmd { test -n $GIT_DIFFTOOL_EXTCMD } proc launch_merge_tool { # Merged is the filename as it appears in the work tree # Local is the contents of a/filename # Remote is the contents of b/filename # Custom merge tool commands might use $BASE so we provide it setglobal MERGED = $1 setglobal LOCAL = $2 setglobal REMOTE = $3 setglobal BASE = $1 # $LOCAL and $REMOTE are temporary files so prompt # the user with the real $MERGED name before launching $merge_tool. if should_prompt { printf "\nViewing (%s/%s): '%s'\n" $GIT_DIFF_PATH_COUNTER \ $GIT_DIFF_PATH_TOTAL $MERGED if use_ext_cmd { printf "Launch '%s' [Y/n]? " \ $GIT_DIFFTOOL_EXTCMD } else { printf "Launch '%s' [Y/n]? " $merge_tool } read ans || return if test $ans = n { return } } if use_ext_cmd { export BASE eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"' } else { run_merge_tool $merge_tool } } if ! use_ext_cmd { if test -n $GIT_DIFF_TOOL { setglobal merge_tool = $GIT_DIFF_TOOL } else { setglobal merge_tool = $[get_merge_tool] || exit } } if test -n $GIT_DIFFTOOL_DIRDIFF { setglobal LOCAL = $1 setglobal REMOTE = $2 run_merge_tool $merge_tool false } else { # Launch the merge tool on each path provided by 'git diff' while test $# -gt 6 { launch_merge_tool $1 $2 $5 setglobal status = $Status if test $status -ge 126 { # Command not found (127), not executable (126) or # exited via a signal (>= 128). exit $status } if test $status != 0 && test $GIT_DIFFTOOL_TRUST_EXIT_CODE = true { exit $status } shift 7 } } exit 0