]>
Commit | Line | Data |
---|---|---|
d9f3be7e JH |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # | |
5 | # Resolve two or more trees recorded in $GIT_DIR/FETCH_HEAD. | |
6 | # | |
215a7ad1 | 7 | . git-sh-setup || die "Not a git archive" |
d9f3be7e JH |
8 | |
9 | usage () { | |
10 | die "usage: git octopus" | |
11 | } | |
12 | ||
13 | # Sanity check the heads early. | |
14 | while read SHA1 REPO | |
15 | do | |
16 | test $(git-cat-file -t $SHA1) = "commit" || | |
17 | die "$REPO given to octopus is not a commit" | |
18 | done <"$GIT_DIR/FETCH_HEAD" | |
19 | ||
20 | head=$(git-rev-parse --verify HEAD) || exit | |
21 | ||
215a7ad1 | 22 | git-update-index --refresh || |
d9f3be7e | 23 | die "Your working tree is dirty." |
215a7ad1 | 24 | test "$(git-diff-index --cached "$head")" = "" || |
d9f3be7e JH |
25 | die "Your working tree does not match HEAD." |
26 | ||
27 | # MRC is the current "merge reference commit" | |
28 | # MRT is the current "merge result tree" | |
29 | ||
30 | MRC=$head MSG= PARENT="-p $head" | |
31 | MRT=$(git-write-tree) | |
32 | CNT=1 ;# counting our head | |
33 | NON_FF_MERGE=0 | |
34 | while read SHA1 REPO | |
35 | do | |
36 | common=$(git-merge-base $MRC $SHA1) || | |
37 | die "Unable to find common commit with $SHA1 from $REPO" | |
38 | ||
39 | if test "$common" = $SHA1 | |
40 | then | |
41 | echo "Already up-to-date: $REPO" | |
42 | continue | |
43 | fi | |
44 | ||
45 | CNT=`expr $CNT + 1` | |
46 | PARENT="$PARENT -p $SHA1" | |
47 | MSG="$MSG | |
48 | $REPO" | |
49 | ||
50 | if test "$common,$NON_FF_MERGE" = "$MRC,0" | |
51 | then | |
52 | # The first head being merged was a fast-forward. | |
53 | # Advance MRC to the head being merged, and use that | |
54 | # tree as the intermediate result of the merge. | |
55 | # We still need to count this as part of the parent set. | |
56 | ||
57 | echo "Fast forwarding to: $REPO" | |
58 | git-read-tree -u -m $head $SHA1 || exit | |
59 | MRC=$SHA1 MRT=$(git-write-tree) | |
60 | continue | |
61 | fi | |
62 | ||
63 | NON_FF_MERGE=1 | |
64 | ||
65 | echo "Trying simple merge with $REPO" | |
66 | git-read-tree -u -m $common $MRT $SHA1 || exit | |
67 | next=$(git-write-tree 2>/dev/null) | |
68 | if test $? -ne 0 | |
69 | then | |
70 | echo "Simple merge did not work, trying automatic merge." | |
215a7ad1 | 71 | git-merge-index -o git-merge-one-file -a || { |
d9f3be7e | 72 | git-read-tree --reset "$head" |
215a7ad1 | 73 | git-checkout-index -f -q -u -a |
d9f3be7e JH |
74 | die "Automatic merge failed; should not be doing Octopus" |
75 | } | |
76 | next=$(git-write-tree 2>/dev/null) | |
77 | fi | |
78 | MRC=$common | |
79 | MRT=$next | |
80 | done <"$GIT_DIR/FETCH_HEAD" | |
81 | ||
82 | # Just to be careful in case the user feeds nonsense to us. | |
83 | case "$CNT" in | |
84 | 1) | |
85 | echo "No changes." | |
86 | exit 0 ;; | |
87 | 2) | |
88 | echo "Not an Octopus; making an ordinary commit." | |
89 | MSG="Merge "`expr "$MSG" : '. \(.*\)'` ; # remove LF and TAB | |
90 | ;; | |
91 | *) | |
92 | # In an octopus, the original head is just one of the equals, | |
93 | # so we should list it as such. | |
94 | HEAD_LINK=`readlink "$GIT_DIR/HEAD"` | |
95 | MSG="Octopus merge of the following: | |
96 | ||
97 | $HEAD_LINK from .$MSG" | |
98 | ;; | |
99 | esac | |
100 | result_commit=$(echo "$MSG" | git-commit-tree $MRT $PARENT) | |
101 | echo "Committed merge $result_commit" | |
102 | echo $result_commit >"$GIT_DIR"/HEAD | |
103 | git-diff-tree -p $head $result_commit | git-apply --stat |