diff options
Diffstat (limited to 'git-merge-one-file.sh')
-rwxr-xr-x | git-merge-one-file.sh | 79 |
1 files changed, 62 insertions, 17 deletions
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh index 5349a1c0fc..f612cb847a 100755 --- a/git-merge-one-file.sh +++ b/git-merge-one-file.sh @@ -8,14 +8,31 @@ # $2 - file in branch1 SHA1 (or empty) # $3 - file in branch2 SHA1 (or empty) # $4 - pathname in repository -# $5 - orignal file mode (or empty) +# $5 - original file mode (or empty) # $6 - file in branch1 mode (or empty) # $7 - file in branch2 mode (or empty) # # Handle some trivial cases.. The _really_ trivial cases have -# been handled already by git-read-tree, but that one doesn't +# been handled already by git read-tree, but that one doesn't # do any merges that might change the tree layout. +USAGE='<orig blob> <our blob> <their blob> <path>' +USAGE="$USAGE <orig mode> <our mode> <their mode>" +LONG_USAGE="Usage: git merge-one-file $USAGE + +Blob ids and modes should be empty for missing files." + +SUBDIRECTORY_OK=Yes +. git-sh-setup +cd_to_toplevel +require_work_tree + +if ! test "$#" -eq 7 +then + echo "$LONG_USAGE" + exit 1 +fi + case "${1:-.}${2:-.}${3:-.}" in # # Deleted in both or deleted in one and unchanged in the other @@ -23,21 +40,38 @@ case "${1:-.}${2:-.}${3:-.}" in "$1.." | "$1.$1" | "$1$1.") if [ "$2" ]; then echo "Removing $4" + else + # read-tree checked that index matches HEAD already, + # so we know we do not have this path tracked. + # there may be an unrelated working tree file here, + # which we should just leave unmolested. Make sure + # we do not have it in the index, though. + exec git update-index --remove -- "$4" fi if test -f "$4"; then rm -f -- "$4" && - rmdir -p "$(expr "$4" : '\(.*\)/')" 2>/dev/null || : + rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || : fi && - exec git-update-index --remove -- "$4" + exec git update-index --remove -- "$4" ;; # # Added in one. # -".$2." | "..$3" ) +".$2.") + # the other side did not add and we added so there is nothing + # to be done, except making the path merged. + exec git update-index --add --cacheinfo "$6" "$2" "$4" + ;; +"..$3") echo "Adding $4" - git-update-index --add --cacheinfo "$6$7" "$2$3" "$4" && - exec git-checkout-index -u -f -- "$4" + if test -f "$4" + then + echo "ERROR: untracked $4 is overwritten by the merge." + exit 1 + fi + git update-index --add --cacheinfo "$7" "$3" "$4" && + exec git checkout-index -u -f -- "$4" ;; # @@ -50,8 +84,8 @@ case "${1:-.}${2:-.}${3:-.}" in exit 1 fi echo "Adding $4" - git-update-index --add --cacheinfo "$6" "$2" "$4" && - exec git-checkout-index -u -f -- "$4" + git update-index --add --cacheinfo "$6" "$2" "$4" && + exec git checkout-index -u -f -- "$4" ;; # @@ -64,22 +98,26 @@ case "${1:-.}${2:-.}${3:-.}" in echo "ERROR: $4: Not merging symbolic link changes." exit 1 ;; + *,160000,*) + echo "ERROR: $4: Not merging conflicting submodule changes." + exit 1 + ;; esac src2=`git-unpack-file $3` case "$1" in '') echo "Added $4 in both, but differently." - # This extracts OUR file in $orig, and uses git-apply to + # This extracts OUR file in $orig, and uses git apply to # remove lines that are unique to ours. orig=`git-unpack-file $2` sz0=`wc -c <"$orig"` - diff -u -La/$orig -Lb/$orig $orig $src2 | git-apply --no-add + @@DIFF@@ -u -La/$orig -Lb/$orig $orig $src2 | git apply --no-add sz1=`wc -c <"$orig"` # If we do not have enough common material, it is not # worth trying two-file merge using common subsections. - expr "$sz0" \< "$sz1" \* 2 >/dev/null || : >$orig + expr $sz0 \< $sz1 \* 2 >/dev/null || : >$orig ;; *) echo "Auto-merging $4" @@ -90,16 +128,23 @@ case "${1:-.}${2:-.}${3:-.}" in # Be careful for funny filename such as "-L" in "$4", which # would confuse "merge" greatly. src1=`git-unpack-file $2` - merge "$src1" "$orig" "$src2" + git merge-file "$src1" "$orig" "$src2" ret=$? + msg= + if [ $ret -ne 0 ]; then + msg='content conflict' + fi # Create the working tree file, using "our tree" version from the # index, and then store the result of the merge. - git-checkout-index -f --stage=2 -- "$4" && cat "$src1" >"$4" + git checkout-index -f --stage=2 -- "$4" && cat "$src1" >"$4" || exit 1 rm -f -- "$orig" "$src1" "$src2" if [ "$6" != "$7" ]; then - echo "ERROR: Permissions conflict: $5->$6,$7." + if [ -n "$msg" ]; then + msg="$msg, " + fi + msg="${msg}permissions conflict: $5->$6,$7" ret=1 fi if [ "$1" = '' ]; then @@ -107,10 +152,10 @@ case "${1:-.}${2:-.}${3:-.}" in fi if [ $ret -ne 0 ]; then - echo "ERROR: Merge conflict in $4" + echo "ERROR: $msg in $4" exit 1 fi - exec git-update-index -- "$4" + exec git update-index -- "$4" ;; *) |