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