ae2b0f1518
Now all the users of this script detect its exit status and die, complaining that it is outside git repository. So move the code that dies from all callers to git-sh-setup script. Signed-off-by: Junio C Hamano <junkio@cox.net>
91 lines
2.2 KiB
Bash
Executable File
91 lines
2.2 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
# Resolve two or more trees recorded in $GIT_DIR/FETCH_HEAD.
|
|
#
|
|
. git-sh-setup
|
|
|
|
usage () {
|
|
die "usage: git octopus"
|
|
}
|
|
|
|
# Sanity check the heads early.
|
|
while read SHA1 REPO
|
|
do
|
|
test $(git-cat-file -t $SHA1) = "commit" ||
|
|
die "$REPO given to octopus is not a commit"
|
|
done <"$GIT_DIR/FETCH_HEAD"
|
|
|
|
head=$(git-rev-parse --verify HEAD) || exit
|
|
|
|
git-update-index --refresh ||
|
|
die "Your working tree is dirty."
|
|
test "$(git-diff-index --cached "$head")" = "" ||
|
|
die "Your working tree does not match HEAD."
|
|
|
|
# MRC is the current "merge reference commit"
|
|
# MRT is the current "merge result tree"
|
|
|
|
MRC=$head PARENT="-p $head"
|
|
MRT=$(git-write-tree)
|
|
CNT=1 ;# counting our head
|
|
NON_FF_MERGE=0
|
|
while read SHA1 REPO
|
|
do
|
|
common=$(git-merge-base $MRC $SHA1) ||
|
|
die "Unable to find common commit with $SHA1 from $REPO"
|
|
|
|
if test "$common" = $SHA1
|
|
then
|
|
echo "Already up-to-date: $REPO"
|
|
continue
|
|
fi
|
|
|
|
CNT=`expr $CNT + 1`
|
|
PARENT="$PARENT -p $SHA1"
|
|
|
|
if test "$common,$NON_FF_MERGE" = "$MRC,0"
|
|
then
|
|
# The first head being merged was a fast-forward.
|
|
# Advance MRC to the head being merged, and use that
|
|
# tree as the intermediate result of the merge.
|
|
# We still need to count this as part of the parent set.
|
|
|
|
echo "Fast forwarding to: $REPO"
|
|
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 $REPO"
|
|
git-read-tree -u -m $common $MRT $SHA1 || exit
|
|
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 || {
|
|
git-read-tree --reset "$head"
|
|
git-checkout-index -f -q -u -a
|
|
die "Automatic merge failed; should not be doing Octopus"
|
|
}
|
|
next=$(git-write-tree 2>/dev/null)
|
|
fi
|
|
MRC=$common
|
|
MRT=$next
|
|
done <"$GIT_DIR/FETCH_HEAD"
|
|
|
|
# Just to be careful in case the user feeds nonsense to us.
|
|
case "$CNT" in
|
|
1)
|
|
echo "No changes."
|
|
exit 0 ;;
|
|
esac
|
|
result_commit=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD" |
|
|
git-commit-tree $MRT $PARENT)
|
|
echo "Committed merge $result_commit"
|
|
git-update-ref HEAD $result_commit $head
|
|
git-diff-tree -p $head $result_commit | git-apply --stat
|