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 19USAGE='<orig blob> <our blob> <their blob> <path>' 20USAGE="$USAGE<orig mode> <our mode> <their mode>" 21LONG_USAGE="usage: git merge-one-file$USAGE 22 23Blob ids and modes should be empty for missing files." 24 25SUBDIRECTORY_OK=Yes 26. git-sh-setup 27cd_to_toplevel 28require_work_tree 29 30iftest$#!=7 31then 32echo"$LONG_USAGE" 33exit1 34fi 35 36case"${1:-.}${2:-.}${3:-.}"in 37# 38# Deleted in both or deleted in one and unchanged in the other 39# 40"$1.."|"$1.$1"|"$1$1.") 41iftest -n"$2" 42then 43echo"Removing$4" 44else 45# read-tree checked that index matches HEAD already, 46# so we know we do not have this path tracked. 47# there may be an unrelated working tree file here, 48# which we should just leave unmolested. Make sure 49# we do not have it in the index, though. 50exec git update-index --remove --"$4" 51fi 52iftest -f"$4" 53then 54rm-f --"$4"&& 55rmdir-p"$(expr "z$4" : 'z\(.*\)/')"2>/dev/null || : 56fi&& 57exec git update-index --remove --"$4" 58;; 59 60# 61# Added in one. 62# 63".$2.") 64# the other side did not add and we added so there is nothing 65# to be done, except making the path merged. 66exec git update-index --add --cacheinfo"$6""$2""$4" 67;; 68"..$3") 69echo"Adding$4" 70iftest -f"$4" 71then 72echo"ERROR: untracked$4is overwritten by the merge.">&2 73exit1 74fi 75 git update-index --add --cacheinfo"$7""$3""$4"&& 76exec git checkout-index -u -f --"$4" 77;; 78 79# 80# Added in both, identically (check for same permissions). 81# 82".$3$2") 83iftest"$6"!="$7" 84then 85echo"ERROR: File$4added identically in both branches,">&2 86echo"ERROR: but permissions conflict$6->$7.">&2 87exit1 88fi 89echo"Adding$4" 90 git update-index --add --cacheinfo"$6""$2""$4"&& 91exec git checkout-index -u -f --"$4" 92;; 93 94# 95# Modified in both, but differently. 96# 97"$1$2$3"|".$2$3") 98 99case",$6,$7,"in 100*,120000,*) 101echo"ERROR:$4: Not merging symbolic link changes.">&2 102exit1 103;; 104*,160000,*) 105echo"ERROR:$4: Not merging conflicting submodule changes.">&2 106exit1 107;; 108esac 109 110 src1=$(git-unpack-file $2) 111 src2=$(git-unpack-file $3) 112case"$1"in 113'') 114echo"Added$4in both, but differently." 115 orig=$(git-unpack-file $2) 116 create_virtual_base "$orig""$src2" 117;; 118*) 119echo"Auto-merging$4" 120 orig=$(git-unpack-file $1) 121;; 122esac 123 124 git merge-file"$src1""$orig""$src2" 125 ret=$? 126 msg= 127iftest$ret!=0||test -z"$1" 128then 129 msg='content conflict' 130 ret=1 131fi 132 133# Create the working tree file, using "our tree" version from the 134# index, and then store the result of the merge. 135 git checkout-index -f --stage=2--"$4"&&cat"$src1">"$4"||exit1 136rm-f --"$orig""$src1""$src2" 137 138iftest"$6"!="$7" 139then 140iftest -n"$msg" 141then 142 msg="$msg, " 143fi 144 msg="${msg}permissions conflict:$5->$6,$7" 145 ret=1 146fi 147 148iftest$ret!=0 149then 150echo"ERROR:$msgin$4">&2 151exit1 152fi 153exec git update-index --"$4" 154;; 155 156*) 157echo"ERROR:$4: Not handling case$1->$2->$3">&2 158;; 159esac 160exit1