aboutsummaryrefslogtreecommitdiff
path: root/git-merge-one-file.sh
diff options
context:
space:
mode:
Diffstat (limited to 'git-merge-one-file.sh')
-rwxr-xr-xgit-merge-one-file.sh28
1 files changed, 24 insertions, 4 deletions
diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh
index 5419e598c..b08597de2 100755
--- a/git-merge-one-file.sh
+++ b/git-merge-one-file.sh
@@ -40,7 +40,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,10 +56,27 @@ 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"`
+
+ # 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
# We reset the index to the first branch, making
# git-diff-file useful
@@ -73,6 +90,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."