зеркало из https://github.com/microsoft/git.git
merge-ort: expand only for out-of-cone conflicts
Merge conflicts happen often enough to want to avoid expanding a sparse index when they happen, as long as those conflicts are within the sparse-checkout cone. If a conflict exists outside of the sparse-checkout cone, then we still need to expand before iterating over the index entries. This is critical to do in advance because of how the original_cache_nr is tracked to allow inserting and replacing cache entries. Iterate over the conflicted files and check if any paths are outside of the sparse-checkout cone. If so, then expand the full index. Add a test that demonstrates that we do not expand the index, even when we hit a conflict within the sparse-checkout cone. Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
This commit is contained in:
Родитель
d91a647494
Коммит
df49b5f030
13
merge-ort.c
13
merge-ort.c
|
@ -4060,11 +4060,18 @@ static int record_conflicted_index_entries(struct merge_options *opt)
|
|||
|
||||
/*
|
||||
* We are in a conflicted state. These conflicts might be inside
|
||||
* sparse-directory entries, so expand the index preemtively.
|
||||
* Also, we set original_cache_nr below, but that might change if
|
||||
* sparse-directory entries, so check if any entries are outside
|
||||
* of the sparse-checkout cone preemptively.
|
||||
*
|
||||
* We set original_cache_nr below, but that might change if
|
||||
* index_name_pos() calls ask for paths within sparse directories.
|
||||
*/
|
||||
ensure_full_index(index);
|
||||
strmap_for_each_entry(&opt->priv->conflicted, &iter, e) {
|
||||
if (!path_in_sparse_checkout(e->key, index)) {
|
||||
ensure_full_index(index);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If any entries have skip_worktree set, we'll have to check 'em out */
|
||||
state.force = 1;
|
||||
|
|
|
@ -617,8 +617,17 @@ test_expect_success 'sparse-index is expanded and converted back' '
|
|||
ensure_not_expanded () {
|
||||
rm -f trace2.txt &&
|
||||
echo >>sparse-index/untracked.txt &&
|
||||
GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
|
||||
git -C sparse-index "$@" &&
|
||||
|
||||
if test "$1" = "!"
|
||||
then
|
||||
shift &&
|
||||
test_must_fail env \
|
||||
GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
|
||||
git -C sparse-index "$@" || return 1
|
||||
else
|
||||
GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
|
||||
git -C sparse-index "$@" || return 1
|
||||
fi &&
|
||||
test_region ! index ensure_full_index trace2.txt
|
||||
}
|
||||
|
||||
|
@ -658,6 +667,23 @@ test_expect_success 'sparse-index is not expanded' '
|
|||
)
|
||||
'
|
||||
|
||||
test_expect_success 'sparse-index is not expanded: merge conflict in cone' '
|
||||
init_repos &&
|
||||
|
||||
for side in right left
|
||||
do
|
||||
git -C sparse-index checkout -b expand-$side base &&
|
||||
echo $side >sparse-index/deep/a &&
|
||||
git -C sparse-index commit -a -m "$side" || return 1
|
||||
done &&
|
||||
|
||||
(
|
||||
sane_unset GIT_TEST_MERGE_ALGORITHM &&
|
||||
git -C sparse-index config pull.twohead ort &&
|
||||
ensure_not_expanded ! merge -m merged expand-right
|
||||
)
|
||||
'
|
||||
|
||||
# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
|
||||
# in this scenario, but it shouldn't.
|
||||
test_expect_success 'reset mixed and checkout orphan' '
|
||||
|
|
Загрузка…
Ссылка в новой задаче