git-merge-one-file: do not worry about 'rmdir -p' not removing directory.
[git.git] / git-merge-one-file.sh
index 5419e59..9a049f4 100755 (executable)
@@ -25,7 +25,8 @@ case "${1:-.}${2:-.}${3:-.}" in
                echo "Removing $4"
        fi
        if test -f "$4"; then
-               rm -f -- "$4"
+               rm -f -- "$4" &&
+               rmdir -p "$(expr "$4" : '\(.*\)/')" 2>/dev/null || :
        fi &&
                exec git-update-index --remove -- "$4"
        ;;
@@ -40,7 +41,7 @@ case "${1:-.}${2:-.}${3:-.}" in
        ;;
 
 #
-# Added in both (check for same permissions).
+# Added in both, identically (check for same permissions).
 #
 ".$3$2")
        if [ "$6" != "$7" ]; then
@@ -56,16 +57,29 @@ case "${1:-.}${2:-.}${3:-.}" in
 #
 # Modified in both, but differently.
 #
-"$1$2$3")
-       echo "Auto-merging $4."
-       orig=`git-unpack-file $1`
+"$1$2$3" | ".$2$3")
        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
+               # 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 
+               sz1=`wc -c <"$orig"`
 
-       # We reset the index to the first branch, making
-       # git-diff-file useful
-       git-update-index --add --cacheinfo "$6" "$2" "$4"
-               git-checkout-index -u -f -- "$4" &&
-               merge "$4" "$orig" "$src2"
+               # 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
+               ;;
+       *)
+               echo "Auto-merging $4."
+               orig=`git-unpack-file $1`
+               ;;
+       esac
+
+       merge "$4" "$orig" "$src2"
        ret=$?
        rm -f -- "$orig" "$src2"
 
@@ -73,6 +87,9 @@ case "${1:-.}${2:-.}${3:-.}" in
                echo "ERROR: Permissions conflict: $5->$6,$7."
                ret=1
        fi
+       if [ "$1" = '' ]; then
+               ret=1
+       fi
 
        if [ $ret -ne 0 ]; then
                echo "ERROR: Merge conflict in $4."