[PATCH 4/7] builtin/init: move handling of "core.sharedRepository" into "setup.c"
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Sep 24, 2026, 09:19 UTC
- Message-ID
- <20260924-pks-create-repository-stateless-v1-4-11499557cf31@pks.im>
- In-Reply-To
- <20260924-pks-create-repository-stateless-v1-0-11499557cf31@pks.im>
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.
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.dirty