Junio C Hamano | 2276aa6 | 2005-09-10 17:56:19 -0700 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2005 Linus Torvalds |
| 4 | # |
| 5 | # Resolve two trees, 'stupid merge'. |
| 6 | |
| 7 | # The first parameters up to -- are merge bases; the rest are heads. |
| 8 | bases= head= remotes= sep_seen= |
| 9 | for arg |
| 10 | do |
| 11 | case ",$sep_seen,$head,$arg," in |
| 12 | *,--,) |
| 13 | sep_seen=yes |
| 14 | ;; |
| 15 | ,yes,,*) |
| 16 | head=$arg |
| 17 | ;; |
| 18 | ,yes,*) |
| 19 | remotes="$remotes$arg " |
| 20 | ;; |
| 21 | *) |
| 22 | bases="$bases$arg " |
| 23 | ;; |
| 24 | esac |
| 25 | done |
| 26 | |
| 27 | # Give up if we are given more than two remotes -- not handling octopus. |
| 28 | case "$remotes" in |
| 29 | ?*' '?*) |
| 30 | exit 2 ;; |
| 31 | esac |
| 32 | |
| 33 | # Find an optimum merge base if there are more than one candidates. |
| 34 | case "$bases" in |
| 35 | ?*' '?*) |
| 36 | echo "Trying to find the optimum merge base." |
| 37 | G=.tmp-index$$ |
| 38 | best= |
| 39 | best_cnt=-1 |
| 40 | for c in $bases |
| 41 | do |
| 42 | rm -f $G |
| 43 | GIT_INDEX_FILE=$G git-read-tree -m $c $head $remotes \ |
| 44 | 2>/dev/null || continue |
| 45 | # Count the paths that are unmerged. |
| 46 | cnt=`GIT_INDEX_FILE=$G git-ls-files --unmerged | wc -l` |
| 47 | if test $best_cnt -le 0 -o $cnt -le $best_cnt |
| 48 | then |
| 49 | best=$c |
| 50 | best_cnt=$cnt |
| 51 | if test "$best_cnt" -eq 0 |
| 52 | then |
| 53 | # Cannot do any better than all trivial merge. |
| 54 | break |
| 55 | fi |
| 56 | fi |
| 57 | done |
| 58 | rm -f $G |
| 59 | common="$best" |
| 60 | ;; |
| 61 | *) |
| 62 | common="$bases" |
| 63 | ;; |
| 64 | esac |
| 65 | |
| 66 | git-update-index --refresh 2>/dev/null |
| 67 | git-read-tree -u -m $common $head $remotes || exit 2 |
| 68 | echo "Trying simple merge." |
| 69 | if result_tree=$(git-write-tree 2>/dev/null) |
| 70 | then |
| 71 | exit 0 |
| 72 | else |
| 73 | echo "Simple merge failed, trying Automatic merge." |
| 74 | if git-merge-index -o git-merge-one-file -a |
| 75 | then |
| 76 | exit 0 |
| 77 | else |
| 78 | exit 1 |
| 79 | fi |
| 80 | fi |