sparse-index: complete partial expansion

To complete the implementation of expand_to_pattern_list(), we need to
detect when a sparse directory entry should remain sparse. This avoids a
full expansion, so we now need to use the PARTIALLY_SPARSE mode to
indicate this state.

There still are no callers to this method, but we will add one in the
next change.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2022-05-23 13:48:44 +00:00 коммит произвёл Junio C Hamano
Родитель 0243930af4
Коммит ac8acb4f2c
1 изменённых файлов: 36 добавлений и 3 удалений

Просмотреть файл

@ -308,8 +308,24 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
* continue. A NULL pattern set indicates a full expansion to a * continue. A NULL pattern set indicates a full expansion to a
* full index. * full index.
*/ */
if (pl && !pl->use_cone_patterns) if (pl && !pl->use_cone_patterns) {
pl = NULL; pl = NULL;
} else {
/*
* We might contract file entries into sparse-directory
* entries, and for that we will need the cache tree to
* be recomputed.
*/
cache_tree_free(&istate->cache_tree);
/*
* If there is a problem creating the cache tree, then we
* need to expand to a full index since we cannot satisfy
* the current request as a sparse index.
*/
if (cache_tree_update(istate, 0))
pl = NULL;
}
if (!istate->repo) if (!istate->repo)
istate->repo = the_repository; istate->repo = the_repository;
@ -327,8 +343,14 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
full = xcalloc(1, sizeof(struct index_state)); full = xcalloc(1, sizeof(struct index_state));
memcpy(full, istate, sizeof(struct index_state)); memcpy(full, istate, sizeof(struct index_state));
/*
* This slightly-misnamed 'full' index might still be sparse if we
* are only modifying the list of sparse directories. This hinges
* on whether we have a non-NULL pattern list.
*/
full->sparse_index = pl ? INDEX_PARTIALLY_SPARSE : INDEX_EXPANDED;
/* then change the necessary things */ /* then change the necessary things */
full->sparse_index = 0;
full->cache_alloc = (3 * istate->cache_alloc) / 2; full->cache_alloc = (3 * istate->cache_alloc) / 2;
full->cache_nr = 0; full->cache_nr = 0;
ALLOC_ARRAY(full->cache, full->cache_alloc); ALLOC_ARRAY(full->cache, full->cache_alloc);
@ -340,11 +362,22 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
struct cache_entry *ce = istate->cache[i]; struct cache_entry *ce = istate->cache[i];
struct tree *tree; struct tree *tree;
struct pathspec ps; struct pathspec ps;
int dtype;
if (!S_ISSPARSEDIR(ce->ce_mode)) { if (!S_ISSPARSEDIR(ce->ce_mode)) {
set_index_entry(full, full->cache_nr++, ce); set_index_entry(full, full->cache_nr++, ce);
continue; continue;
} }
/* We now have a sparse directory entry. Should we expand? */
if (pl &&
path_matches_pattern_list(ce->name, ce->ce_namelen,
NULL, &dtype,
pl, istate) == NOT_MATCHED) {
set_index_entry(full, full->cache_nr++, ce);
continue;
}
if (!(ce->ce_flags & CE_SKIP_WORKTREE)) if (!(ce->ce_flags & CE_SKIP_WORKTREE))
warning(_("index entry is a directory, but not sparse (%08x)"), warning(_("index entry is a directory, but not sparse (%08x)"),
ce->ce_flags); ce->ce_flags);
@ -370,7 +403,7 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
/* Copy back into original index. */ /* Copy back into original index. */
memcpy(&istate->name_hash, &full->name_hash, sizeof(full->name_hash)); memcpy(&istate->name_hash, &full->name_hash, sizeof(full->name_hash));
memcpy(&istate->dir_hash, &full->dir_hash, sizeof(full->dir_hash)); memcpy(&istate->dir_hash, &full->dir_hash, sizeof(full->dir_hash));
istate->sparse_index = 0; istate->sparse_index = pl ? INDEX_PARTIALLY_SPARSE : INDEX_EXPANDED;
free(istate->cache); free(istate->cache);
istate->cache = full->cache; istate->cache = full->cache;
istate->cache_nr = full->cache_nr; istate->cache_nr = full->cache_nr;