Skip to content

Commit

Permalink
Split "git-pull-script" into two parts
Browse files Browse the repository at this point in the history
Separate out the merge resolve from the actual getting of the
data. Also, update the resolve phase to take advantage of the
fact that we don't need to do the commit->tree object lookup
by hand, since all the actors involved happily just act on a
commit object these days.
  • Loading branch information
Linus Torvalds committed May 5, 2005
1 parent 160c843 commit 67cc5c4
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 46 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ CC=gcc
AR=ar

SCRIPTS=git-apply-patch-script git-merge-one-file-script git-prune-script \
git-pull-script git-tag-script
git-pull-script git-tag-script git-resolve-script

PROG= git-update-cache git-diff-files git-init-db git-write-tree \
git-read-tree git-commit-tree git-cat-file git-fsck-cache \
Expand Down
46 changes: 1 addition & 45 deletions git-pull-script
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,10 @@
merge_repo=$1
merge_name=${2:-HEAD}

rm -f .git/MERGE_HEAD .git/ORIG_HEAD
cp .git/HEAD .git/ORIG_HEAD

echo "Getting object database"
rsync -avz --ignore-existing $merge_repo/objects/. ${SHA1_FILE_DIRECTORY:-.git/objects}/.

echo "Getting remote $merge_name"
rsync -L $merge_repo/$merge_name .git/MERGE_HEAD || exit 1

head=$(cat .git/HEAD)
merge_head=$(cat .git/MERGE_HEAD)
common=$(git-merge-base $head $merge_head)
if [ -z "$common" ]; then
echo "Unable to find common commit between" $merge_head $head
exit 1
fi

# Get the trees associated with those commits
common_tree=$(git-cat-file commit $common | sed 's/tree //;q')
head_tree=$(git-cat-file commit $head | sed 's/tree //;q')
merge_tree=$(git-cat-file commit $merge_head | sed 's/tree //;q')

if [ "$common" == "$merge_head" ]; then
echo "Already up-to-date. Yeeah!"
exit 0
fi
if [ "$common" == "$head" ]; then
echo "Updating from $head to $merge_head."
echo "Destroying all noncommitted data!"
echo "Kill me within 3 seconds.."
sleep 3
git-read-tree -m $merge_tree && git-checkout-cache -f -a && git-update-cache --refresh
echo $merge_head > .git/HEAD
git-diff-tree -p ORIG_HEAD HEAD | diffstat -p1
exit 0
fi
echo "Trying to merge $merge_head into $head"
git-read-tree -m $common_tree $head_tree $merge_tree
merge_msg="Merge of $merge_repo"
result_tree=$(git-write-tree 2> /dev/null)
if [ $? -ne 0 ]; then
echo "Simple merge failed, trying Automatic merge"
git-merge-cache git-merge-one-file-script -a
merge_msg="Automatic merge of $merge_repo"
result_tree=$(git-write-tree) || exit 1
fi
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree -p $head -p $merge_head)
echo "Committed merge $result_commit"
echo $result_commit > .git/HEAD
git-checkout-cache -f -a && git-update-cache --refresh
git-diff-tree -p ORIG_HEAD HEAD | diffstat -p1
git-resolve-script "$(cat .git/HEAD)" "$(cat .git/MERGE_HEAD)" "$merge_repo"
56 changes: 56 additions & 0 deletions git-resolve-script
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/bin/sh
#
# Resolve two trees.
#
head="$1"
merge="$2"
merge_repo="$3"

rm -f .git/MERGE_HEAD .git/ORIG_HEAD
echo $head > .git/ORIG_HEAD
echo $merge > .git/MERGE_HEAD

#
# The remote name is just used for the message,
# but we do want it.
#
if [ "$merge_repo" == "" ]; then
echo "git-resolve-script <head> <remote> <merge-repo-name>"
exit 1
fi

common=$(git-merge-base $head $merge)
if [ -z "$common" ]; then
echo "Unable to find common commit between" $merge $head
exit 1
fi

if [ "$common" == "$merge" ]; then
echo "Already up-to-date. Yeeah!"
exit 0
fi
if [ "$common" == "$head" ]; then
echo "Updating from $head to $merge."
echo "Destroying all noncommitted data!"
echo "Kill me within 3 seconds.."
sleep 3
git-read-tree -m $merge && git-checkout-cache -f -a && git-update-cache --refresh
echo $merge > .git/HEAD
git-diff-tree -p ORIG_HEAD HEAD | diffstat -p1
exit 0
fi
echo "Trying to merge $merge into $head"
git-read-tree -m $common $head $merge
merge_msg="Merge of $merge_repo"
result_tree=$(git-write-tree 2> /dev/null)
if [ $? -ne 0 ]; then
echo "Simple merge failed, trying Automatic merge"
git-merge-cache git-merge-one-file-script -a
merge_msg="Automatic merge of $merge_repo"
result_tree=$(git-write-tree) || exit 1
fi
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree -p $head -p $merge_head)
echo "Committed merge $result_commit"
echo $result_commit > .git/HEAD
git-checkout-cache -f -a && git-update-cache --refresh
git-diff-tree -p ORIG_HEAD HEAD | diffstat -p1

0 comments on commit 67cc5c4

Please sign in to comment.