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 - orignal 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 19verify_path() { 20file="$1" 21 dir=`dirname "$file"`&& 22mkdir-p"$dir"&& 23rm-f --"$file"&& 24: >"$file" 25} 26 27case"${1:-.}${2:-.}${3:-.}"in 28# 29# Deleted in both or deleted in one and unchanged in the other 30# 31"$1.."|"$1.$1"|"$1$1.") 32if["$2"];then 33echo"Removing$4" 34fi 35iftest -f"$4";then 36rm-f --"$4"&& 37rmdir-p"$(expr "$4" : '\(.*\)/')"2>/dev/null || : 38fi&& 39exec git-update-index --remove --"$4" 40;; 41 42# 43# Added in one. 44# 45".$2."|"..$3") 46echo"Adding$4" 47 git-update-index --add --cacheinfo"$6$7""$2$3""$4"&& 48exec git-checkout-index -u -f --"$4" 49;; 50 51# 52# Added in both, identically (check for same permissions). 53# 54".$3$2") 55if["$6"!="$7"];then 56echo"ERROR: File$4added identically in both branches," 57echo"ERROR: but permissions conflict$6->$7." 58exit1 59fi 60echo"Adding$4" 61 git-update-index --add --cacheinfo"$6""$2""$4"&& 62exec git-checkout-index -u -f --"$4" 63;; 64 65# 66# Modified in both, but differently. 67# 68"$1$2$3"|".$2$3") 69 70case",$6,$7,"in 71*,120000,*) 72echo"ERROR:$4: Not merging symbolic link changes." 73exit1 74;; 75esac 76 77 src2=`git-unpack-file$3` 78case"$1"in 79'') 80echo"Added$4in both, but differently." 81# This extracts OUR file in $orig, and uses git-apply to 82# remove lines that are unique to ours. 83 orig=`git-unpack-file$2` 84 sz0=`wc -c <"$orig"` 85diff-u -La/$orig-Lb/$orig $orig $src2| git-apply --no-add 86 sz1=`wc -c <"$orig"` 87 88# If we do not have enough common material, it is not 89# worth trying two-file merge using common subsections. 90expr"$sz0" \<"$sz1" \*2>/dev/null || : >$orig 91;; 92*) 93echo"Auto-merging$4." 94 orig=`git-unpack-file$1` 95;; 96esac 97 98# Create the working tree file, with the correct permission bits. 99# we can not rely on the fact that our tree has the path, because 100# we allow the merge to be done in an unchecked-out working tree. 101 verify_path "$4"&& 102 git-cat-file blob "$2">"$4"&& 103case"$6"in*7??)chmod+x --"$4";;esac&& 104 merge "$4""$orig""$src2" 105 ret=$? 106rm-f --"$orig""$src2" 107 108if["$6"!="$7"];then 109echo"ERROR: Permissions conflict:$5->$6,$7." 110 ret=1 111fi 112if["$1"=''];then 113 ret=1 114fi 115 116if[$ret-ne0];then 117echo"ERROR: Merge conflict in$4." 118exit1 119fi 120exec git-update-index --"$4" 121;; 122 123*) 124echo"ERROR:$4: Not handling case$1->$2->$3" 125;; 126esac 127exit1