]>
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 | # | |
ae2b0f15 | 7 | . git-sh-setup |
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 | ||
c8b48ba4 | 30 | MRC=$head PARENT="-p $head" |
d9f3be7e JH |
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" | |
d9f3be7e JH |
47 | |
48 | if test "$common,$NON_FF_MERGE" = "$MRC,0" | |
49 | then | |
50 | # The first head being merged was a fast-forward. | |
51 | # Advance MRC to the head being merged, and use that | |
52 | # tree as the intermediate result of the merge. | |
53 | # We still need to count this as part of the parent set. | |
54 | ||
55 | echo "Fast forwarding to: $REPO" | |
56 | git-read-tree -u -m $head $SHA1 || exit | |
57 | MRC=$SHA1 MRT=$(git-write-tree) | |
58 | continue | |
59 | fi | |
60 | ||
61 | NON_FF_MERGE=1 | |
62 | ||
63 | echo "Trying simple merge with $REPO" | |
64 | git-read-tree -u -m $common $MRT $SHA1 || exit | |
65 | next=$(git-write-tree 2>/dev/null) | |
66 | if test $? -ne 0 | |
67 | then | |
68 | echo "Simple merge did not work, trying automatic merge." | |
215a7ad1 | 69 | git-merge-index -o git-merge-one-file -a || { |
d9f3be7e | 70 | git-read-tree --reset "$head" |
215a7ad1 | 71 | git-checkout-index -f -q -u -a |
d9f3be7e JH |
72 | die "Automatic merge failed; should not be doing Octopus" |
73 | } | |
74 | next=$(git-write-tree 2>/dev/null) | |
75 | fi | |
76 | MRC=$common | |
77 | MRT=$next | |
78 | done <"$GIT_DIR/FETCH_HEAD" | |
79 | ||
80 | # Just to be careful in case the user feeds nonsense to us. | |
81 | case "$CNT" in | |
82 | 1) | |
83 | echo "No changes." | |
84 | exit 0 ;; | |
d9f3be7e | 85 | esac |
c8b48ba4 JH |
86 | result_commit=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD" | |
87 | git-commit-tree $MRT $PARENT) | |
d9f3be7e | 88 | echo "Committed merge $result_commit" |
bf7960eb | 89 | git-update-ref HEAD $result_commit $head |
d9f3be7e | 90 | git-diff-tree -p $head $result_commit | git-apply --stat |