1#!/bin/sh 2# git-difftool--helper is a GIT_EXTERNAL_DIFF-compatible diff tool launcher. 3# This script is typically launched by using the 'git difftool' 4# convenience command. 5# 6# Copyright (c) 2009, 2010 David Aguilar 7 8TOOL_MODE=diff 9. git-mergetool--lib 10 11# difftool.prompt controls the default prompt/no-prompt behavior 12# and is overridden with $GIT_DIFFTOOL*_PROMPT. 13should_prompt () { 14 prompt_merge=$(git config --bool mergetool.prompt || echo true) 15 prompt=$(git config --bool difftool.prompt || echo $prompt_merge) 16iftest"$prompt"= true 17then 18test -z"$GIT_DIFFTOOL_NO_PROMPT" 19else 20test -n"$GIT_DIFFTOOL_PROMPT" 21fi 22} 23 24# Indicates that --extcmd=... was specified 25use_ext_cmd () { 26test -n"$GIT_DIFFTOOL_EXTCMD" 27} 28 29launch_merge_tool () { 30# Merged is the filename as it appears in the work tree 31# Local is the contents of a/filename 32# Remote is the contents of b/filename 33# Custom merge tool commands might use $BASE so we provide it 34 MERGED="$1" 35 LOCAL="$2" 36 REMOTE="$3" 37 BASE="$1" 38 39# $LOCAL and $REMOTE are temporary files so prompt 40# the user with the real $MERGED name before launching $merge_tool. 41if should_prompt 42then 43printf"\nViewing (%s/%s): '%s'\n""$GIT_DIFF_PATH_COUNTER" \ 44"$GIT_DIFF_PATH_TOTAL""$MERGED" 45if use_ext_cmd 46then 47printf"Launch '%s' [Y/n]? " \ 48"$GIT_DIFFTOOL_EXTCMD" 49else 50printf"Launch '%s' [Y/n]? ""$merge_tool" 51fi 52read ans ||return 53iftest"$ans"= n 54then 55return 56fi 57fi 58 59if use_ext_cmd 60then 61export BASE 62eval$GIT_DIFFTOOL_EXTCMD'"$LOCAL"''"$REMOTE"' 63else 64 run_merge_tool "$merge_tool" 65fi 66} 67 68if! use_ext_cmd 69then 70iftest -n"$GIT_DIFF_TOOL" 71then 72 merge_tool="$GIT_DIFF_TOOL" 73else 74 merge_tool="$(get_merge_tool)" 75fi 76fi 77 78iftest -n"$GIT_DIFFTOOL_DIRDIFF" 79then 80 LOCAL="$1" 81 REMOTE="$2" 82 run_merge_tool "$merge_tool" false 83else 84# Launch the merge tool on each path provided by 'git diff' 85whiletest$#-gt6 86do 87 launch_merge_tool "$1""$2""$5" 88 status=$? 89iftest$status-ge126 90then 91# Command not found (127), not executable (126) or 92# exited via a signal (>= 128). 93exit$status 94fi 95 96iftest"$status"!=0&& 97test"$GIT_DIFFTOOL_TRUST_EXIT_CODE"= true 98then 99exit$status 100fi 101shift7 102done 103fi 104 105exit0