Re: [PATCH 01/44] repository: initialize the_repository in main()
- From
- Brandon Williams <bmwill@google.com>
- Date
- Mar 21, 2018, 21:46 UTC
- Message-ID
- <20180321214606.GA18406@google.com>
- In-Reply-To
- <20180303113637.26518-2-pclouds@gmail.com>
On 03/03, Nguyễn Thái Ngọc Duy wrote:
Show 48 quoted lines
> This simplifies initialization of struct repository and anything
> inside. Easier to read. Easier to add/remove fields.
>
> Everything will go through main() common-main.c so this should cover all
> programs, including t/helper.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> common-main.c | 2 ++
> repository.c | 18 +++++++++++++-----
> repository.h | 2 +-
> 3 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/common-main.c b/common-main.c
> index 6a689007e7..7d716d5a54 100644
> --- a/common-main.c
> +++ b/common-main.c
> @@ -34,6 +34,8 @@ int main(int argc, const char **argv)
>
> git_setup_gettext();
>
> + initialize_the_repository();
> +
> attr_start();
>
> git_extract_argv0_path(argv[0]);
> diff --git a/repository.c b/repository.c
> index 4ffbe9bc94..0eddf28fcd 100644
> --- a/repository.c
> +++ b/repository.c
> @@ -4,10 +4,16 @@
> #include "submodule-config.h"
>
> /* The main repository */
> -static struct repository the_repo = {
> - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &the_index, &hash_algos[GIT_HASH_SHA1], 0, 0
> -};
> -struct repository *the_repository = &the_repo;
> +static struct repository the_repo;
> +struct repository *the_repository;
> +
> +void initialize_the_repository(void)
> +{
> + the_repository = &the_repo;
> +
> + the_repo.index = &the_index;
> + repo_set_hash_algo(&the_repo, GIT_HASH_SHA1);
> +}Nice, one place to do all the crazy initialization for the_repo. I wanted to do something like this when I introduced the repository but I shied away from it because it didn't seem like the right thing to do at the time. Now that its grown a bit, its definitely the right move until using the repository object is ubiquitous enough that the setup code can produce a repository struct instead of relying on a global one.
Show 23 quoted lines
>
> static char *git_path_from_env(const char *envvar, const char *git_dir,
> const char *path, int fromenv)
> @@ -128,7 +134,9 @@ static int read_and_verify_repository_format(struct repository_format *format,
> * Initialize 'repo' based on the provided 'gitdir'.
> * Return 0 upon success and a non-zero value upon failure.
> */
> -int repo_init(struct repository *repo, const char *gitdir, const char *worktree)
> +static int repo_init(struct repository *repo,
> + const char *gitdir,
> + const char *worktree)
> {
> struct repository_format format;
> memset(repo, 0, sizeof(*repo));
> diff --git a/repository.h b/repository.h
> index 0329e40c7f..40c1c81bdc 100644
> --- a/repository.h
> +++ b/repository.h
> @@ -91,7 +91,7 @@ extern struct repository *the_repository;
> extern void repo_set_gitdir(struct repository *repo, const char *path);
> extern void repo_set_worktree(struct repository *repo, const char *path);
> extern void repo_set_hash_algo(struct repository *repo, int algo);
> -extern int repo_init(struct repository *repo, const char *gitdir, const char *worktree);I had to double check that this was ok, it indeed is as repo_init is only used in repository.c.
Show 7 quoted lines
> +extern void initialize_the_repository(void); > extern int repo_submodule_init(struct repository *submodule, > struct repository *superproject, > const char *path); > -- > 2.16.1.435.g8f24da2e1a >
-- Brandon Williams