Skip to content

Commit

Permalink
mergetool: Add prompt to continue after failing to merge a file
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
hashpling authored and gitster committed Dec 13, 2008
1 parent 682b451 commit b0169d8
Showing 1 changed file with 43 additions and 9 deletions.
52 changes: 43 additions & 9 deletions git-mergetool.sh
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -137,7 +137,7 @@ merge_file () {
else
echo "$MERGED: file does not need merging"
fi
exit 1
return 1
fi

ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')"
Expand Down Expand Up @@ -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
Expand All @@ -280,6 +280,7 @@ merge_file () {

git add -- "$MERGED"
cleanup_temp_files
return 0
}

prompt=$(git config --bool mergetool.prompt || echo true)
Expand Down Expand Up @@ -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`
Expand Down Expand Up @@ -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`
Expand All @@ -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

0 comments on commit b0169d8

Please sign in to comment.