merge-tree: don't print entries that match "local"
authorJohn Keeping <john@keeping.me.uk>
Sun, 7 Apr 2013 21:07:51 +0000 (22:07 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 8 Apr 2013 17:50:52 +0000 (10:50 -0700)
The documentation says:

the output from the command omits entries that match the
<branch1> tree.

But currently "added in branch1" and "removed in branch1" (both while
unchanged in branch2) do print output. Change this so that the
behaviour matches the documentation.

Signed-off-by: John Keeping <john@keeping.me.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge-tree.c
t/t4300-merge-tree.sh
index bc912e399efa295615e9bfaac0de03904edff367..ed25d81b880eb830481d4e729d7e9acc3266de65 100644 (file)
@@ -155,6 +155,11 @@ static int same_entry(struct name_entry *a, struct name_entry *b)
                a->mode == b->mode;
 }
 
+static int both_empty(struct name_entry *a, struct name_entry *b)
+{
+       return !(a->sha1 || b->sha1);
+}
+
 static struct merge_list *create_entry(unsigned stage, unsigned mode, const unsigned char *sha1, const char *path)
 {
        struct merge_list *res = xcalloc(1, sizeof(*res));
@@ -297,13 +302,10 @@ static void unresolved(const struct traverse_info *info, struct name_entry n[3])
 static int threeway_callback(int n, unsigned long mask, unsigned long dirmask, struct name_entry *entry, struct traverse_info *info)
 {
        /* Same in both? */
-       if (same_entry(entry+1, entry+2)) {
-               if (entry[0].sha1) {
-                       /* Modified identically */
-                       resolve(info, NULL, entry+1);
-                       return mask;
-               }
-               /* "Both added the same" is left unresolved */
+       if (same_entry(entry+1, entry+2) || both_empty(entry+0, entry+2)) {
+               /* Modified, added or removed identically */
+               resolve(info, NULL, entry+1);
+               return mask;
        }
 
        if (same_entry(entry+0, entry+1)) {
@@ -319,12 +321,10 @@ static int threeway_callback(int n, unsigned long mask, unsigned long dirmask, s
                 */
        }
 
-       if (same_entry(entry+0, entry+2)) {
-               if (entry[1].sha1 && !S_ISDIR(entry[1].mode)) {
-                       /* We modified, they did not touch -- take ours */
-                       resolve(info, NULL, entry+1);
-                       return mask;
-               }
+       if (same_entry(entry+0, entry+2) || both_empty(entry+0, entry+2)) {
+               /* We added, modified or removed, they did not touch -- take ours */
+               resolve(info, NULL, entry+1);
+               return mask;
        }
 
        unresolved(info, entry);
index d0b2a457b8bf30fc7ab472ff6b2576ff319432f7..bd43b3d8ef8b3e71f6985cfa96a940dccb4a0a54 100755 (executable)
@@ -26,8 +26,6 @@ EXPECTED
 
 test_expect_success 'file add !A, B' '
        cat >expected <<\EXPECTED &&
-added in local
-  our    100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
 EXPECTED
 
        git reset --hard initial &&
@@ -38,9 +36,6 @@ EXPECTED
 
 test_expect_success 'file add A, B (same)' '
        cat >expected <<\EXPECTED &&
-added in both
-  our    100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
-  their  100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
 EXPECTED
 
        git reset --hard initial &&
@@ -181,9 +176,6 @@ AAA" &&
 
 test_expect_success 'file remove A, !B' '
        cat >expected <<\EXPECTED &&
-removed in local
-  base   100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
-  their  100644 43d5a8ed6ef6c00ff775008633f95787d088285d ONE
 EXPECTED
 
        git reset --hard initial &&
@@ -283,8 +275,6 @@ test_expect_success 'turn tree to file' '
        test_commit "make-file" "dir" "CCC" &&
        git merge-tree add-tree add-another-tree make-file >actual &&
        cat >expect <<-\EOF &&
-       added in local
-         our    100644 ba629238ca89489f2b350e196ca445e09d8bb834 dir/another
        removed in remote
          base   100644 43d5a8ed6ef6c00ff775008633f95787d088285d dir/path
          our    100644 43d5a8ed6ef6c00ff775008633f95787d088285d dir/path