Re: [PATCH 4/7] builtin/init: move handling of "core.sharedRepository" into "setup.c"
- From
Karthik Nayak <karthik.188@gmail.com>
- Date
- Sep 28, 2026, 09:13 UTC
- Message-ID
- <CAOLa=ZRwgSZuKHKPnXXz2Voc6o6WYZpVEC+dXk_LfeRZc1R+Cw@mail.gmail.com>
- In-Reply-To
- <20260924-pks-create-repository-stateless-v1-4-11499557cf31@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
Show 28 quoted lines
> 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.
Show 37 quoted lines
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> 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.dirtyWith that context, this patch makes sense.