David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 1 | #!/bin/sh |
David Aguilar | afcbc8e | 2009-04-07 01:21:20 -0700 | [diff] [blame] | 2 | # git-difftool--helper is a GIT_EXTERNAL_DIFF-compatible diff tool launcher. |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 3 | # This script is typically launched by using the 'git difftool' |
| 4 | # convenience command. |
| 5 | # |
David Aguilar | c8a5672 | 2010-01-15 19:10:03 -0800 | [diff] [blame] | 6 | # Copyright (c) 2009, 2010 David Aguilar |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 7 | |
David Aguilar | 21d0ba7 | 2009-04-08 00:17:20 -0700 | [diff] [blame] | 8 | TOOL_MODE=diff |
| 9 | . git-mergetool--lib |
| 10 | |
David Aguilar | a904392 | 2009-04-07 01:21:22 -0700 | [diff] [blame] | 11 | # difftool.prompt controls the default prompt/no-prompt behavior |
| 12 | # and is overridden with $GIT_DIFFTOOL*_PROMPT. |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 13 | should_prompt () { |
Sebastian Schuberth | 4cacc62 | 2010-01-22 17:36:36 +0100 | [diff] [blame] | 14 | prompt_merge=$(git config --bool mergetool.prompt || echo true) |
| 15 | prompt=$(git config --bool difftool.prompt || echo $prompt_merge) |
David Aguilar | a904392 | 2009-04-07 01:21:22 -0700 | [diff] [blame] | 16 | if test "$prompt" = true; then |
| 17 | test -z "$GIT_DIFFTOOL_NO_PROMPT" |
| 18 | else |
| 19 | test -n "$GIT_DIFFTOOL_PROMPT" |
| 20 | fi |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 21 | } |
| 22 | |
David Aguilar | 1c6f5b5 | 2010-01-09 20:02:42 -0800 | [diff] [blame] | 23 | # Indicates that --extcmd=... was specified |
| 24 | use_ext_cmd () { |
| 25 | test -n "$GIT_DIFFTOOL_EXTCMD" |
| 26 | } |
| 27 | |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 28 | launch_merge_tool () { |
| 29 | # Merged is the filename as it appears in the work tree |
| 30 | # Local is the contents of a/filename |
| 31 | # Remote is the contents of b/filename |
| 32 | # Custom merge tool commands might use $BASE so we provide it |
| 33 | MERGED="$1" |
| 34 | LOCAL="$2" |
| 35 | REMOTE="$3" |
| 36 | BASE="$1" |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 37 | |
| 38 | # $LOCAL and $REMOTE are temporary files so prompt |
| 39 | # the user with the real $MERGED name before launching $merge_tool. |
| 40 | if should_prompt; then |
| 41 | printf "\nViewing: '$MERGED'\n" |
David Aguilar | 1c6f5b5 | 2010-01-09 20:02:42 -0800 | [diff] [blame] | 42 | if use_ext_cmd; then |
| 43 | printf "Hit return to launch '%s': " \ |
| 44 | "$GIT_DIFFTOOL_EXTCMD" |
| 45 | else |
| 46 | printf "Hit return to launch '%s': " "$merge_tool" |
| 47 | fi |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 48 | read ans |
| 49 | fi |
| 50 | |
David Aguilar | 1c6f5b5 | 2010-01-09 20:02:42 -0800 | [diff] [blame] | 51 | if use_ext_cmd; then |
David Aguilar | 9f3d54d | 2010-01-15 14:03:44 -0800 | [diff] [blame] | 52 | eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"' |
David Aguilar | 1c6f5b5 | 2010-01-09 20:02:42 -0800 | [diff] [blame] | 53 | else |
| 54 | run_merge_tool "$merge_tool" |
| 55 | fi |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 56 | } |
| 57 | |
David Aguilar | 1c6f5b5 | 2010-01-09 20:02:42 -0800 | [diff] [blame] | 58 | if ! use_ext_cmd; then |
| 59 | if test -n "$GIT_DIFF_TOOL"; then |
| 60 | merge_tool="$GIT_DIFF_TOOL" |
| 61 | else |
| 62 | merge_tool="$(get_merge_tool)" || exit |
| 63 | fi |
David Aguilar | 47d6592 | 2009-04-11 20:41:56 -0700 | [diff] [blame] | 64 | fi |
David Aguilar | 5c38ea3 | 2009-01-16 00:00:02 -0800 | [diff] [blame] | 65 | |
| 66 | # Launch the merge tool on each path provided by 'git diff' |
| 67 | while test $# -gt 6 |
| 68 | do |
| 69 | launch_merge_tool "$1" "$2" "$5" |
| 70 | shift 7 |
| 71 | done |