@@ -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;
}
@@ -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
@@ -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 */