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