1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6. git-sh-setup|| die "Not a git archive" 7 8LF=' 9' 10 11usage () { 12 die "git-merge [-n] [-s <strategy>]... <merge-message> <head> <remote>+" 13} 14 15# all_strategies='resolve recursive stupid octopus' 16 17all_strategies='recursive octopus resolve stupid' 18default_strategies='resolve octopus' 19use_strategies= 20 21dropheads() { 22rm-f --"$GIT_DIR/MERGE_HEAD"||exit1 23} 24 25summary() { 26case"$no_summary"in 27'') 28 git-diff-tree -p -M$head"$1"| 29 git-apply --stat --summary 30;; 31esac 32} 33 34while case"$#"in0)break;;esac 35do 36case"$1"in 37-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ 38--no-summa|--no-summar|--no-summary) 39 no_summary=t ;; 40-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ 41--strateg=*|--strategy=*|\ 42-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) 43case"$#,$1"in 44*,*=*) 45 strategy=`expr "$1" : '-[^=]*=\(.*\)'`;; 461,*) 47 usage ;; 48*) 49 strategy="$2" 50shift;; 51esac 52case"$all_strategies"in 53*"$strategy"*) 54 use_strategies="$use_strategies$strategy";; 55*) 56 die "available strategies are:$all_strategies";; 57esac 58;; 59-*) usage ;; 60*)break;; 61esac 62shift 63done 64 65case"$use_strategies"in 66'') 67 use_strategies=$default_strategies 68;; 69esac 70test"$#"-le2&& usage ;# we need at least two heads. 71 72merge_msg="$1" 73shift 74head_arg="$1" 75head=$(git-rev-parse --verify "$1"^0)|| usage 76shift 77 78# All the rest are remote heads 79for remote 80do 81 git-rev-parse --verify"$remote"^0>/dev/null || 82 die "$remote- not something we can merge" 83done 84 85common=$(git-show-branch --merge-base $head "$@") 86echo"$head">"$GIT_DIR/ORIG_HEAD" 87 88case"$#,$common"in 89*,'') 90 die "Unable to find common commit between$head_argand $*" 91;; 921,"$1") 93# If head can reach all the merge then we are up to date. 94# but first the most common case of merging one remote 95echo"Already up-to-date. Yeeah!" 96 dropheads 97exit0 98;; 991,"$head") 100# Again the most common case of merging one remote. 101echo"Updating from$headto$1." 102 git-update-index --refresh2>/dev/null 103 git-read-tree -u -m$head"$1"||exit1 104 git-rev-parse --verify"$1^0">"$GIT_DIR/HEAD" 105 summary "$1" 106 dropheads 107exit0 108;; 1091,*) 110# We are not doing octopus and not fast forward. Need a 111# real merge. 112;; 113*) 114# An octopus. If we can reach all the remote we are up to date. 115 up_to_date=t 116for remote 117do 118 common_one=$(git-merge-base $head $remote) 119iftest"$common_one"!="$remote" 120then 121 up_to_date=f 122break 123fi 124done 125iftest"$up_to_date"= t 126then 127echo"Already up-to-date. Yeeah!" 128 dropheads 129exit0 130fi 131;; 132esac 133 134# At this point we need a real merge. Require that the tree matches 135# exactly our head. 136 137git-update-index --refresh&& 138test''="`git-diff-index --cached --name-only$head`"|| { 139 die "Need real merge but the working tree has local changes." 140} 141 142result_tree= best_cnt=-1 best_strategy= wt_strategy= 143for strategy in$use_strategies 144do 145test"$wt_strategy"=''|| { 146echo"Rewinding the tree to pristine..." 147 git reset--hard$head 148} 149echo"Trying merge strategy$strategy..." 150 wt_strategy=$strategy 151 git-merge-$strategy $common--$head_arg"$@"|| { 152 153# The backend exits with 1 when conflicts are left to be resolved, 154# with 2 when it does not handle the given merge at all. 155 156exit=$? 157iftest"$exit"-eq1 158then 159 cnt=`{ 160 git-diff-files --name-only 161 git-ls-files --unmerged 162 } | wc -l` 163iftest$best_cnt-le0-o$cnt-le$best_cnt 164then 165 best_strategy=$strategy 166 best_cnt=$cnt 167fi 168fi 169continue 170} 171 172# Automerge succeeded. 173 result_tree=$(git-write-tree)&&break 174done 175 176# If we have a resulting tree, that means the strategy module 177# auto resolved the merge cleanly. 178iftest''!="$result_tree" 179then 180 parents="-p$head" 181for remote 182do 183 parents="$parents-p$remote" 184done 185 result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) 186echo"Committed merge$result_commit, made by$wt_strategy." 187echo$result_commit>"$GIT_DIR/HEAD" 188 summary $result_commit 189 dropheads 190exit0 191fi 192 193# Pick the result from the best strategy and have the user fix it up. 194case"$best_strategy"in 195'') 196 git reset--hard$head 197 die "No merge strategy handled the merge." 198;; 199"$wt_strategy") 200# We already have its result in the working tree. 201;; 202*) 203echo"Rewinding the tree to pristine..." 204 git reset--hard$head 205echo"Using the$best_strategyto prepare resolving by hand." 206 git-merge-$best_strategy $common--$head_arg"$@" 207;; 208esac 209for remote 210do 211echo$remote 212done>"$GIT_DIR/MERGE_HEAD" 213die "Automatic merge failed; fix up by hand"