[PATCH] read-tree -m 3-way: handle more trivial merges internally.
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:41:59
Subsystem:
the rest · Maintainer:
Linus Torvalds
This patch teaches "read-tree -m O A B" that some more trivial cases can be handled internally. This allows us to loosen otherwise too strict index requirements in case #5ALT, where both branches create a new file identically. The previous code required index to be up-to-date and aborted the merge when it is not, but there is no reason to require it to be up-to-date in this case; it only needs to match A. The test vector has been updated to match the new behaviour. Signed-off-by: Junio C Hamano <redacted> --- *** This has the "removal" fixes. read-tree.c | 16 ++++++++++++++++ t/t1000-read-tree-m-3way.sh | 27 +++++++++------------------ 2 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/read-tree.c b/read-tree.c
--- a/read-tree.c
+++ b/read-tree.c@@ -69,6 +69,12 @@ static struct cache_entry *merge_entries if (same(o,b)) return a; } + /* #5ALT */ + if (!o && a && b && same(a,b)) { + /* Match what git-merge-one-file-script does */ + printf("Adding %s\n", a->name); + return a; + } return NULL; }
@@ -170,6 +176,16 @@ static int threeway_merge(struct cache_e return merged_entry(merge, i, dst); if (i) verify_uptodate(i); + + /* #6ALT, #8ALT, and #10ALT */ + if ((o && !a && !b) || + (o && !a && b && same(o, b)) || + (o && a && !b && same(o, a))) { + /* Match what git-merge-one-file-script does */ + printf("Removing %s\n", o->name); + return deleted_entry(o, i, dst); + } + count = 0; if (o) { *dst++ = o; count++; } if (a) { *dst++ = a; count++; }
diff --git a/t/t1000-read-tree-m-3way.sh b/t/t1000-read-tree-m-3way.sh
--- a/t/t1000-read-tree-m-3way.sh
+++ b/t/t1000-read-tree-m-3way.sh@@ -75,21 +75,18 @@ In addition: . ../lib-read-tree-m-3way.sh ################################################################ -# This is the "no trivial merge unless all three exists" table. +# Trivial "majority when 3 stages exist" merge plus #5ALT, #6ALT, +# #8ALT, #10ALT trivial merges. cat >expected <<\EOF 100644 X 2 AA 100644 X 3 AA 100644 X 2 AN -100644 X 1 DD 100644 X 3 DF 100644 X 2 DF/DF 100644 X 1 DM 100644 X 3 DM -100644 X 1 DN -100644 X 3 DN -100644 X 2 LL -100644 X 3 LL +100644 X 0 LL 100644 X 1 MD 100644 X 2 MD 100644 X 1 MM
@@ -97,8 +94,6 @@ cat >expected <<\EOF 100644 X 3 MM 100644 X 0 MN 100644 X 3 NA -100644 X 1 ND -100644 X 2 ND 100644 X 0 NM 100644 X 0 NN 100644 X 0 SS
@@ -108,11 +103,8 @@ cat >expected <<\EOF 100644 X 2 Z/AA 100644 X 3 Z/AA 100644 X 2 Z/AN -100644 X 1 Z/DD 100644 X 1 Z/DM 100644 X 3 Z/DM -100644 X 1 Z/DN -100644 X 3 Z/DN 100644 X 1 Z/MD 100644 X 2 Z/MD 100644 X 1 Z/MM
@@ -120,8 +112,6 @@ cat >expected <<\EOF 100644 X 3 Z/MM 100644 X 0 Z/MN 100644 X 3 Z/NA -100644 X 1 Z/ND -100644 X 2 Z/ND 100644 X 0 Z/NM 100644 X 0 Z/NN EOF
@@ -289,23 +279,24 @@ test_expect_failure \ git-read-tree -m $tree_O $tree_A $tree_B" test_expect_success \ - '5 - must match and be up-to-date in !O && A && B && A==B case.' \ + '5 - must match in !O && A && B && A==B case.' \ "rm -f .git/index LL && cp .orig-A/LL LL && git-update-cache --add LL && git-read-tree -m $tree_O $tree_A $tree_B && check_result" -test_expect_failure \ - '5 (fail) - must match and be up-to-date in !O && A && B && A==B case.' \ +test_expect_success \ + '5 - must match in !O && A && B && A==B case.' \ "rm -f .git/index LL && cp .orig-A/LL LL && git-update-cache --add LL && echo extra >>LL && - git-read-tree -m $tree_O $tree_A $tree_B" + git-read-tree -m $tree_O $tree_A $tree_B && + check_result" test_expect_failure \ - '5 (fail) - must match and be up-to-date in !O && A && B && A==B case.' \ + '5 (fail) - must match in !O && A && B && A==B case.' \ "rm -f .git/index LL && cp .orig-A/LL LL && echo extra >>LL && ------------