X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-merge.sh;h=cc0952a97db7d998a3f26e98b93cf2154887abd5;hb=84a9b58c421f9b2d1cc6c195ed441fac48e60392;hp=d352a3cf65e45e0da0a8ee1989e9acb522e132b5;hpb=36d277c72d90d32f99616072b64a2652248f5264;p=git.git diff --git a/git-merge.sh b/git-merge.sh index d352a3cf..cc0952a9 100755 --- a/git-merge.sh +++ b/git-merge.sh @@ -3,18 +3,20 @@ # Copyright (c) 2005 Junio C Hamano # + +USAGE='[-n] [--no-commit] [-s ]... +' . git-sh-setup LF=' ' -usage () { - die "git-merge [-n] [--no-commit] [-s ]... +" -} - all_strategies='recursive octopus resolve stupid ours' default_strategies='recursive' use_strategies= +if test "@@NO_PYTHON@@"; then + all_strategies='resolve octopus stupid ours' + default_strategies='resolve' +fi dropsave() { rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" \ @@ -97,11 +99,14 @@ head=$(git-rev-parse --verify "$1"^0) || usage shift # All the rest are remote heads +remoteheads= for remote do - git-rev-parse --verify "$remote"^0 >/dev/null || + remotehead=$(git-rev-parse --verify "$remote"^0) || die "$remote - not something we can merge" + remoteheads="${remoteheads}$remotehead " done +set x $remoteheads ; shift case "$#" in 1) @@ -126,10 +131,10 @@ case "$#,$common,$no_commit" in ;; 1,"$head",*) # Again the most common case of merging one remote. - echo "Updating from $head to $1." + echo "Updating from $head to $1" git-update-index --refresh 2>/dev/null new_head=$(git-rev-parse --verify "$1^0") && - git-read-tree -u -m $head "$new_head" && + git-read-tree -u -v -m $head "$new_head" && finish "$new_head" "Fast forward" dropsave exit 0 @@ -141,9 +146,11 @@ case "$#,$common,$no_commit" in 1,*,) # We are not doing octopus, not fast forward, and have only # one common. See if it is really trivial. + git var GIT_COMMITTER_IDENT >/dev/null || exit + echo "Trying really trivial in-index merge..." git-update-index --refresh 2>/dev/null - if git-read-tree --trivial -m -u $common $head "$1" && + if git-read-tree --trivial -m -u -v $common $head "$1" && result_tree=$(git-write-tree) then echo "Wonderful." @@ -178,6 +185,9 @@ case "$#,$common,$no_commit" in ;; esac +# We are going to make a new commit. +git var GIT_COMMITTER_IDENT >/dev/null || exit + case "$use_strategies" in '') case "$#" in @@ -208,6 +218,7 @@ case "$use_strategies" in esac result_tree= best_cnt=-1 best_strategy= wt_strategy= +merge_was_ok= for strategy in $use_strategies do test "$wt_strategy" = '' || { @@ -227,6 +238,7 @@ do exit=$? if test "$no_commit" = t && test "$exit" = 0 then + merge_was_ok=t exit=1 ;# pretend it left conflicts. fi @@ -273,7 +285,8 @@ fi case "$best_strategy" in '') restorestate - die "No merge strategy handled the merge." + echo >&2 "No merge strategy handled the merge." + exit 2 ;; "$wt_strategy") # We already have its result in the working tree. @@ -289,6 +302,25 @@ for remote do echo $remote done >"$GIT_DIR/MERGE_HEAD" -echo $merge_msg >"$GIT_DIR/MERGE_MSG" +echo "$merge_msg" >"$GIT_DIR/MERGE_MSG" -die "Automatic merge failed/prevented; fix up by hand" +if test "$merge_was_ok" = t +then + echo >&2 \ + "Automatic merge went well; stopped before committing as requested" + exit 0 +else + { + echo ' +Conflicts: +' + git ls-files --unmerged | + sed -e 's/^[^ ]* / /' | + uniq + } >>"$GIT_DIR/MERGE_MSG" + if test -d "$GIT_DIR/rr-cache" + then + git-rerere + fi + die "Automatic merge failed; fix up by hand" +fi