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