1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6. git-sh-setup 7 8LF=' 9' 10 11usage () { 12 die "git-merge [-n] [--no-commit] [-s <strategy>]... <merge-message> <head> <remote>+" 13} 14 15all_strategies='recursive octopus resolve stupid ours' 16default_strategies='recursive' 17use_strategies= 18 19dropsave() { 20rm-f --"$GIT_DIR/MERGE_HEAD""$GIT_DIR/MERGE_MSG" \ 21"$GIT_DIR/MERGE_SAVE"||exit1 22} 23 24savestate() { 25# Stash away any local modifications. 26 git-diff-index -z --name-only$head| 27cpio-0 -o>"$GIT_DIR/MERGE_SAVE" 28} 29 30restorestate() { 31iftest -f"$GIT_DIR/MERGE_SAVE" 32then 33 git reset--hard$head 34cpio-iuv<"$GIT_DIR/MERGE_SAVE" 35 git-update-index --refresh>/dev/null 36fi 37} 38 39finish () { 40test''="$2"||echo"$2" 41case"$merge_msg"in 42'') 43echo"No merge message -- not updating HEAD" 44;; 45*) 46 git-update-ref HEAD "$1""$head"||exit1 47;; 48esac 49 50case"$no_summary"in 51'') 52 git-diff-tree -p -M"$head""$1"| 53 git-apply --stat --summary 54;; 55esac 56} 57 58while case"$#"in0)break;;esac 59do 60case"$1"in 61-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ 62--no-summa|--no-summar|--no-summary) 63 no_summary=t ;; 64--no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit) 65 no_commit=t ;; 66-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ 67--strateg=*|--strategy=*|\ 68-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) 69case"$#,$1"in 70*,*=*) 71 strategy=`expr "$1" : '-[^=]*=\(.*\)'`;; 721,*) 73 usage ;; 74*) 75 strategy="$2" 76shift;; 77esac 78case"$all_strategies"in 79*"$strategy"*) 80 use_strategies="$use_strategies$strategy";; 81*) 82 die "available strategies are:$all_strategies";; 83esac 84;; 85-*) usage ;; 86*)break;; 87esac 88shift 89done 90 91test"$#"-le2&& usage ;# we need at least two heads. 92 93merge_msg="$1" 94shift 95head_arg="$1" 96head=$(git-rev-parse --verify "$1"^0)|| usage 97shift 98 99# All the rest are remote heads 100for remote 101do 102 git-rev-parse --verify"$remote"^0>/dev/null || 103 die "$remote- not something we can merge" 104done 105 106case"$#"in 1071) 108 common=$(git-merge-base --all $head "$@") 109;; 110*) 111 common=$(git-show-branch --merge-base $head "$@") 112;; 113esac 114echo"$head">"$GIT_DIR/ORIG_HEAD" 115 116case"$#,$common,$no_commit"in 117*,'',*) 118# No common ancestors found. We need a real merge. 119;; 1201,"$1",*) 121# If head can reach all the merge then we are up to date. 122# but first the most common case of merging one remote 123echo"Already up-to-date." 124 dropsave 125exit0 126;; 1271,"$head",*) 128# Again the most common case of merging one remote. 129echo"Updating from$headto$1." 130 git-update-index --refresh2>/dev/null 131 new_head=$(git-rev-parse --verify "$1^0")&& 132 git-read-tree -u -m$head"$new_head"&& 133 finish "$new_head""Fast forward" 134 dropsave 135exit0 136;; 1371,?*"$LF"?*,*) 138# We are not doing octopus and not fast forward. Need a 139# real merge. 140;; 1411,*,) 142# We are not doing octopus, not fast forward, and have only 143# one common. See if it is really trivial. 144echo"Trying really trivial in-index merge..." 145 git-update-index --refresh2>/dev/null 146if git-read-tree --trivial -m -u$common $head"$1"&& 147 result_tree=$(git-write-tree) 148then 149echo"Wonderful." 150 result_commit=$( 151echo"$merge_msg"| 152 git-commit-tree$result_tree-p HEAD -p"$1" 153) ||exit 154 finish "$result_commit""In-index merge" 155 dropsave 156exit0 157fi 158echo"Nope." 159;; 160*) 161# An octopus. If we can reach all the remote we are up to date. 162 up_to_date=t 163for remote 164do 165 common_one=$(git-merge-base --all $head $remote) 166iftest"$common_one"!="$remote" 167then 168 up_to_date=f 169break 170fi 171done 172iftest"$up_to_date"= t 173then 174echo"Already up-to-date. Yeeah!" 175 dropsave 176exit0 177fi 178;; 179esac 180 181case"$use_strategies"in 182'') 183case"$#"in 1841) 185 use_strategies="$default_strategies";; 186*) 187 use_strategies=octopus ;; 188esac 189;; 190esac 191 192# At this point, we need a real merge. No matter what strategy 193# we use, it would operate on the index, possibly affecting the 194# working tree, and when resolved cleanly, have the desired tree 195# in the index -- this means that the index must be in sync with 196# the $head commit. The strategies are responsible to ensure this. 197 198case"$use_strategies"in 199?*' '?*) 200# Stash away the local changes so that we can try more than one. 201 savestate 202 single_strategy=no 203;; 204*) 205rm-f"$GIT_DIR/MERGE_SAVE" 206 single_strategy=yes 207;; 208esac 209 210result_tree= best_cnt=-1 best_strategy= wt_strategy= 211for strategy in$use_strategies 212do 213test"$wt_strategy"=''|| { 214echo"Rewinding the tree to pristine..." 215 restorestate 216} 217case"$single_strategy"in 218 no) 219echo"Trying merge strategy$strategy..." 220;; 221esac 222 223# Remember which strategy left the state in the working tree 224 wt_strategy=$strategy 225 226 git-merge-$strategy $common--"$head_arg""$@" 227exit=$? 228iftest"$no_commit"= t &&test"$exit"=0 229then 230exit=1;# pretend it left conflicts. 231fi 232 233test"$exit"=0|| { 234 235# The backend exits with 1 when conflicts are left to be resolved, 236# with 2 when it does not handle the given merge at all. 237 238iftest"$exit"-eq1 239then 240 cnt=`{ 241 git-diff-files --name-only 242 git-ls-files --unmerged 243 } | wc -l` 244iftest$best_cnt-le0-o$cnt-le$best_cnt 245then 246 best_strategy=$strategy 247 best_cnt=$cnt 248fi 249fi 250continue 251} 252 253# Automerge succeeded. 254 result_tree=$(git-write-tree)&&break 255done 256 257# If we have a resulting tree, that means the strategy module 258# auto resolved the merge cleanly. 259iftest''!="$result_tree" 260then 261 parents="-p$head" 262for remote 263do 264 parents="$parents-p$remote" 265done 266 result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents)||exit 267 finish "$result_commit""Merge$result_commit, made by$wt_strategy." 268 dropsave 269exit0 270fi 271 272# Pick the result from the best strategy and have the user fix it up. 273case"$best_strategy"in 274'') 275 restorestate 276 die "No merge strategy handled the merge." 277;; 278"$wt_strategy") 279# We already have its result in the working tree. 280;; 281*) 282echo"Rewinding the tree to pristine..." 283 restorestate 284echo"Using the$best_strategyto prepare resolving by hand." 285 git-merge-$best_strategy $common--"$head_arg""$@" 286;; 287esac 288for remote 289do 290echo$remote 291done>"$GIT_DIR/MERGE_HEAD" 292echo$merge_msg>"$GIT_DIR/MERGE_MSG" 293 294die "Automatic merge failed/prevented; fix up by hand"