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
() {
32 if test "$MERGED" -nt "$BACKUP"; then
36 echo "$MERGED seems unchanged."
37 printf "Was the merge successful? [y/n] "
40 y
*|Y
*) status
=0; break ;;
41 n
*|N
*) status
=1; break ;;
49 araxis | diffuse | ecmerge | emerge | gvimdiff | gvimdiff2 | \
50 kdiff3 | meld | opendiff | p4merge | tkdiff | vimdiff | vimdiff2 | xxdiff
)
63 if test -z "$(get_merge_tool_cmd "$1")"; then
70 get_merge_tool_cmd
() {
71 # Prints the custom command for a merge tool
75 merge_tool
="$(get_merge_tool)"
78 echo "$(git config difftool.$merge_tool.cmd ||
79 git config mergetool.$merge_tool.cmd)"
81 echo "$(git config mergetool.$merge_tool.cmd)"
86 merge_tool_path
="$(get_merge_tool_path "$1")" ||
exit
94 if $base_present; then
95 "$merge_tool_path" -wait -merge -3 -a1 \
96 "$BASE" "$LOCAL" "$REMOTE" "$MERGED" \
99 "$merge_tool_path" -wait -2 \
100 "$LOCAL" "$REMOTE" "$MERGED" \
105 "$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" \
112 if $base_present; then
114 "$LOCAL" "$MERGED" "$REMOTE" \
118 "$LOCAL" "$MERGED" "$REMOTE" |
cat
122 "$merge_tool_path" "$LOCAL" "$REMOTE" |
cat
128 if $base_present; then
129 "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
130 --default --mode=merge3
--to="$MERGED"
132 "$merge_tool_path" "$LOCAL" "$REMOTE" \
133 --default --mode=merge2
--to="$MERGED"
137 "$merge_tool_path" --default --mode=diff2 \
143 if $base_present; then
145 -f emerge-files-with-ancestor-command \
146 "$LOCAL" "$REMOTE" "$BASE" \
147 "$(basename "$MERGED")"
150 -f emerge-files-command \
152 "$(basename "$MERGED")"
156 "$merge_tool_path" -f emerge-files-command \
163 if $base_present; then
164 "$merge_tool_path" -f -d -c "wincmd J" \
165 "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
167 "$merge_tool_path" -f -d -c "wincmd l" \
168 "$LOCAL" "$MERGED" "$REMOTE"
172 "$merge_tool_path" -f -d -c "wincmd l" \
179 "$merge_tool_path" -f -d -c "wincmd l" \
180 "$LOCAL" "$MERGED" "$REMOTE"
183 "$merge_tool_path" -f -d -c "wincmd l" \
189 if $base_present; then
190 ("$merge_tool_path" --auto \
191 --L1 "$MERGED (Base)" \
192 --L2 "$MERGED (Local)" \
193 --L3 "$MERGED (Remote)" \
195 "$BASE" "$LOCAL" "$REMOTE" \
198 ("$merge_tool_path" --auto \
199 --L1 "$MERGED (Local)" \
200 --L2 "$MERGED (Remote)" \
207 ("$merge_tool_path" --auto \
209 --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \
214 "$merge_tool_path" "$LOCAL" "$REMOTE"
219 "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
222 "$merge_tool_path" "$LOCAL" "$REMOTE"
228 if $base_present; then
229 "$merge_tool_path" "$LOCAL" "$REMOTE" \
231 -merge "$MERGED" |
cat
233 "$merge_tool_path" "$LOCAL" "$REMOTE" \
234 -merge "$MERGED" |
cat
238 "$merge_tool_path" "$LOCAL" "$REMOTE" |
cat
244 if $base_present; then
245 "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
247 "$merge_tool_path" "$LOCAL" "$LOCAL" "$REMOTE" "$MERGED"
251 "$merge_tool_path" "$LOCAL" "$REMOTE"
256 if $base_present; then
257 "$merge_tool_path" -a "$BASE" \
258 -o "$MERGED" "$LOCAL" "$REMOTE"
261 -o "$MERGED" "$LOCAL" "$REMOTE"
265 "$merge_tool_path" "$LOCAL" "$REMOTE"
269 if $base_present; then
272 -base:"$BASE" -mine:"$LOCAL" \
273 -theirs:"$REMOTE" -merged:"$MERGED"
276 echo "TortoiseMerge cannot be used without a base" 1>&2
283 if $base_present; then
284 "$merge_tool_path" -X --show-merged-pane \
285 -R 'Accel.SaveAsMerged: "Ctrl-S"' \
286 -R 'Accel.Search: "Ctrl+F"' \
287 -R 'Accel.SearchForward: "Ctrl-G"' \
288 --merged-file "$MERGED" \
289 "$LOCAL" "$BASE" "$REMOTE"
291 "$merge_tool_path" -X $extra \
292 -R 'Accel.SaveAsMerged: "Ctrl-S"' \
293 -R 'Accel.Search: "Ctrl+F"' \
294 -R 'Accel.SearchForward: "Ctrl-G"' \
295 --merged-file "$MERGED" \
301 -R 'Accel.Search: "Ctrl+F"' \
302 -R 'Accel.SearchForward: "Ctrl-G"' \
307 merge_tool_cmd
="$(get_merge_tool_cmd "$1")"
308 if test -z "$merge_tool_cmd"; then
315 trust_exit_code
="$(git config --bool \
316 mergetool."$1".trustExitCode || echo false)"
317 if test "$trust_exit_code" = "false"; then
319 ( eval $merge_tool_cmd )
322 ( eval $merge_tool_cmd )
326 ( eval $merge_tool_cmd )
333 guess_merge_tool
() {
335 tools
="tortoisemerge"
339 if test -n "$DISPLAY"; then
340 if test -n "$GNOME_DESKTOP_SESSION_ID" ; then
341 tools
="meld opendiff kdiff3 tkdiff xxdiff $tools"
343 tools
="opendiff kdiff3 tkdiff xxdiff meld $tools"
345 tools
="$tools gvimdiff diffuse ecmerge p4merge araxis"
347 case "${VISUAL:-$EDITOR}" in
349 tools
="$tools vimdiff emerge"
352 tools
="$tools emerge vimdiff"
355 echo >&2 "merge tool candidates: $tools"
357 # Loop over each candidate and stop when a valid merge tool is found.
360 merge_tool_path
="$(translate_merge_tool_path "$i")"
361 if type "$merge_tool_path" > /dev
/null
2>&1; then
367 echo >&2 "No known merge resolution program available."
371 get_configured_merge_tool
() {
372 # Diff mode first tries diff.tool and falls back to merge.tool.
373 # Merge mode only checks merge.tool
375 merge_tool
=$
(git config
diff.tool || git config merge.tool
)
377 merge_tool
=$
(git config merge.tool
)
379 if test -n "$merge_tool" && ! valid_tool
"$merge_tool"; then
380 echo >&2 "git config option $TOOL_MODE.tool set to unknown tool: $merge_tool"
381 echo >&2 "Resetting to default..."
387 get_merge_tool_path
() {
388 # A merge tool has been set, so verify that it's valid.
389 if test -n "$1"; then
392 merge_tool
="$(get_merge_tool)"
394 if ! valid_tool
"$merge_tool"; then
395 echo >&2 "Unknown merge tool $merge_tool"
399 merge_tool_path
=$
(git config difftool.
"$merge_tool".path ||
400 git config mergetool.
"$merge_tool".path
)
402 merge_tool_path
=$
(git config mergetool.
"$merge_tool".path
)
404 if test -z "$merge_tool_path"; then
405 merge_tool_path
="$(translate_merge_tool_path "$merge_tool")"
407 if test -z "$(get_merge_tool_cmd "$merge_tool")" &&
408 ! type "$merge_tool_path" > /dev
/null
2>&1; then
409 echo >&2 "The $TOOL_MODE tool $merge_tool is not available as"\
413 echo "$merge_tool_path"
417 # Check if a merge tool has been configured
418 merge_tool
=$
(get_configured_merge_tool
)
419 # Try to guess an appropriate merge tool if no tool has been set.
420 if test -z "$merge_tool"; then
421 merge_tool
="$(guess_merge_tool)" ||
exit