1#!/bin/sh 2# 3# Copyright (c) Linus Torvalds, 2005 4# 5# This is the git per-file merge script, called with 6# 7# $1 - original file SHA1 (or empty) 8# $2 - file in branch1 SHA1 (or empty) 9# $3 - file in branch2 SHA1 (or empty) 10# $4 - pathname in repository 11# $5 - original file mode (or empty) 12# $6 - file in branch1 mode (or empty) 13# $7 - file in branch2 mode (or empty) 14# 15# Handle some trivial cases.. The _really_ trivial cases have 16# been handled already by git read-tree, but that one doesn't 17# do any merges that might change the tree layout. 18 19case"${1:-.}${2:-.}${3:-.}"in 20# 21# Deleted in both or deleted in one and unchanged in the other 22# 23"$1.."|"$1.$1"|"$1$1.") 24if["$2"];then 25echo"Removing$4" 26else 27# read-tree checked that index matches HEAD already, 28# so we know we do not have this path tracked. 29# there may be an unrelated working tree file here, 30# which we should just leave unmolested. Make sure 31# we do not have it in the index, though. 32exec git update-index --remove --"$4" 33fi 34iftest -f"$4";then 35rm-f --"$4"&& 36rmdir-p"$(expr "z$4" : 'z\(.*\)/')"2>/dev/null || : 37fi&& 38exec git update-index --remove --"$4" 39;; 40 41# 42# Added in one. 43# 44".$2.") 45# the other side did not add and we added so there is nothing 46# to be done, except making the path merged. 47exec git update-index --add --cacheinfo"$6""$2""$4" 48;; 49"..$3") 50echo"Adding$4" 51iftest -f"$4" 52then 53echo"ERROR: untracked$4is overwritten by the merge." 54exit1 55fi 56 git update-index --add --cacheinfo"$7""$3""$4"&& 57exec git checkout-index -u -f --"$4" 58;; 59 60# 61# Added in both, identically (check for same permissions). 62# 63".$3$2") 64if["$6"!="$7"];then 65echo"ERROR: File$4added identically in both branches," 66echo"ERROR: but permissions conflict$6->$7." 67exit1 68fi 69echo"Adding$4" 70 git update-index --add --cacheinfo"$6""$2""$4"&& 71exec git checkout-index -u -f --"$4" 72;; 73 74# 75# Modified in both, but differently. 76# 77"$1$2$3"|".$2$3") 78 79case",$6,$7,"in 80*,120000,*) 81echo"ERROR:$4: Not merging symbolic link changes." 82exit1 83;; 84*,160000,*) 85echo"ERROR:$4: Not merging conflicting submodule changes." 86exit1 87;; 88esac 89 90 src2=`git-unpack-file$3` 91case"$1"in 92'') 93echo"Added$4in both, but differently." 94# This extracts OUR file in $orig, and uses git apply to 95# remove lines that are unique to ours. 96 orig=`git-unpack-file$2` 97 sz0=`wc -c <"$orig"` 98diff-u -La/$orig-Lb/$orig $orig $src2| git apply --no-add 99 sz1=`wc -c <"$orig"` 100 101# If we do not have enough common material, it is not 102# worth trying two-file merge using common subsections. 103expr"$sz0" \<"$sz1" \*2>/dev/null || : >$orig 104;; 105*) 106echo"Auto-merging$4" 107 orig=`git-unpack-file$1` 108;; 109esac 110 111# Be careful for funny filename such as "-L" in "$4", which 112# would confuse "merge" greatly. 113 src1=`git-unpack-file$2` 114 git merge-file"$src1""$orig""$src2" 115 ret=$? 116 msg= 117if[$ret-ne0];then 118 msg='content conflict' 119fi 120 121# Create the working tree file, using "our tree" version from the 122# index, and then store the result of the merge. 123 git checkout-index -f --stage=2--"$4"&&cat"$src1">"$4" 124rm-f --"$orig""$src1""$src2" 125 126if["$6"!="$7"];then 127if[-n"$msg"];then 128 msg="$msg, " 129fi 130 msg="${msg}permissions conflict:$5->$6,$7" 131 ret=1 132fi 133if["$1"=''];then 134 ret=1 135fi 136 137if[$ret-ne0];then 138echo"ERROR:$msgin$4" 139exit1 140fi 141exec git update-index --"$4" 142;; 143 144*) 145echo"ERROR:$4: Not handling case$1->$2->$3" 146;; 147esac 148exit1