Message ID | 01da4c48a1fa94188faf45ab1e23b98ecb4164d5.1614111270.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Sparse Index: Design, Format, Tests | expand |
On Tue, Feb 23, 2021 at 12:14 PM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote: > > From: Derrick Stolee <dstolee@microsoft.com> > > 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@microsoft.com> > --- > 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 >
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