Skip to content

Commit c35e9f5

Browse files
vdyegitster
authored andcommitted
update-index: integrate with sparse index
Enable use of the sparse index with `update-index`. Most variations of `update-index` work without explicitly expanding the index or making any other updates in or outside of `update-index.c`. The one usage requiring additional changes is `--cacheinfo`; if a file inside a sparse directory was specified, the index would not be expanded until after the cache tree is invalidated, leading to a mismatch between the index and cache tree. This scenario is handled by rearranging `add_index_entry_with_check`, allowing `index_name_stage_pos` to expand the index *before* attempting to invalidate the relevant cache tree path, avoiding cache tree/index corruption. Signed-off-by: Victoria Dye <[email protected]> Reviewed-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e015d4d commit c35e9f5

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

builtin/update-index.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,6 +1077,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
10771077

10781078
git_config(git_default_config, NULL);
10791079

1080+
prepare_repo_settings(r);
1081+
the_repository->settings.command_requires_full_index = 0;
1082+
10801083
/* we will diagnose later if it turns out that we need to update it */
10811084
newfd = hold_locked_index(&lock_file, 0);
10821085
if (newfd < 0)

read-cache.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1339,9 +1339,6 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
13391339
int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
13401340
int new_only = option & ADD_CACHE_NEW_ONLY;
13411341

1342-
if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
1343-
cache_tree_invalidate_path(istate, ce->name);
1344-
13451342
/*
13461343
* If this entry's path sorts after the last entry in the index,
13471344
* we can avoid searching for it.
@@ -1352,6 +1349,13 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
13521349
else
13531350
pos = index_name_stage_pos(istate, ce->name, ce_namelen(ce), ce_stage(ce), EXPAND_SPARSE);
13541351

1352+
/*
1353+
* Cache tree path should be invalidated only after index_name_stage_pos,
1354+
* in case it expands a sparse index.
1355+
*/
1356+
if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
1357+
cache_tree_invalidate_path(istate, ce->name);
1358+
13551359
/* existing match? Just replace it. */
13561360
if (pos >= 0) {
13571361
if (!new_only)

t/t1092-sparse-checkout-compatibility.sh

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,21 @@ test_expect_success 'sparse index is not expanded: diff' '
12531253
ensure_not_expanded diff --cached
12541254
'
12551255

1256+
test_expect_success 'sparse index is not expanded: update-index' '
1257+
init_repos &&
1258+
1259+
deep_a_oid=$(git -C full-checkout rev-parse update-deep:deep/a) &&
1260+
ensure_not_expanded update-index --cacheinfo 100644 $deep_a_oid deep/a &&
1261+
1262+
echo "test" >sparse-index/README.md &&
1263+
echo "test2" >sparse-index/a &&
1264+
rm -f sparse-index/deep/a &&
1265+
1266+
ensure_not_expanded update-index --add README.md &&
1267+
ensure_not_expanded update-index a &&
1268+
ensure_not_expanded update-index --remove deep/a
1269+
'
1270+
12561271
test_expect_success 'sparse index is not expanded: blame' '
12571272
init_repos &&
12581273

0 commit comments

Comments
 (0)