sparse-index.c: fix use of index hashes in expand_index

In ac8acb4f2c (sparse-index: complete partial expansion, 2022-05-23),
'expand_index()' was updated to expand the index to a given pathspec.
However, the 'path_matches_pattern_list()' method used to facilitate this
has the side effect of initializing or updating the index hash variables
('name_hash', 'dir_hash', and 'name_hash_initialized'). This operation is
performed on 'istate', though, not 'full'; as a result, the initialized
hashes are later overwritten when copied from 'full'. To ensure the correct
hashes are in 'istate' after the index expansion, change the arg used in
'path_matches_pattern_list()' from 'istate' to 'full'.

Note that this does not fully solve the problem. If 'istate' does not have
an initialized 'name_hash' when its contents are copied to 'full',
initialized hashes will be copied back into 'istate' but
'name_hash_initialized' will be 0. Therefore, we also need to copy
'full->name_hash_initialized' back to 'istate' after the index expansion is
complete.

Signed-off-by: Victoria Dye <vdye@github.com>
This commit is contained in:
Victoria Dye 2023-09-19 18:20:32 -07:00 коммит произвёл Johannes Schindelin
Родитель 44bda5a220
Коммит 6662919988
1 изменённых файлов: 2 добавлений и 1 удалений

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

@ -371,7 +371,7 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
if (pl && if (pl &&
path_matches_pattern_list(ce->name, ce->ce_namelen, path_matches_pattern_list(ce->name, ce->ce_namelen,
NULL, &dtype, NULL, &dtype,
pl, istate) == NOT_MATCHED) { pl, full) == NOT_MATCHED) {
set_index_entry(full, full->cache_nr++, ce); set_index_entry(full, full->cache_nr++, ce);
continue; continue;
} }
@ -399,6 +399,7 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
} }
/* Copy back into original index. */ /* Copy back into original index. */
istate->name_hash_initialized = full->name_hash_initialized;
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 = pl ? INDEX_PARTIALLY_SPARSE : INDEX_EXPANDED; istate->sparse_index = pl ? INDEX_PARTIALLY_SPARSE : INDEX_EXPANDED;