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. 31exit0 32fi 33iftest -f"$4";then 34rm-f --"$4"&& 35rmdir-p"$(expr "z$4" : 'z\(.*\)/')"2>/dev/null || : 36fi&& 37exec git update-index --remove --"$4" 38;; 39 40# 41# Added in one. 42# 43".$2.") 44# the other side did not add and we added so there is nothing 45# to be done. 46;; 47"..$3") 48echo"Adding$4" 49test -f"$4"|| { 50echo"ERROR: untracked$4is overwritten by the merge." 51exit1 52} 53 git update-index --add --cacheinfo"$6$7""$2$3""$4"&& 54exec git checkout-index -u -f --"$4" 55;; 56 57# 58# Added in both, identically (check for same permissions). 59# 60".$3$2") 61if["$6"!="$7"];then 62echo"ERROR: File$4added identically in both branches," 63echo"ERROR: but permissions conflict$6->$7." 64exit1 65fi 66echo"Adding$4" 67 git update-index --add --cacheinfo"$6""$2""$4"&& 68exec git checkout-index -u -f --"$4" 69;; 70 71# 72# Modified in both, but differently. 73# 74"$1$2$3"|".$2$3") 75 76case",$6,$7,"in 77*,120000,*) 78echo"ERROR:$4: Not merging symbolic link changes." 79exit1 80;; 81esac 82 83 src2=`git-unpack-file$3` 84case"$1"in 85'') 86echo"Added$4in both, but differently." 87# This extracts OUR file in $orig, and uses git apply to 88# remove lines that are unique to ours. 89 orig=`git-unpack-file$2` 90 sz0=`wc -c <"$orig"` 91diff-u -La/$orig-Lb/$orig $orig $src2| git apply --no-add 92 sz1=`wc -c <"$orig"` 93 94# If we do not have enough common material, it is not 95# worth trying two-file merge using common subsections. 96expr"$sz0" \<"$sz1" \*2>/dev/null || : >$orig 97;; 98*) 99echo"Auto-merging$4" 100 orig=`git-unpack-file$1` 101;; 102esac 103 104# Be careful for funny filename such as "-L" in "$4", which 105# would confuse "merge" greatly. 106 src1=`git-unpack-file$2` 107 git merge-file"$src1""$orig""$src2" 108 ret=$? 109 110# Create the working tree file, using "our tree" version from the 111# index, and then store the result of the merge. 112 git checkout-index -f --stage=2--"$4"&&cat"$src1">"$4" 113rm-f --"$orig""$src1""$src2" 114 115if["$6"!="$7"];then 116echo"ERROR: Permissions conflict:$5->$6,$7." 117 ret=1 118fi 119if["$1"=''];then 120 ret=1 121fi 122 123if[$ret-ne0];then 124echo"ERROR: Merge conflict in$4" 125exit1 126fi 127exec git update-index --"$4" 128;; 129 130*) 131echo"ERROR:$4: Not handling case$1->$2->$3" 132;; 133esac 134exit1