@matheusbsbs / matheus-bagliano / commits / b0169d84df
Fork 0

mergetool: Add prompt to continue after failing to merge a file

This option stops git mergetool from aborting at the first failed merge. After a failed merge the user will be prompted to indicated whether he wishes to continue with attempting to merge subsequent paths or to abort. This allows some additional use patterns. Merge conflicts can now be previewed one at time and merges can also be skipped so that they can be performed in a later pass. Signed-off-by: Charles Bailey <charles@hashpling.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Charles Bailey committed Dec 12, 2008 at 21:48 UTC b0169d84df4c09ed7dfcc6aea5aecd177ddda75b
1 file changed +43 -9
git-mergetool.sh
+43 -9
@@ -70,16 +70,16 @@ resolve_symlink_merge () {
70 git checkout-index -f --stage=2 -- "$MERGED"
71 git add -- "$MERGED"
72 cleanup_temp_files --save-backup
73 - return
73 + return 0
74 ;;
75 [rR]*)
76 git checkout-index -f --stage=3 -- "$MERGED"
77 git add -- "$MERGED"
78 cleanup_temp_files --save-backup
79 - return
79 + return 0
80 ;;
81 [aA]*)
82 - exit 1
82 + return 1
83 ;;
84 esac
85 done
@@ -97,15 +97,15 @@ resolve_deleted_merge () {
97 [mMcC]*)
98 git add -- "$MERGED"
99 cleanup_temp_files --save-backup
100 - return
100 + return 0
101 ;;
102 [dD]*)
103 git rm -- "$MERGED" > /dev/null
104 cleanup_temp_files
105 - return
105 + return 0
106 ;;
107 [aA]*)
108 - exit 1
108 + return 1
109 ;;
110 esac
111 done
@@ -137,7 +137,7 @@ merge_file () {
137 else
138 echo "$MERGED: file does not need merging"
139 fi
140 - exit 1
140 + return 1
141 fi
142
143 ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')"
@@ -269,7 +269,7 @@ merge_file () {
269 if test "$status" -ne 0; then
270 echo "merge of $MERGED failed" 1>&2
271 mv -- "$BACKUP" "$MERGED"
272 - exit 1
272 + return 1
273 fi
274
275 if test "$merge_keep_backup" = "true"; then
@@ -280,6 +280,7 @@ merge_file () {
280
281 git add -- "$MERGED"
282 cleanup_temp_files
283 + return 0
284 }
285
286 prompt=$(git config --bool mergetool.prompt || echo true)
@@ -350,6 +351,22 @@ init_merge_tool_path() {
351 fi
352 }
353
354 +prompt_after_failed_merge() {
355 + while true; do
356 + printf "Continue merging other unresolved paths (y/n) ? "
357 + read ans
358 + case "$ans" in
359 +
360 + [yY]*)
361 + return 0
362 + ;;
363 +
364 + [nN]*)
365 + return 1
366 + ;;
367 + esac
368 + done
369 +}
370
371 if test -z "$merge_tool"; then
372 merge_tool=`git config merge.tool`
@@ -409,6 +426,8 @@ else
426 fi
427 fi
428
429 +last_status=0
430 +rollup_status=0
431
432 if test $# -eq 0 ; then
433 files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u`
@@ -422,14 +441,29 @@ if test $# -eq 0 ; then
441 sort -u |
442 while IFS= read i
443 do
444 + if test $last_status -ne 0; then
445 + prompt_after_failed_merge < /dev/tty || exit 1
446 + fi
447 printf "\n"
448 merge_file "$i" < /dev/tty > /dev/tty
449 + last_status=$?
450 + if test $last_status -ne 0; then
451 + rollup_status=1
452 + fi
453 done
454 else
455 while test $# -gt 0; do
456 + if test $last_status -ne 0; then
457 + prompt_after_failed_merge || exit 1
458 + fi
459 printf "\n"
460 merge_file "$1"
461 + last_status=$?
462 + if test $last_status -ne 0; then
463 + rollup_status=1
464 + fi
465 shift
466 done
467 fi
435 -exit 0
468 +
469 +exit $rollup_status