[PATCH 7/7] read-tree: make three-way merge sparse-aware
From: Victoria Dye via GitGitGadget <hidden>
Date: 2022-02-23 18:25:49
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Victoria Dye <redacted> Enable use of 'merged_sparse_dir' in 'threeway_merge'. As with two-way merge, the contents of each conflicted sparse directory are merged without referencing the index, avoiding sparse index expansion. Signed-off-by: Victoria Dye <redacted> --- builtin/read-tree.c | 5 ----- t/t1092-sparse-checkout-compatibility.sh | 3 ++- unpack-trees.c | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index 5a421de2629..dc2283fce53 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c@@ -230,11 +230,6 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix) break; case 3: default: - /* - * TODO: update threeway_merge to handle edit/edit conflicts in - * sparse directories. - */ - ensure_full_index(&the_index); opts.fn = threeway_merge; break; }
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index d6f19682d65..5447d314632 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh@@ -1412,7 +1412,8 @@ test_expect_success 'sparse index is not expanded: read-tree' ' ensure_not_expanded checkout -b test-branch update-folder1 && for MERGE_TREES in "update-folder2" \ - "base update-folder2" + "base update-folder2" \ + "base HEAD update-folder2" do ensure_not_expanded read-tree -mu $MERGE_TREES && ensure_not_expanded reset --hard HEAD || return 1
diff --git a/unpack-trees.c b/unpack-trees.c
index a4ace53904e..9e79cb13bd4 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c@@ -2635,16 +2635,24 @@ int threeway_merge(const struct cache_entry * const *stages, */ /* #14, #14ALT, #2ALT */ if (remote && !df_conflict_head && head_match && !remote_match) { - if (index && !same(index, remote) && !same(index, head)) - return reject_merge(index, o); + if (index && !same(index, remote) && !same(index, head)) { + if (S_ISSPARSEDIR(index->ce_mode)) + return merged_sparse_dir(stages, 4, o); + else + return reject_merge(index, o); + } return merged_entry(remote, index, o); } /* * If we have an entry in the index cache, then we want to * make sure that it matches head. */ - if (index && !same(index, head)) - return reject_merge(index, o); + if (index && !same(index, head)) { + if (S_ISSPARSEDIR(index->ce_mode)) + return merged_sparse_dir(stages, 4, o); + else + return reject_merge(index, o); + } if (head) { /* #5ALT, #15 */
--
gitgitgadget