2 # git-mergetool--lib is a library for common merge tool functions
4 test "$TOOL_MODE" = diff
8 test "$TOOL_MODE" = merge
11 translate_merge_tool_path
() {
35 if test "$MERGED" -nt "$BACKUP"
41 echo "$MERGED seems unchanged."
42 printf "Was the merge successful? [y/n] "
45 y
*|Y
*) status
=0; break ;;
46 n
*|N
*) status
=1; break ;;
54 araxis | bc3 | diffuse | ecmerge | emerge | gvimdiff | gvimdiff2 | \
55 kdiff3 | meld | opendiff | p4merge | tkdiff | vimdiff | vimdiff2 | xxdiff
)
70 if test -z "$(get_merge_tool_cmd "$1")"
78 get_merge_tool_cmd
() {
79 # Prints the custom command for a merge tool
84 merge_tool
="$(get_merge_tool)"
88 echo "$(git config difftool.$merge_tool.cmd ||
89 git config mergetool.$merge_tool.cmd)"
91 echo "$(git config mergetool.$merge_tool.cmd)"
96 # If GIT_PREFIX is empty then we cannot use it in tools
97 # that expect to be able to chdir() to its value.
98 GIT_PREFIX
=${GIT_PREFIX:-.}
101 merge_tool_path
="$(get_merge_tool_path "$1")" ||
exit
112 "$merge_tool_path" -wait -merge -3 -a1 \
113 "$BASE" "$LOCAL" "$REMOTE" "$MERGED" \
116 "$merge_tool_path" -wait -2 \
117 "$LOCAL" "$REMOTE" "$MERGED" \
122 "$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" \
132 "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \
133 -mergeoutput="$MERGED"
135 "$merge_tool_path" "$LOCAL" "$REMOTE" \
136 -mergeoutput="$MERGED"
140 "$merge_tool_path" "$LOCAL" "$REMOTE"
150 "$LOCAL" "$MERGED" "$REMOTE" \
154 "$LOCAL" "$MERGED" "$REMOTE" |
cat
158 "$merge_tool_path" "$LOCAL" "$REMOTE" |
cat
167 "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
168 --default --mode=merge3
--to="$MERGED"
170 "$merge_tool_path" "$LOCAL" "$REMOTE" \
171 --default --mode=merge2
--to="$MERGED"
175 "$merge_tool_path" --default --mode=diff2 \
185 -f emerge-files-with-ancestor-command \
186 "$LOCAL" "$REMOTE" "$BASE" \
187 "$(basename "$MERGED")"
190 -f emerge-files-command \
192 "$(basename "$MERGED")"
196 "$merge_tool_path" -f emerge-files-command \
206 "$merge_tool_path" -f -d -c "wincmd J" \
207 "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
209 "$merge_tool_path" -f -d -c "wincmd l" \
210 "$LOCAL" "$MERGED" "$REMOTE"
214 "$merge_tool_path" -R -f -d -c "wincmd l" \
215 -c 'cd $GIT_PREFIX' \
223 "$merge_tool_path" -f -d -c "wincmd l" \
224 "$LOCAL" "$MERGED" "$REMOTE"
227 "$merge_tool_path" -R -f -d -c "wincmd l" \
228 -c 'cd $GIT_PREFIX' \
237 "$merge_tool_path" --auto \
238 --L1 "$MERGED (Base)" \
239 --L2 "$MERGED (Local)" \
240 --L3 "$MERGED (Remote)" \
242 "$BASE" "$LOCAL" "$REMOTE" \
245 "$merge_tool_path" --auto \
246 --L1 "$MERGED (Local)" \
247 --L2 "$MERGED (Remote)" \
254 "$merge_tool_path" --auto \
256 --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \
261 "$merge_tool_path" "$LOCAL" "$REMOTE"
267 "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
270 "$merge_tool_path" "$LOCAL" "$REMOTE"
279 "$merge_tool_path" "$LOCAL" "$REMOTE" \
281 -merge "$MERGED" |
cat
283 "$merge_tool_path" "$LOCAL" "$REMOTE" \
284 -merge "$MERGED" |
cat
288 "$merge_tool_path" "$LOCAL" "$REMOTE" |
cat
295 $base_present ||
>"$BASE"
296 "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
299 "$merge_tool_path" "$LOCAL" "$REMOTE"
307 "$merge_tool_path" -a "$BASE" \
308 -o "$MERGED" "$LOCAL" "$REMOTE"
311 -o "$MERGED" "$LOCAL" "$REMOTE"
315 "$merge_tool_path" "$LOCAL" "$REMOTE"
323 -base:"$BASE" -mine:"$LOCAL" \
324 -theirs:"$REMOTE" -merged:"$MERGED"
327 echo "TortoiseMerge cannot be used without a base" 1>&2
337 "$merge_tool_path" -X --show-merged-pane \
338 -R 'Accel.SaveAsMerged: "Ctrl-S"' \
339 -R 'Accel.Search: "Ctrl+F"' \
340 -R 'Accel.SearchForward: "Ctrl-G"' \
341 --merged-file "$MERGED" \
342 "$LOCAL" "$BASE" "$REMOTE"
344 "$merge_tool_path" -X $extra \
345 -R 'Accel.SaveAsMerged: "Ctrl-S"' \
346 -R 'Accel.Search: "Ctrl+F"' \
347 -R 'Accel.SearchForward: "Ctrl-G"' \
348 --merged-file "$MERGED" \
354 -R 'Accel.Search: "Ctrl+F"' \
355 -R 'Accel.SearchForward: "Ctrl-G"' \
360 merge_tool_cmd
="$(get_merge_tool_cmd "$1")"
361 if test -z "$merge_tool_cmd"
371 trust_exit_code
="$(git config --bool \
372 mergetool."$1".trustExitCode || echo false)"
373 if test "$trust_exit_code" = "false"
376 ( eval $merge_tool_cmd )
379 ( eval $merge_tool_cmd )
383 ( eval $merge_tool_cmd )
390 guess_merge_tool
() {
393 tools
="tortoisemerge"
397 if test -n "$DISPLAY"
399 if test -n "$GNOME_DESKTOP_SESSION_ID"
401 tools
="meld opendiff kdiff3 tkdiff xxdiff $tools"
403 tools
="opendiff kdiff3 tkdiff xxdiff meld $tools"
405 tools
="$tools gvimdiff diffuse ecmerge p4merge araxis bc3"
407 case "${VISUAL:-$EDITOR}" in
409 tools
="$tools vimdiff emerge"
412 tools
="$tools emerge vimdiff"
415 echo >&2 "merge tool candidates: $tools"
417 # Loop over each candidate and stop when a valid merge tool is found.
420 merge_tool_path
="$(translate_merge_tool_path "$i")"
421 if type "$merge_tool_path" >/dev
/null
2>&1
428 echo >&2 "No known merge resolution program available."
432 get_configured_merge_tool
() {
433 # Diff mode first tries diff.tool and falls back to merge.tool.
434 # Merge mode only checks merge.tool
437 merge_tool
=$
(git config
diff.tool || git config merge.tool
)
439 merge_tool
=$
(git config merge.tool
)
441 if test -n "$merge_tool" && ! valid_tool
"$merge_tool"
443 echo >&2 "git config option $TOOL_MODE.tool set to unknown tool: $merge_tool"
444 echo >&2 "Resetting to default..."
450 get_merge_tool_path
() {
451 # A merge tool has been set, so verify that it's valid.
456 merge_tool
="$(get_merge_tool)"
458 if ! valid_tool
"$merge_tool"
460 echo >&2 "Unknown merge tool $merge_tool"
465 merge_tool_path
=$
(git config difftool.
"$merge_tool".path ||
466 git config mergetool.
"$merge_tool".path
)
468 merge_tool_path
=$
(git config mergetool.
"$merge_tool".path
)
470 if test -z "$merge_tool_path"
472 merge_tool_path
="$(translate_merge_tool_path "$merge_tool")"
474 if test -z "$(get_merge_tool_cmd "$merge_tool")" &&
475 ! type "$merge_tool_path" >/dev
/null
2>&1
477 echo >&2 "The $TOOL_MODE tool $merge_tool is not available as"\
481 echo "$merge_tool_path"
485 # Check if a merge tool has been configured
486 merge_tool
=$
(get_configured_merge_tool
)
487 # Try to guess an appropriate merge tool if no tool has been set.
488 if test -z "$merge_tool"
490 merge_tool
="$(guess_merge_tool)" ||
exit