Message ID | 64edbed0f95623e307371cfc3905786e5b0a02f3.1650908958.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Sparse index: integrate with 'git stash' | expand |
"Victoria Dye via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: Victoria Dye <vdye@github.com> > > When the index read in 'do_read_index()' does not exist on-disk, mark the > index "sparse" if the executing command does not require a full index and > sparse index is otherwise enabled. > > Some commands (such as 'git stash -u') implicitly create a new index (when > the 'GIT_INDEX_FILE' variable points to a non-existent file) and perform > some operation on it. However, when this index is created, it isn't created > with the same sparsity settings as the repo index. As a result, while these > indexes may be sparse during the operation, they are always expanded before > being written to disk. We can avoid that expansion by defaulting the index > to "sparse", in which case it will only be expanded if the full index is > needed. Makes sense.
diff --git a/read-cache.c b/read-cache.c index 4df97e185e9..60355f5ad6a 100644 --- a/read-cache.c +++ b/read-cache.c @@ -2260,6 +2260,20 @@ static unsigned long load_cache_entries_threaded(struct index_state *istate, con return consumed; } +static void set_new_index_sparsity(struct index_state *istate) +{ + /* + * If the index's repo exists, mark it sparse according to + * repo settings. + */ + if (istate->repo) { + prepare_repo_settings(istate->repo); + if (!istate->repo->settings.command_requires_full_index && + is_sparse_index_allowed(istate, 0)) + istate->sparse_index = 1; + } +} + /* remember to discard_cache() before reading a different cache! */ int do_read_index(struct index_state *istate, const char *path, int must_exist) { @@ -2281,8 +2295,10 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist) istate->timestamp.nsec = 0; fd = open(path, O_RDONLY); if (fd < 0) { - if (!must_exist && errno == ENOENT) + if (!must_exist && errno == ENOENT) { + set_new_index_sparsity(istate); return 0; + } die_errno(_("%s: index file open failed"), path); } diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index b00c65c7770..a8c1c345ab0 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -1381,7 +1381,7 @@ test_expect_success 'sparse-index is not expanded: stash' ' ensure_not_expanded stash drop stash@{0} && echo >>sparse-index/deep/new && - ! ensure_not_expanded stash -u && + ensure_not_expanded stash -u && ( WITHOUT_UNTRACKED_TXT=1 && ! ensure_not_expanded stash pop