@@ -20,6 +20,16 @@ void initialize_the_repository(void)
repo_set_hash_algo(&the_repo, GIT_HASH_SHA1);
}
+struct repository *get_the_repository(void)
+{
+ struct repository *r = the_repository;
+
+ if (getenv("GIT_NO_THE_REPOSITORY"))
+ the_repository = NULL;
+
+ return r;
+}
+
static void expand_base_dir(char **out, const char *in,
const char *base_dir, const char *def_in)
{
@@ -114,13 +114,24 @@ void repo_set_gitdir(struct repository *repo, const char *root,
const struct set_gitdir_args *extra_args);
void repo_set_worktree(struct repository *repo, const char *path);
void repo_set_hash_algo(struct repository *repo, int algo);
-void initialize_the_repository(void);
int repo_init(struct repository *r, const char *gitdir, const char *worktree);
int repo_submodule_init(struct repository *submodule,
struct repository *superproject,
const char *path);
void repo_clear(struct repository *repo);
+/*
+ * Initializes the repository 'the_repository', which is used in the transition
+ * phase of moving globals into the repository struct.
+ */
+void initialize_the_repository(void);
+
+/*
+ * To be called once; after the call use only returned repository, and do not
+ * use the_repository any more
+ */
+struct repository *get_the_repository(void);
+
/*
* Populates the repository's index from its index_file, an index struct will
* be allocated if needed.
The struct 'the_repo' contains all data that of the main repository. As we move more and more globals into this struct, the usual way of accessing these is using 'the_repository', which can be used as a drop in replacement for accessing the migrated globals. However during the migration of globals into the repository object, it is not clear if some code path rely on the_repository or can work on an arbitrary repository (as we'd eventually want for submodules) due to the excessive use of the_repository throughout the code base. To address this, introduce a function 'get_the_repository(void)' which will return the main repository and set the_repository to NULL when the environment variable GIT_NO_THE_REPOSITORY is set. This function is to be strictly used only at the beginning of builtin command to assign it to a local repository pointer that we'll use to pass through the code base. By having the possibility to set the_repository to NULL, we'll get a segfault when we try to access the_repository instead of using the handle that we pass around. This approach let's us have the_repository in the setup code, which in its current form is not yet able to transition into a world where the repository handle is passed around and only test the passing around of the repository handle for later stage code. Eventually in the future the setup code will produce the repository handle and each 'cmd_foo(int argc, char **argv)' builtin would get the repository via an additional parameter. Signed-off-by: Stefan Beller <sbeller@google.com> --- repository.c | 10 ++++++++++ repository.h | 13 ++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-)