X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-merge-one-file-script;h=cefbe634d888e33c8baba485517c32ad418ae142;hb=e2a669bb2e667d2cde998bdbbefe51dd04e2bff1;hp=b2adc5fc4583e6089f4b38a47e1a73caad183f20;hpb=0a9ea850005de0fb74b6288d281eb0417e869b00;p=git.git diff --git a/git-merge-one-file-script b/git-merge-one-file-script index b2adc5fc..cefbe634 100755 --- a/git-merge-one-file-script +++ b/git-merge-one-file-script @@ -9,52 +9,78 @@ # # # Handle some trivial cases.. The _really_ trivial cases have -# been handled already by read-tree, but that one doesn't +# been handled already by git-read-tree, but that one doesn't # do any merges that migth change the tree layout # # if the directory is newly added in a branch, it might not exist # in the current tree dir=$(dirname "$4") -mkdir -p "$dir" +mkdir -p "$dir" || exit case "${1:-.}${2:-.}${3:-.}" in # -# deleted in both, or deleted in one and unchanged in the other +# deleted in both +# +"$1..") + echo "ERROR: $4 is removed in both branches" + echo "ERROR: This is a potential rename conflict" + exit 1;; +# +# deleted in one and unchanged in the other # "$1.." | "$1.$1" | "$1$1.") - rm -f -- "$4" - update-cache --remove -- "$4" - exit 0 - ;; - + echo "Removing $4" + rm -f -- "$4" && exec git-update-cache --remove -- "$4" ;; # -# added in one, or added identically in both +# added in one # -".$2." | "..$3" | ".$2$2") - mv $(unpack-file "${2:-$3}") $4 - update-cache --add -- $4 - exit 0 - ;; - +".$2." | "..$3" ) + case "$6$7" in *7??) mode=+x;; *) mode=-x;; esac + echo "Adding $4 with perm $mode" + rm -f -- "$4" && + git-cat-file blob "$2$3" >"$4" && + chmod "$mode" -- "$4" && + exec git-update-cache --add -- "$4" ;; +# +# Added in both (check for same permissions) +# +".$2$2") + if [ "$6" != "$7" ]; then + echo "ERROR: File $4 added in both branches, permissions conflict $6->$7" + exit 1 + fi + case "$6" in *7??) mode=+x;; *) mode=-x;; esac + echo "Adding $4 with perm $mode" + rm -f -- "$4" && + git-cat-file blob "$2" >"$4" && + chmod "$mode" -- "$4" && + exec git-update-cache --add -- "$4" ;; # # Modified in both, but differently ;( # "$1$2$3") echo "Auto-merging $4" - orig=$(unpack-file $1) - src1=$(unpack-file $2) - src2=$(unpack-file $3) + orig=$(git-unpack-file $1) + src1=$(git-unpack-file $2) + src2=$(git-unpack-file $3) merge "$src2" "$orig" "$src1" - if [ $? -ne 0 ]; then - echo Leaving conflict merge in $src2 + ret=$? + if [ "$6" != "$7" ]; then + echo "ERROR: Permissions $5->$6->$7 don't match merging $src2" + if [ $ret -ne 0 ]; then + echo "ERROR: Leaving conflict merge in $src2" + fi exit 1 fi - cp "$src2" "$4" && update-cache --add -- "$4" && exit 0 - ;; - + if [ $ret -ne 0 ]; then + echo "ERROR: Leaving conflict merge in $src2" + exit 1 + fi + case "$6" in *7??) mode=+x;; *) mode=-x;; esac + rm -f -- "$4" && cat "$src2" >"$4" && chmod "$mode" -- "$4" && + exec git-update-cache --add -- "$4" ;; *) - echo "Not handling case $1 -> $2 -> $3" - ;; + echo "Not handling case $4: $1 -> $2 -> $3" ;; esac exit 1