From: Karthik Nayak Date: Mon, 28 Sep 2026 09:13:31 GMT Subject: Re: [PATCH 4/7] builtin/init: move handling of "core.sharedRepository" into "setup.c" Message-ID: In-Reply-To: <20260924-pks-create-repository-stateless-v1-4-11499557cf31@pks.im> Patrick Steinhardt writes: > When initializing a new repository via git-init(1) we know to honor > "core.sharedRepository" and adjust permissions of newly created files > accordingly. The way we propagate that setting is quite awkward though, > as we have to set it on the repository that we pass into > `create_repository()` and pass it as a parameter. This is because there > are two different scopes in play here: > > - We need to apply it to the repository so that creating the > repository's directory uses the correct permissions. > > - We need to reapply it to the repository after we have created > default files so that we know to override any configuration that we > have read from the new repository's configuration. > > The effect of this though is that the repository works as an in-out > parameter, which is quite awkward. > > Refactor the code so that the caller only needs to pass the value. > Starting with this change, the passed-in repository can essentially be > completely blank as it doesn't carry any state anymore that we'd care > about in `create_repository()`. > > Note that this change in theory also impacts the other caller of > `create_repository()` that exists in git-clone(1). But that caller > already passes `-1` as a value for this parameter, and neither does that > caller modify the repository it passes. So there shouldn't be any change > in behaviour here. > So this works, becaus we already pass in the `init_shared_repository` value to `create_repository()`. Which is currently used while creating the default files, now we also extend it to set the adequate permissions on the repository too. > Signed-off-by: Patrick Steinhardt > --- > builtin/init-db.c | 3 --- > setup.c | 3 +++ > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/builtin/init-db.c b/builtin/init-db.c > index e45268f1ff..34215bbf18 100644 > --- a/builtin/init-db.c > +++ b/builtin/init-db.c > @@ -171,9 +171,6 @@ int cmd_init_db(int argc, > die(_("unknown ref storage format '%s'"), ref_format); > } > > - if (init_shared_repository != -1) > - repo_settings_set_shared_repository(the_repository, init_shared_repository); > - > /* > * GIT_WORK_TREE makes sense only in conjunction with GIT_DIR > * without --bare. Catch the error early. > diff --git a/setup.c b/setup.c > index f335111d1e..0d0a4abbe6 100644 > --- a/setup.c > +++ b/setup.c > @@ -2896,6 +2896,9 @@ void create_repository(struct repository *repo, > */ > repo_config(repo, git_default_core_config, NULL); > > + if (init_shared_repository != -1) > + repo_settings_set_shared_repository(repo, init_shared_repository); > + > safe_create_dir(repo, git_dir, 0); > > if (!reinit_ok) > > -- > 2.56.0.rc2.329.gd58861e689.dirty With that context, this patch makes sense.