Re: [PATCH v4 1/9] setup: split up concerns of `init_db()`
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Sep 10, 2026, 09:24 UTC
- Message-ID
- <CAOLa=ZQy1G9ZH0abH1uJZ0t1H5B7b3ym_s_gUAs03FiAend9Lw@mail.gmail.com>
- In-Reply-To
- <20260909-pks-odb-write-alternates-at-creation-time-v4-1-d8a78ffc32e4@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
Show 54 quoted lines
> The function `init_db()` is responsible for creating the on-disk > directory structure required for a Git repository. It is used by both > git-init(1) and git-clone(1), and because their expected behaviour is > different we support a couple of flags: > > - The `QUIET` flag controls whether the command is quiet or not. For > git-init(1) this is user-controllable, whereas for git-clone(1) > we're always quiet. > > - The `EXIST_OK` flag controls whether a preexisting repository is > okay or not. For git-init(1) it is, for git-clone(1) it's not. > > - The `SKIP_REFDB` flag controls whether the reference database should > already be created or not. For git-init(1) we do, but for > git-clone(1) we don't because it does not yet know about the default > branch and about the remote object hash. > > Furthermore, we're about to add another divergence in behaviour, where > we have to also skip creation of the object database in git-clone(1). > This is becoming quite cumbersome though. > > Instead of introducing another flag, start to split up concerns of the > function so that we never create the reference or object database. This > becomes the responsibility of the caller, which is thus free to defer > their creation to a later point in time. This lets us get rid of most of > the divergent behaviour: > > - We don't need the `SKIP_REFDB` and a potential `SKIP_ODB` flags > anymore. > > - We don't need the `QUIET` flag anymore, as nothing prints output > except for the final status message that tells the user that the > repository has been (re)initialized. But as this message is specific > to git-init(1), we can easily move it there. > > The only piece of information we still have to convey is whether or not > reinitialization of a preexisting repository is okay. This is handled by > a new `reinit_ok` pointer that, if non-`NULL`, indicates that it is okay > to reinitialize the repository. Furthermore, the pointer will be written > to to indicate whether the repository was reinitialized or not, which we > need in git-init(1) to print the correct initialization message. > > With these refactorings, `init_db()` is named quite misleadingly though, > as we don't create any of the reference or object databases anymore. > Rename it to `create_repository()`. > > Signed-off-by: Patrick Steinhardt <ps@pks.im> > --- > builtin/clone.c | 9 +++++---- > builtin/init-db.c | 32 ++++++++++++++++++++++++-------- > setup.c | 54 +++++++++++++++++------------------------------------- > setup.h | 45 +++++++++++++++++++++++++++++++++------------ > 4 files changed, 79 insertions(+), 61 deletions(-) >
[snip]
Show 38 quoted lines
> @@ -2877,8 +2877,10 @@ int init_db(struct repository *repo,
>
> safe_create_dir(repo, git_dir, 0);
>
> - reinit = create_default_files(repo, template_dir, original_git_dir,
> - &repo_fmt, init_shared_repository);
> + if (!reinit_ok)
> + reinit_ok = &reinit_ignored;
> + *reinit_ok = create_default_files(repo, template_dir, original_git_dir,
> + &repo_fmt, init_shared_repository);
>
> if (repo_settings_get_shared_repository(repo)) {
> char buf[10];
> @@ -2901,29 +2903,7 @@ int init_db(struct repository *repo,
> repo_config_set(repo, "receive.denyNonFastforwards", "true");
> }
>
> - if (!(flags & INIT_DB_SKIP_REFDB))
> - create_reference_database(repo, initial_branch, flags & INIT_DB_QUIET);
> - create_object_database(repo);
> -
> - startup_info->have_repository = 1;
> -
> - if (!(flags & INIT_DB_QUIET)) {
> - int len = strlen(git_dir);
> -
> - if (reinit)
> - printf(repo_settings_get_shared_repository(repo)
> - ? _("Reinitialized existing shared Git repository in %s%s\n")
> - : _("Reinitialized existing Git repository in %s%s\n"),
> - git_dir, len && git_dir[len-1] != '/' ? "/" : "");
> - else
> - printf(repo_settings_get_shared_repository(repo)
> - ? _("Initialized empty shared Git repository in %s%s\n")
> - : _("Initialized empty Git repository in %s%s\n"),
> - git_dir, len && git_dir[len-1] != '/' ? "/" : "");
> - }
> -I was wondering if the order of initialization changes with the move, but it stays the same. So all the changes look good.
[snip]