From: Victoria Dye <vdye@xxxxxxxxxx> 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 <vdye@xxxxxxxxxx> --- 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