On Tue, Feb 23, 2021 at 12:14 PM Derrick Stolee via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > > From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > > Upcoming changes will introduce modifications to the index format that > allow sparse directories. It will be useful to have a mechanism for > converting those sparse index files into full indexes by walking the > tree at those sparse directories. Name this method ensure_full_index() > as it will guarantee that the index is fully expanded. > > This method is not implemented yet, and instead we focus on the > scaffolding to declare it and call it at the appropriate time. > > Add a 'command_requires_full_index' member to struct repo_settings. This > will be an indicator that we need the index in full mode to do certain > index operations. This starts as being true for every command, then we > will set it to false as some commands integrate with sparse indexes. > > If 'command_requires_full_index' is true, then we will immediately > expand a sparse index to a full one upon reading from disk. This > suffices for now, but we will want to add more callers to > ensure_full_index() later. Same as 01/27 of your RFC series; looks good. > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > Makefile | 1 + > repo-settings.c | 8 ++++++++ > repository.c | 11 ++++++++++- > repository.h | 2 ++ > sparse-index.c | 8 ++++++++ > sparse-index.h | 7 +++++++ > 6 files changed, 36 insertions(+), 1 deletion(-) > create mode 100644 sparse-index.c > create mode 100644 sparse-index.h > > diff --git a/Makefile b/Makefile > index 5a239cac20e3..3bf61699238d 100644 > --- a/Makefile > +++ b/Makefile > @@ -980,6 +980,7 @@ LIB_OBJS += setup.o > LIB_OBJS += shallow.o > LIB_OBJS += sideband.o > LIB_OBJS += sigchain.o > +LIB_OBJS += sparse-index.o > LIB_OBJS += split-index.o > LIB_OBJS += stable-qsort.o > LIB_OBJS += strbuf.o > diff --git a/repo-settings.c b/repo-settings.c > index f7fff0f5ab83..d63569e4041e 100644 > --- a/repo-settings.c > +++ b/repo-settings.c > @@ -77,4 +77,12 @@ void prepare_repo_settings(struct repository *r) > UPDATE_DEFAULT_BOOL(r->settings.core_untracked_cache, UNTRACKED_CACHE_KEEP); > > UPDATE_DEFAULT_BOOL(r->settings.fetch_negotiation_algorithm, FETCH_NEGOTIATION_DEFAULT); > + > + /* > + * This setting guards all index reads to require a full index > + * over a sparse index. After suitable guards are placed in the > + * codebase around uses of the index, this setting will be > + * removed. > + */ > + r->settings.command_requires_full_index = 1; > } > diff --git a/repository.c b/repository.c > index c98298acd017..a8acae002f71 100644 > --- a/repository.c > +++ b/repository.c > @@ -10,6 +10,7 @@ > #include "object.h" > #include "lockfile.h" > #include "submodule-config.h" > +#include "sparse-index.h" > > /* The main repository */ > static struct repository the_repo; > @@ -261,6 +262,8 @@ void repo_clear(struct repository *repo) > > int repo_read_index(struct repository *repo) > { > + int res; > + > if (!repo->index) > repo->index = xcalloc(1, sizeof(*repo->index)); > > @@ -270,7 +273,13 @@ int repo_read_index(struct repository *repo) > else if (repo->index->repo != repo) > BUG("repo's index should point back at itself"); > > - return read_index_from(repo->index, repo->index_file, repo->gitdir); > + res = read_index_from(repo->index, repo->index_file, repo->gitdir); > + > + prepare_repo_settings(repo); > + if (repo->settings.command_requires_full_index) > + ensure_full_index(repo->index); > + > + return res; > } > > int repo_hold_locked_index(struct repository *repo, > diff --git a/repository.h b/repository.h > index b385ca3c94b6..e06a23015697 100644 > --- a/repository.h > +++ b/repository.h > @@ -41,6 +41,8 @@ struct repo_settings { > enum fetch_negotiation_setting fetch_negotiation_algorithm; > > int core_multi_pack_index; > + > + unsigned command_requires_full_index:1; > }; > > struct repository { > diff --git a/sparse-index.c b/sparse-index.c > new file mode 100644 > index 000000000000..82183ead563b > --- /dev/null > +++ b/sparse-index.c > @@ -0,0 +1,8 @@ > +#include "cache.h" > +#include "repository.h" > +#include "sparse-index.h" > + > +void ensure_full_index(struct index_state *istate) > +{ > + /* intentionally left blank */ > +} > diff --git a/sparse-index.h b/sparse-index.h > new file mode 100644 > index 000000000000..09a20d036c46 > --- /dev/null > +++ b/sparse-index.h > @@ -0,0 +1,7 @@ > +#ifndef SPARSE_INDEX_H__ > +#define SPARSE_INDEX_H__ > + > +struct index_state; > +void ensure_full_index(struct index_state *istate); > + > +#endif > -- > gitgitgadget >