From: Karthik Nayak Date: Thu, 10 Sep 2026 09:24:14 GMT Subject: Re: [PATCH v4 1/9] setup: split up concerns of `init_db()` Message-ID: In-Reply-To: <20260909-pks-odb-write-alternates-at-creation-time-v4-1-d8a78ffc32e4@pks.im> Patrick Steinhardt writes: > 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 > --- > builtin/clone.c | 9 +++++---- > builtin/init-db.c | 32 ++++++++++++++++++++++++-------- > setup.c | 54 +++++++++++++++++------------------------------------- > setup.h | 45 +++++++++++++++++++++++++++++++++------------ > 4 files changed, 79 insertions(+), 61 deletions(-) > [snip] > @@ -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]