]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh | |
2 | # | |
3 | # Copyright (c) 2005 Junio C Hamano | |
4 | # | |
5 | # Resolve two or more trees. | |
6 | # | |
7 | ||
8 | . git-sh-setup | |
9 | ||
10 | LF=' | |
11 | ' | |
12 | ||
13 | # The first parameters up to -- are merge bases; the rest are heads. | |
14 | bases= head= remotes= sep_seen= | |
15 | for arg | |
16 | do | |
17 | case ",$sep_seen,$head,$arg," in | |
18 | *,--,) | |
19 | sep_seen=yes | |
20 | ;; | |
21 | ,yes,,*) | |
22 | head=$arg | |
23 | ;; | |
24 | ,yes,*) | |
25 | remotes="$remotes$arg " | |
26 | ;; | |
27 | *) | |
28 | bases="$bases$arg " | |
29 | ;; | |
30 | esac | |
31 | done | |
32 | ||
33 | # Reject if this is not an octopus -- resolve should be used instead. | |
34 | case "$remotes" in | |
35 | ?*' '?*) | |
36 | ;; | |
37 | *) | |
38 | exit 2 ;; | |
39 | esac | |
40 | ||
41 | # MRC is the current "merge reference commit" | |
42 | # MRT is the current "merge result tree" | |
43 | ||
44 | if ! git diff-index --quiet --cached HEAD -- | |
45 | then | |
46 | gettextln "Error: Your local changes to the following files would be overwritten by merge" | |
47 | git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /' | |
48 | exit 2 | |
49 | fi | |
50 | MRC=$(git rev-parse --verify -q $head) | |
51 | MRT=$(git write-tree) | |
52 | NON_FF_MERGE=0 | |
53 | OCTOPUS_FAILURE=0 | |
54 | for SHA1 in $remotes | |
55 | do | |
56 | case "$OCTOPUS_FAILURE" in | |
57 | 1) | |
58 | # We allow only last one to have a hand-resolvable | |
59 | # conflicts. Last round failed and we still had | |
60 | # a head to merge. | |
61 | gettextln "Automated merge did not work." | |
62 | gettextln "Should not be doing an octopus." | |
63 | exit 2 | |
64 | esac | |
65 | ||
66 | eval pretty_name=\${GITHEAD_$SHA1:-$SHA1} | |
67 | if test "$SHA1" = "$pretty_name" | |
68 | then | |
69 | SHA1_UP="$(echo "$SHA1" | tr a-z A-Z)" | |
70 | eval pretty_name=\${GITHEAD_$SHA1_UP:-$pretty_name} | |
71 | fi | |
72 | common=$(git merge-base --all $SHA1 $MRC) || | |
73 | die "$(eval_gettext "Unable to find common commit with \$pretty_name")" | |
74 | ||
75 | case "$LF$common$LF" in | |
76 | *"$LF$SHA1$LF"*) | |
77 | eval_gettextln "Already up to date with \$pretty_name" | |
78 | continue | |
79 | ;; | |
80 | esac | |
81 | ||
82 | if test "$common,$NON_FF_MERGE" = "$MRC,0" | |
83 | then | |
84 | # The first head being merged was a fast-forward. | |
85 | # Advance MRC to the head being merged, and use that | |
86 | # tree as the intermediate result of the merge. | |
87 | # We still need to count this as part of the parent set. | |
88 | ||
89 | eval_gettextln "Fast-forwarding to: \$pretty_name" | |
90 | git read-tree -u -m $head $SHA1 || exit | |
91 | MRC=$SHA1 MRT=$(git write-tree) | |
92 | continue | |
93 | fi | |
94 | ||
95 | NON_FF_MERGE=1 | |
96 | ||
97 | eval_gettextln "Trying simple merge with \$pretty_name" | |
98 | git read-tree -u -m --aggressive $common $MRT $SHA1 || exit 2 | |
99 | next=$(git write-tree 2>/dev/null) | |
100 | if test $? -ne 0 | |
101 | then | |
102 | gettextln "Simple merge did not work, trying automatic merge." | |
103 | git merge-index -o git-merge-one-file -a || | |
104 | OCTOPUS_FAILURE=1 | |
105 | next=$(git write-tree 2>/dev/null) | |
106 | fi | |
107 | ||
108 | MRC="$MRC $SHA1" | |
109 | MRT=$next | |
110 | done | |
111 | ||
112 | exit "$OCTOPUS_FAILURE" |