LF='
'
+die () {
+ echo >&2 "$*"
+ exit 1
+}
+
# The first parameters up to -- are merge bases; the rest are heads.
bases= head= remotes= sep_seen=
for arg
# MRT is the current "merge result tree"
MRC=$head MSG= PARENT="-p $head"
-MRT=$(git-write-tree)
+MRT=$(git write-tree)
CNT=1 ;# counting our head
NON_FF_MERGE=0
+OCTOPUS_FAILURE=0
for SHA1 in $remotes
do
- common=$(git-merge-base --all $MRC $SHA1) ||
+ case "$OCTOPUS_FAILURE" in
+ 1)
+ # We allow only last one to have a hand-resolvable
+ # conflicts. Last round failed and we still had
+ # a head to merge.
+ echo "Automated merge did not work."
+ echo "Should not be doing an Octopus."
+ exit 2
+ esac
+
+ common=$(git merge-base --all $MRC $SHA1) ||
die "Unable to find common commit with $SHA1"
- case "$common" in
- ?*"$LF"?*)
- die "Not trivially mergeable."
- ;;
- $SHA1)
+ case "$LF$common$LF" in
+ *"$LF$SHA1$LF"*)
echo "Already up-to-date with $SHA1"
continue
;;
# We still need to count this as part of the parent set.
echo "Fast forwarding to: $SHA1"
- git-read-tree -u -m $head $SHA1 || exit
- MRC=$SHA1 MRT=$(git-write-tree)
+ git read-tree -u -m $head $SHA1 || exit
+ MRC=$SHA1 MRT=$(git write-tree)
continue
fi
NON_FF_MERGE=1
echo "Trying simple merge with $SHA1"
- git-read-tree -u -m $common $MRT $SHA1 || exit 2
- next=$(git-write-tree 2>/dev/null)
+ git read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2
+ next=$(git write-tree 2>/dev/null)
if test $? -ne 0
then
echo "Simple merge did not work, trying automatic merge."
git-merge-index -o git-merge-one-file -a ||
- exit 2 ; # Automatic merge failed; should not be doing Octopus
- next=$(git-write-tree 2>/dev/null)
+ OCTOPUS_FAILURE=1
+ next=$(git write-tree 2>/dev/null)
fi
# We have merged the other branch successfully. Ideally
MRT=$next
done
-exit 0
+exit "$OCTOPUS_FAILURE"