Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2005 Junio C Hamano |
| 4 | # |
| 5 | |
Shawn O. Pearce | f947413 | 2006-12-28 02:34:48 -0500 | [diff] [blame] | 6 | USAGE='[-n] [--no-commit] [--squash] [-s <strategy>] [-m=<merge-message>] <commit>+' |
Junio C Hamano | 17bcdad | 2006-11-20 01:06:09 -0800 | [diff] [blame] | 7 | |
Junio C Hamano | 533b703 | 2007-01-12 12:52:03 -0800 | [diff] [blame] | 8 | SUBDIRECTORY_OK=Yes |
Junio C Hamano | ae2b0f1 | 2005-11-24 00:12:11 -0800 | [diff] [blame] | 9 | . git-sh-setup |
Shawn O. Pearce | 7eff28a | 2006-12-30 23:32:38 -0500 | [diff] [blame] | 10 | require_work_tree |
Junio C Hamano | 533b703 | 2007-01-12 12:52:03 -0800 | [diff] [blame] | 11 | cd_to_toplevel |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 12 | |
Junio C Hamano | d1014a1 | 2006-12-31 23:21:50 -0800 | [diff] [blame] | 13 | test -z "$(git ls-files -u)" || |
Junio C Hamano | 533b703 | 2007-01-12 12:52:03 -0800 | [diff] [blame] | 14 | die "You are in the middle of a conflicted merge." |
Junio C Hamano | d1014a1 | 2006-12-31 23:21:50 -0800 | [diff] [blame] | 15 | |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 16 | LF=' |
| 17 | ' |
| 18 | |
Junio C Hamano | 68faf68 | 2007-02-15 16:32:45 -0800 | [diff] [blame] | 19 | all_strategies='recur recursive octopus resolve stupid ours subtree' |
Junio C Hamano | a06f678 | 2006-09-24 19:49:47 -0700 | [diff] [blame] | 20 | default_twohead_strategies='recursive' |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 21 | default_octopus_strategies='octopus' |
Junio C Hamano | 68faf68 | 2007-02-15 16:32:45 -0800 | [diff] [blame] | 22 | no_trivial_merge_strategies='ours subtree' |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 23 | use_strategies= |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 24 | |
| 25 | index_merge=t |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 26 | |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 27 | dropsave() { |
Junio C Hamano | deca7e8 | 2005-09-25 00:12:06 -0700 | [diff] [blame] | 28 | rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" \ |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 29 | "$GIT_DIR/MERGE_SAVE" || exit 1 |
| 30 | } |
| 31 | |
| 32 | savestate() { |
Junio C Hamano | 60fa056 | 2005-09-28 16:29:11 -0700 | [diff] [blame] | 33 | # Stash away any local modifications. |
Chris Shoemaker | 50b8e35 | 2005-10-28 13:04:49 -0400 | [diff] [blame] | 34 | git-diff-index -z --name-only $head | |
Fredrik Kuivinen | 88f8f0a | 2005-10-03 08:13:09 +0200 | [diff] [blame] | 35 | cpio -0 -o >"$GIT_DIR/MERGE_SAVE" |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 36 | } |
| 37 | |
| 38 | restorestate() { |
Junio C Hamano | deca7e8 | 2005-09-25 00:12:06 -0700 | [diff] [blame] | 39 | if test -f "$GIT_DIR/MERGE_SAVE" |
| 40 | then |
Junio C Hamano | 228e2eb | 2006-12-22 15:21:55 -0800 | [diff] [blame] | 41 | git reset --hard $head >/dev/null |
Junio C Hamano | deca7e8 | 2005-09-25 00:12:06 -0700 | [diff] [blame] | 42 | cpio -iuv <"$GIT_DIR/MERGE_SAVE" |
| 43 | git-update-index --refresh >/dev/null |
| 44 | fi |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 45 | } |
| 46 | |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 47 | finish_up_to_date () { |
| 48 | case "$squash" in |
| 49 | t) |
| 50 | echo "$1 (nothing to squash)" ;; |
| 51 | '') |
| 52 | echo "$1" ;; |
| 53 | esac |
| 54 | dropsave |
| 55 | } |
| 56 | |
| 57 | squash_message () { |
| 58 | echo Squashed commit of the following: |
| 59 | echo |
| 60 | git-log --no-merges ^"$head" $remote |
| 61 | } |
| 62 | |
Junio C Hamano | 4f692b1 | 2005-10-22 04:45:15 -0700 | [diff] [blame] | 63 | finish () { |
Shawn Pearce | e1447e3 | 2006-07-11 01:52:54 -0400 | [diff] [blame] | 64 | if test '' = "$2" |
| 65 | then |
Shawn O. Pearce | f947413 | 2006-12-28 02:34:48 -0500 | [diff] [blame] | 66 | rlogm="$GIT_REFLOG_ACTION" |
Shawn Pearce | e1447e3 | 2006-07-11 01:52:54 -0400 | [diff] [blame] | 67 | else |
| 68 | echo "$2" |
Shawn O. Pearce | f947413 | 2006-12-28 02:34:48 -0500 | [diff] [blame] | 69 | rlogm="$GIT_REFLOG_ACTION: $2" |
Shawn Pearce | e1447e3 | 2006-07-11 01:52:54 -0400 | [diff] [blame] | 70 | fi |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 71 | case "$squash" in |
| 72 | t) |
| 73 | echo "Squash commit -- not updating HEAD" |
| 74 | squash_message >"$GIT_DIR/SQUASH_MSG" |
Junio C Hamano | 4f692b1 | 2005-10-22 04:45:15 -0700 | [diff] [blame] | 75 | ;; |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 76 | '') |
| 77 | case "$merge_msg" in |
| 78 | '') |
| 79 | echo "No merge message -- not updating HEAD" |
| 80 | ;; |
| 81 | *) |
Shawn Pearce | e1447e3 | 2006-07-11 01:52:54 -0400 | [diff] [blame] | 82 | git-update-ref -m "$rlogm" HEAD "$1" "$head" || exit 1 |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 83 | ;; |
| 84 | esac |
Junio C Hamano | 4f692b1 | 2005-10-22 04:45:15 -0700 | [diff] [blame] | 85 | ;; |
| 86 | esac |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 87 | case "$1" in |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 88 | '') |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 89 | ;; |
| 90 | ?*) |
| 91 | case "$no_summary" in |
| 92 | '') |
| 93 | git-diff-tree --stat --summary -M "$head" "$1" |
| 94 | ;; |
| 95 | esac |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 96 | ;; |
| 97 | esac |
| 98 | } |
| 99 | |
Junio C Hamano | b1bfcae | 2006-12-16 12:31:45 -0800 | [diff] [blame] | 100 | merge_name () { |
| 101 | remote="$1" |
| 102 | rh=$(git-rev-parse --verify "$remote^0" 2>/dev/null) || return |
| 103 | bh=$(git-show-ref -s --verify "refs/heads/$remote" 2>/dev/null) |
| 104 | if test "$rh" = "$bh" |
| 105 | then |
| 106 | echo "$rh branch '$remote' of ." |
| 107 | elif truname=$(expr "$remote" : '\(.*\)~[1-9][0-9]*$') && |
| 108 | git-show-ref -q --verify "refs/heads/$truname" 2>/dev/null |
| 109 | then |
| 110 | echo "$rh branch '$truname' (early part) of ." |
Michael S. Tsirkin | 85295a5 | 2007-03-22 11:07:30 +0200 | [diff] [blame] | 111 | elif test "$remote" = "FETCH_HEAD" -a -r "$GIT_DIR/FETCH_HEAD" |
| 112 | then |
| 113 | sed -e 's/ not-for-merge / /' -e 1q \ |
| 114 | "$GIT_DIR/FETCH_HEAD" |
Junio C Hamano | b1bfcae | 2006-12-16 12:31:45 -0800 | [diff] [blame] | 115 | else |
| 116 | echo "$rh commit '$remote'" |
| 117 | fi |
| 118 | } |
| 119 | |
Rene Scharfe | fc61e31 | 2006-10-21 20:51:04 +0200 | [diff] [blame] | 120 | case "$#" in 0) usage ;; esac |
| 121 | |
Shawn O. Pearce | f947413 | 2006-12-28 02:34:48 -0500 | [diff] [blame] | 122 | have_message= |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 123 | while case "$#" in 0) break ;; esac |
| 124 | do |
| 125 | case "$1" in |
| 126 | -n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ |
| 127 | --no-summa|--no-summar|--no-summary) |
| 128 | no_summary=t ;; |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 129 | --sq|--squ|--squa|--squas|--squash) |
| 130 | squash=t no_commit=t ;; |
Junio C Hamano | 123ee3c | 2005-11-01 19:30:11 -0800 | [diff] [blame] | 131 | --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit) |
| 132 | no_commit=t ;; |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 133 | -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ |
| 134 | --strateg=*|--strategy=*|\ |
| 135 | -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) |
| 136 | case "$#,$1" in |
| 137 | *,*=*) |
Dennis Stosberg | 8096fae | 2006-06-27 18:54:26 +0200 | [diff] [blame] | 138 | strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;; |
Junio C Hamano | f88ed17 | 2005-09-12 22:20:42 -0700 | [diff] [blame] | 139 | 1,*) |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 140 | usage ;; |
| 141 | *) |
| 142 | strategy="$2" |
| 143 | shift ;; |
| 144 | esac |
| 145 | case " $all_strategies " in |
| 146 | *" $strategy "*) |
| 147 | use_strategies="$use_strategies$strategy " ;; |
| 148 | *) |
| 149 | die "available strategies are: $all_strategies" ;; |
| 150 | esac |
| 151 | ;; |
Junio C Hamano | 17bcdad | 2006-11-20 01:06:09 -0800 | [diff] [blame] | 152 | -m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*) |
| 153 | merge_msg=`expr "z$1" : 'z-[^=]*=\(.*\)'` |
| 154 | have_message=t |
| 155 | ;; |
| 156 | -m|--m|--me|--mes|--mess|--messa|--messag|--message) |
| 157 | shift |
| 158 | case "$#" in |
| 159 | 1) usage ;; |
| 160 | esac |
| 161 | merge_msg="$1" |
| 162 | have_message=t |
| 163 | ;; |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 164 | -*) usage ;; |
| 165 | *) break ;; |
| 166 | esac |
| 167 | shift |
| 168 | done |
| 169 | |
Junio C Hamano | 17bcdad | 2006-11-20 01:06:09 -0800 | [diff] [blame] | 170 | # This could be traditional "merge <msg> HEAD <commit>..." and the |
| 171 | # way we can tell it is to see if the second token is HEAD, but some |
| 172 | # people might have misused the interface and used a committish that |
| 173 | # is the same as HEAD there instead. Traditional format never would |
| 174 | # have "-m" so it is an additional safety measure to check for it. |
| 175 | |
| 176 | if test -z "$have_message" && |
| 177 | second_token=$(git-rev-parse --verify "$2^0" 2>/dev/null) && |
| 178 | head_commit=$(git-rev-parse --verify "HEAD" 2>/dev/null) && |
| 179 | test "$second_token" = "$head_commit" |
| 180 | then |
| 181 | merge_msg="$1" |
| 182 | shift |
| 183 | head_arg="$1" |
| 184 | shift |
Junio C Hamano | c175161 | 2006-11-26 22:19:42 -0800 | [diff] [blame] | 185 | elif ! git-rev-parse --verify HEAD >/dev/null 2>&1 |
Junio C Hamano | 8092c7f | 2006-11-21 21:13:28 -0800 | [diff] [blame] | 186 | then |
| 187 | # If the merged head is a valid one there is no reason to |
| 188 | # forbid "git merge" into a branch yet to be born. We do |
| 189 | # the same for "git pull". |
| 190 | if test 1 -ne $# |
| 191 | then |
| 192 | echo >&2 "Can merge only exactly one commit into empty head" |
| 193 | exit 1 |
| 194 | fi |
| 195 | |
| 196 | rh=$(git rev-parse --verify "$1^0") || |
| 197 | die "$1 - not something we can merge" |
| 198 | |
| 199 | git-update-ref -m "initial pull" HEAD "$rh" "" && |
| 200 | git-read-tree --reset -u HEAD |
| 201 | exit |
| 202 | |
Junio C Hamano | 17bcdad | 2006-11-20 01:06:09 -0800 | [diff] [blame] | 203 | else |
| 204 | # We are invoked directly as the first-class UI. |
| 205 | head_arg=HEAD |
| 206 | |
| 207 | # All the rest are the commits being merged; prepare |
| 208 | # the standard merge summary message to be appended to |
| 209 | # the given message. If remote is invalid we will die |
| 210 | # later in the common codepath so we discard the error |
| 211 | # in this loop. |
| 212 | merge_name=$(for remote |
| 213 | do |
Junio C Hamano | b1bfcae | 2006-12-16 12:31:45 -0800 | [diff] [blame] | 214 | merge_name "$remote" |
Junio C Hamano | 17bcdad | 2006-11-20 01:06:09 -0800 | [diff] [blame] | 215 | done | git-fmt-merge-msg |
| 216 | ) |
| 217 | merge_msg="${merge_msg:+$merge_msg$LF$LF}$merge_name" |
| 218 | fi |
| 219 | head=$(git-rev-parse --verify "$head_arg"^0) || usage |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 220 | |
| 221 | # All the rest are remote heads |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 222 | test "$#" = 0 && usage ;# we need at least one remote head. |
Junio C Hamano | 7f9acb2 | 2007-01-26 15:09:02 -0800 | [diff] [blame] | 223 | set_reflog_action "merge $*" |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 224 | |
Junio C Hamano | 9954f5b | 2005-12-13 17:01:23 -0800 | [diff] [blame] | 225 | remoteheads= |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 226 | for remote |
| 227 | do |
Junio C Hamano | 51901e9 | 2006-11-26 22:16:31 -0800 | [diff] [blame] | 228 | remotehead=$(git-rev-parse --verify "$remote"^0 2>/dev/null) || |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 229 | die "$remote - not something we can merge" |
Junio C Hamano | 9954f5b | 2005-12-13 17:01:23 -0800 | [diff] [blame] | 230 | remoteheads="${remoteheads}$remotehead " |
Shawn O. Pearce | e0ec181 | 2006-12-23 03:44:47 -0500 | [diff] [blame] | 231 | eval GITHEAD_$remotehead='"$remote"' |
| 232 | export GITHEAD_$remotehead |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 233 | done |
Junio C Hamano | 9954f5b | 2005-12-13 17:01:23 -0800 | [diff] [blame] | 234 | set x $remoteheads ; shift |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 235 | |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 236 | case "$use_strategies" in |
| 237 | '') |
| 238 | case "$#" in |
| 239 | 1) |
Tom Prince | e0d10e1 | 2007-01-28 16:16:53 -0800 | [diff] [blame] | 240 | var="`git-config --get pull.twohead`" |
Shawn O. Pearce | de81194 | 2006-12-28 02:35:05 -0500 | [diff] [blame] | 241 | if test -n "$var" |
| 242 | then |
| 243 | use_strategies="$var" |
| 244 | else |
| 245 | use_strategies="$default_twohead_strategies" |
| 246 | fi ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 247 | *) |
Tom Prince | e0d10e1 | 2007-01-28 16:16:53 -0800 | [diff] [blame] | 248 | var="`git-config --get pull.octopus`" |
Shawn O. Pearce | de81194 | 2006-12-28 02:35:05 -0500 | [diff] [blame] | 249 | if test -n "$var" |
| 250 | then |
| 251 | use_strategies="$var" |
| 252 | else |
| 253 | use_strategies="$default_octopus_strategies" |
| 254 | fi ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 255 | esac |
| 256 | ;; |
| 257 | esac |
| 258 | |
| 259 | for s in $use_strategies |
| 260 | do |
Junio C Hamano | de6f0de | 2007-02-16 15:08:25 -0800 | [diff] [blame] | 261 | for nt in $no_trivial_merge_strategies |
| 262 | do |
| 263 | case " $s " in |
| 264 | *" $nt "*) |
| 265 | index_merge=f |
| 266 | break |
| 267 | ;; |
| 268 | esac |
| 269 | done |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 270 | done |
| 271 | |
Junio C Hamano | 1395667 | 2005-11-09 18:54:14 -0800 | [diff] [blame] | 272 | case "$#" in |
| 273 | 1) |
| 274 | common=$(git-merge-base --all $head "$@") |
| 275 | ;; |
| 276 | *) |
| 277 | common=$(git-show-branch --merge-base $head "$@") |
| 278 | ;; |
| 279 | esac |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 280 | echo "$head" >"$GIT_DIR/ORIG_HEAD" |
| 281 | |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 282 | case "$index_merge,$#,$common,$no_commit" in |
| 283 | f,*) |
| 284 | # We've been told not to try anything clever. Skip to real merge. |
| 285 | ;; |
| 286 | ?,*,'',*) |
Fredrik Kuivinen | 88f8f0a | 2005-10-03 08:13:09 +0200 | [diff] [blame] | 287 | # No common ancestors found. We need a real merge. |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 288 | ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 289 | ?,1,"$1",*) |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 290 | # If head can reach all the merge then we are up to date. |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 291 | # but first the most common case of merging one remote. |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 292 | finish_up_to_date "Already up-to-date." |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 293 | exit 0 |
| 294 | ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 295 | ?,1,"$head",*) |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 296 | # Again the most common case of merging one remote. |
Santi Béjar | ba0ac36 | 2006-10-01 05:34:17 +0200 | [diff] [blame] | 297 | echo "Updating $(git-rev-parse --short $head)..$(git-rev-parse --short $1)" |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 298 | git-update-index --refresh 2>/dev/null |
J. Bruce Fields | be242d5 | 2007-03-11 12:28:56 -0400 | [diff] [blame] | 299 | msg="Fast forward" |
| 300 | if test -n "$have_message" |
| 301 | then |
| 302 | msg="$msg (no commit created; -m option ignored)" |
| 303 | fi |
Santi Béjar | 2be08a8 | 2007-03-16 11:46:09 +0100 | [diff] [blame] | 304 | new_head=$(git-rev-parse --verify "$1^0") && |
| 305 | git-read-tree -v -m -u --exclude-per-directory=.gitignore $head "$new_head" && |
J. Bruce Fields | be242d5 | 2007-03-11 12:28:56 -0400 | [diff] [blame] | 306 | finish "$new_head" "$msg" || exit |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 307 | dropsave |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 308 | exit 0 |
| 309 | ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 310 | ?,1,?*"$LF"?*,*) |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 311 | # We are not doing octopus and not fast forward. Need a |
| 312 | # real merge. |
| 313 | ;; |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 314 | ?,1,*,) |
Junio C Hamano | f9d7241 | 2005-10-02 11:13:44 -0700 | [diff] [blame] | 315 | # We are not doing octopus, not fast forward, and have only |
Shawn O. Pearce | c82d711 | 2006-12-28 02:35:34 -0500 | [diff] [blame] | 316 | # one common. |
Junio C Hamano | f9d7241 | 2005-10-02 11:13:44 -0700 | [diff] [blame] | 317 | git-update-index --refresh 2>/dev/null |
Shawn O. Pearce | c82d711 | 2006-12-28 02:35:34 -0500 | [diff] [blame] | 318 | case " $use_strategies " in |
| 319 | *' recursive '*|*' recur '*) |
| 320 | : run merge later |
| 321 | ;; |
| 322 | *) |
| 323 | # See if it is really trivial. |
| 324 | git var GIT_COMMITTER_IDENT >/dev/null || exit |
| 325 | echo "Trying really trivial in-index merge..." |
| 326 | if git-read-tree --trivial -m -u -v $common $head "$1" && |
| 327 | result_tree=$(git-write-tree) |
| 328 | then |
| 329 | echo "Wonderful." |
| 330 | result_commit=$( |
| 331 | echo "$merge_msg" | |
| 332 | git-commit-tree $result_tree -p HEAD -p "$1" |
| 333 | ) || exit |
| 334 | finish "$result_commit" "In-index merge" |
| 335 | dropsave |
| 336 | exit 0 |
| 337 | fi |
| 338 | echo "Nope." |
| 339 | esac |
Junio C Hamano | f9d7241 | 2005-10-02 11:13:44 -0700 | [diff] [blame] | 340 | ;; |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 341 | *) |
| 342 | # An octopus. If we can reach all the remote we are up to date. |
| 343 | up_to_date=t |
| 344 | for remote |
| 345 | do |
Junio C Hamano | 1395667 | 2005-11-09 18:54:14 -0800 | [diff] [blame] | 346 | common_one=$(git-merge-base --all $head $remote) |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 347 | if test "$common_one" != "$remote" |
| 348 | then |
| 349 | up_to_date=f |
| 350 | break |
| 351 | fi |
| 352 | done |
| 353 | if test "$up_to_date" = t |
| 354 | then |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 355 | finish_up_to_date "Already up-to-date. Yeeah!" |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 356 | exit 0 |
| 357 | fi |
| 358 | ;; |
| 359 | esac |
| 360 | |
Junio C Hamano | e3b59a4 | 2006-02-18 20:51:26 -0800 | [diff] [blame] | 361 | # We are going to make a new commit. |
| 362 | git var GIT_COMMITTER_IDENT >/dev/null || exit |
| 363 | |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 364 | # At this point, we need a real merge. No matter what strategy |
| 365 | # we use, it would operate on the index, possibly affecting the |
| 366 | # working tree, and when resolved cleanly, have the desired tree |
| 367 | # in the index -- this means that the index must be in sync with |
Junio C Hamano | 60fa056 | 2005-09-28 16:29:11 -0700 | [diff] [blame] | 368 | # the $head commit. The strategies are responsible to ensure this. |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 369 | |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 370 | case "$use_strategies" in |
| 371 | ?*' '?*) |
| 372 | # Stash away the local changes so that we can try more than one. |
| 373 | savestate |
| 374 | single_strategy=no |
| 375 | ;; |
| 376 | *) |
Junio C Hamano | deca7e8 | 2005-09-25 00:12:06 -0700 | [diff] [blame] | 377 | rm -f "$GIT_DIR/MERGE_SAVE" |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 378 | single_strategy=yes |
| 379 | ;; |
| 380 | esac |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 381 | |
| 382 | result_tree= best_cnt=-1 best_strategy= wt_strategy= |
Junio C Hamano | 695bf72 | 2005-12-23 15:48:09 -0800 | [diff] [blame] | 383 | merge_was_ok= |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 384 | for strategy in $use_strategies |
| 385 | do |
| 386 | test "$wt_strategy" = '' || { |
| 387 | echo "Rewinding the tree to pristine..." |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 388 | restorestate |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 389 | } |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 390 | case "$single_strategy" in |
| 391 | no) |
| 392 | echo "Trying merge strategy $strategy..." |
| 393 | ;; |
| 394 | esac |
| 395 | |
| 396 | # Remember which strategy left the state in the working tree |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 397 | wt_strategy=$strategy |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 398 | |
Junio C Hamano | 123ee3c | 2005-11-01 19:30:11 -0800 | [diff] [blame] | 399 | git-merge-$strategy $common -- "$head_arg" "$@" |
| 400 | exit=$? |
| 401 | if test "$no_commit" = t && test "$exit" = 0 |
| 402 | then |
Junio C Hamano | 695bf72 | 2005-12-23 15:48:09 -0800 | [diff] [blame] | 403 | merge_was_ok=t |
Junio C Hamano | 123ee3c | 2005-11-01 19:30:11 -0800 | [diff] [blame] | 404 | exit=1 ;# pretend it left conflicts. |
| 405 | fi |
| 406 | |
| 407 | test "$exit" = 0 || { |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 408 | |
| 409 | # The backend exits with 1 when conflicts are left to be resolved, |
| 410 | # with 2 when it does not handle the given merge at all. |
| 411 | |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 412 | if test "$exit" -eq 1 |
| 413 | then |
| 414 | cnt=`{ |
| 415 | git-diff-files --name-only |
| 416 | git-ls-files --unmerged |
| 417 | } | wc -l` |
| 418 | if test $best_cnt -le 0 -o $cnt -le $best_cnt |
| 419 | then |
| 420 | best_strategy=$strategy |
| 421 | best_cnt=$cnt |
| 422 | fi |
| 423 | fi |
| 424 | continue |
| 425 | } |
| 426 | |
| 427 | # Automerge succeeded. |
| 428 | result_tree=$(git-write-tree) && break |
| 429 | done |
| 430 | |
| 431 | # If we have a resulting tree, that means the strategy module |
| 432 | # auto resolved the merge cleanly. |
| 433 | if test '' != "$result_tree" |
| 434 | then |
Junio C Hamano | 6ea2334 | 2006-03-18 14:50:53 -0800 | [diff] [blame] | 435 | parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /') |
Junio C Hamano | bf7960e | 2005-09-27 18:14:27 -0700 | [diff] [blame] | 436 | result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit |
Shawn Pearce | e1447e3 | 2006-07-11 01:52:54 -0400 | [diff] [blame] | 437 | finish "$result_commit" "Merge made by $wt_strategy." |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 438 | dropsave |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 439 | exit 0 |
| 440 | fi |
| 441 | |
| 442 | # Pick the result from the best strategy and have the user fix it up. |
| 443 | case "$best_strategy" in |
| 444 | '') |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 445 | restorestate |
Junio C Hamano | 0c4e95d | 2006-12-13 09:32:40 -0800 | [diff] [blame] | 446 | case "$use_strategies" in |
| 447 | ?*' '?*) |
| 448 | echo >&2 "No merge strategy handled the merge." |
| 449 | ;; |
| 450 | *) |
| 451 | echo >&2 "Merge with strategy $use_strategies failed." |
| 452 | ;; |
| 453 | esac |
Fredrik Kuivinen | 4275df5 | 2005-12-03 11:40:21 +0100 | [diff] [blame] | 454 | exit 2 |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 455 | ;; |
| 456 | "$wt_strategy") |
| 457 | # We already have its result in the working tree. |
| 458 | ;; |
| 459 | *) |
| 460 | echo "Rewinding the tree to pristine..." |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 461 | restorestate |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 462 | echo "Using the $best_strategy to prepare resolving by hand." |
Junio C Hamano | a935824 | 2005-09-23 00:43:04 -0700 | [diff] [blame] | 463 | git-merge-$best_strategy $common -- "$head_arg" "$@" |
Junio C Hamano | 91063bb | 2005-09-08 13:47:12 -0700 | [diff] [blame] | 464 | ;; |
| 465 | esac |
Junio C Hamano | 7d0c688 | 2006-06-23 01:37:02 -0700 | [diff] [blame] | 466 | |
| 467 | if test "$squash" = t |
| 468 | then |
| 469 | finish |
| 470 | else |
| 471 | for remote |
| 472 | do |
| 473 | echo $remote |
| 474 | done >"$GIT_DIR/MERGE_HEAD" |
| 475 | echo "$merge_msg" >"$GIT_DIR/MERGE_MSG" |
| 476 | fi |
Junio C Hamano | deca7e8 | 2005-09-25 00:12:06 -0700 | [diff] [blame] | 477 | |
Junio C Hamano | 695bf72 | 2005-12-23 15:48:09 -0800 | [diff] [blame] | 478 | if test "$merge_was_ok" = t |
| 479 | then |
| 480 | echo >&2 \ |
| 481 | "Automatic merge went well; stopped before committing as requested" |
| 482 | exit 0 |
| 483 | else |
Junio C Hamano | 6b94f1e | 2006-01-27 23:05:05 -0800 | [diff] [blame] | 484 | { |
| 485 | echo ' |
| 486 | Conflicts: |
| 487 | ' |
| 488 | git ls-files --unmerged | |
| 489 | sed -e 's/^[^ ]* / /' | |
| 490 | uniq |
| 491 | } >>"$GIT_DIR/MERGE_MSG" |
Junio C Hamano | 1536dd9c6 | 2006-02-11 18:55:43 -0800 | [diff] [blame] | 492 | if test -d "$GIT_DIR/rr-cache" |
| 493 | then |
| 494 | git-rerere |
| 495 | fi |
Junio C Hamano | 50ac740 | 2006-04-19 14:54:27 -0700 | [diff] [blame] | 496 | die "Automatic merge failed; fix conflicts and then commit the result." |
Junio C Hamano | 695bf72 | 2005-12-23 15:48:09 -0800 | [diff] [blame] | 497 | fi |