rev-list.c: fix non-grammatical comments.
[gitweb.git] / git-merge.sh
index 7f481e4caacf295635f1fb69c9b4f1c364355234..4609fe54d52843f42d2c1d18a9dc2ff235b5c7ce 100755 (executable)
@@ -3,20 +3,20 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
-. git-sh-setup || die "Not a git archive"
+
+USAGE='[-n] [--no-commit] [-s <strategy>]... <merge-message> <head> <remote>+'
+. git-sh-setup
 
 LF='
 '
 
-usage () {
-    die "git-merge [-n] [--no-commit] [-s <strategy>]... <merge-message> <head> <remote>+"
-}
-
-# all_strategies='resolve recursive stupid octopus'
-
 all_strategies='recursive octopus resolve stupid ours'
-default_strategies='resolve octopus'
+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" \
@@ -90,11 +90,6 @@ do
        shift
 done
 
-case "$use_strategies" in
-'')
-       use_strategies=$default_strategies
-       ;;
-esac
 test "$#" -le 2 && usage ;# we need at least two heads.
 
 merge_msg="$1"
@@ -104,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)
@@ -148,6 +146,8 @@ 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" &&
@@ -185,6 +185,20 @@ 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
+       1)
+               use_strategies="$default_strategies" ;;
+       *)
+               use_strategies=octopus ;;
+       esac            
+       ;;
+esac
+
 # At this point, we need a real merge.  No matter what strategy
 # we use, it would operate on the index, possibly affecting the
 # working tree, and when resolved cleanly, have the desired tree
@@ -204,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" = '' || {
@@ -223,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
 
@@ -269,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.
@@ -285,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