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