From b0169d84df4c09ed7dfcc6aea5aecd177ddda75b Mon Sep 17 00:00:00 2001 From: Charles Bailey Date: Fri, 12 Dec 2008 21:48:40 +0000 Subject: [PATCH] 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 Signed-off-by: Junio C Hamano --- git-mergetool.sh | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/git-mergetool.sh b/git-mergetool.sh index 507028f859..5144971647 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -70,16 +70,16 @@ resolve_symlink_merge () { git checkout-index -f --stage=2 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [rR]*) git checkout-index -f --stage=3 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [aA]*) - exit 1 + return 1 ;; esac done @@ -97,15 +97,15 @@ resolve_deleted_merge () { [mMcC]*) git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [dD]*) git rm -- "$MERGED" > /dev/null cleanup_temp_files - return + return 0 ;; [aA]*) - exit 1 + return 1 ;; esac done @@ -137,7 +137,7 @@ merge_file () { else echo "$MERGED: file does not need merging" fi - exit 1 + return 1 fi ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')" @@ -269,7 +269,7 @@ merge_file () { if test "$status" -ne 0; then echo "merge of $MERGED failed" 1>&2 mv -- "$BACKUP" "$MERGED" - exit 1 + return 1 fi if test "$merge_keep_backup" = "true"; then @@ -280,6 +280,7 @@ merge_file () { git add -- "$MERGED" cleanup_temp_files + return 0 } prompt=$(git config --bool mergetool.prompt || echo true) @@ -350,6 +351,22 @@ init_merge_tool_path() { fi } +prompt_after_failed_merge() { + while true; do + printf "Continue merging other unresolved paths (y/n) ? " + read ans + case "$ans" in + + [yY]*) + return 0 + ;; + + [nN]*) + return 1 + ;; + esac + done +} if test -z "$merge_tool"; then merge_tool=`git config merge.tool` @@ -409,6 +426,8 @@ else fi fi +last_status=0 +rollup_status=0 if test $# -eq 0 ; then files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u` @@ -422,14 +441,29 @@ if test $# -eq 0 ; then sort -u | while IFS= read i do + if test $last_status -ne 0; then + prompt_after_failed_merge < /dev/tty || exit 1 + fi printf "\n" merge_file "$i" < /dev/tty > /dev/tty + last_status=$? + if test $last_status -ne 0; then + rollup_status=1 + fi done else while test $# -gt 0; do + if test $last_status -ne 0; then + prompt_after_failed_merge || exit 1 + fi printf "\n" merge_file "$1" + last_status=$? + if test $last_status -ne 0; then + rollup_status=1 + fi shift done fi -exit 0 + +exit $rollup_status -- 2.11.4.GIT