merge-one-file: use common as base, instead of emptiness.
authorJunio C Hamano <junkio@cox.net>
Thu, 10 Nov 2005 04:38:33 +0000 (20:38 -0800)
committerJunio C Hamano <junkio@cox.net>
Sat, 12 Nov 2005 05:18:17 +0000 (21:18 -0800)
Unlike the previous round that merged the path added differently
in each branches using emptiness as the base, compute a common
version and use it as input to 'merge' program.

This would show the resulting (still conflicting) file left in
the working tree as:

common file contents...
<<<<<< FILENAME
version from our branch...
======
version from their branch...
>>>>>> .merge_file_XXXXXX
more common file contents...

when both sides added similar contents.

Signed-off-by: Junio C Hamano <junkio@cox.net>
apply.c
git-merge-one-file.sh

diff --git a/apply.c b/apply.c
index cf8aa87a289bfa534405c461323eae5452c96d1e..472bcdc369aec31d3c72d8b4bca74feca2798281 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -23,6 +23,7 @@ static int numstat = 0;
 static int summary = 0;
 static int check = 0;
 static int apply = 1;
+static int no_add = 0;
 static int show_index_info = 0;
 static int line_termination = '\n';
 static const char apply_usage[] =
@@ -1112,8 +1113,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
                                break;
                /* Fall-through for ' ' */
                case '+':
-                       memcpy(new + newsize, patch + 1, plen);
-                       newsize += plen;
+                       if (*patch != '+' || !no_add) {
+                               memcpy(new + newsize, patch + 1, plen);
+                               newsize += plen;
+                       }
                        break;
                case '@': case '\\':
                        /* Ignore it, we already handled it */
@@ -1710,6 +1713,10 @@ int main(int argc, char **argv)
                        excludes = x;
                        continue;
                }
+               if (!strcmp(arg, "--no-add")) {
+                       no_add = 1;
+                       continue;
+               }
                if (!strcmp(arg, "--stat")) {
                        apply = 0;
                        diffstat = 1;
index 32e17cbc61341a0b6b04d0556aa59bd95a73cb45..d9ee4581504984e4337a70433f82c411bb5a9c02 100755 (executable)
@@ -57,18 +57,20 @@ case "${1:-.}${2:-.}${3:-.}" in
 # Modified in both, but differently.
 #
 "$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`
-               : >$orig
+               diff -u -La/$orig -Lb/$orig $orig $src2 | git-apply --no-add 
                ;;
        *)
                echo "Auto-merging $4."
                orig=`git-unpack-file $1`
                ;;
        esac
-       src2=`git-unpack-file $3`
 
        # We reset the index to the first branch, making
        # git-diff-file useful