Thread (33 messages) 33 messages, 3 authors, 5d ago

Re: [PATCH 5/7] environment: split up concerns of `is_bare_repository_cfg`

From: Patrick Steinhardt <hidden>
Date: 2026-06-11 09:19:12

On Wed, Jun 10, 2026 at 05:22:04PM -0500, Justin Tobler wrote:
On 26/06/10 08:56AM, Patrick Steinhardt wrote:
quoted
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 52aa92fb0a..566732c9f4 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -81,7 +81,7 @@ int cmd_init_db(int argc,
 	const char *template_dir = NULL;
 	char *template_dir_to_free = NULL;
 	unsigned int flags = 0;
-	int bare = is_bare_repository_cfg;
+	int bare = startup_info->force_bare_repository ? 1 : -1;
Any particular reason to continue mapping `force_bare_repository=false`
to -1? Or was this to just minimize changes?
The `-1` value doesn't mean "false", but it rather means "undecided".
The effect of this is that "core.bare" will eventually override this.
quoted
diff --git a/setup.c b/setup.c
index 71fc6b33da..2b690da8ca 100644
--- a/setup.c
+++ b/setup.c
@@ -795,10 +795,16 @@ static int check_repository_format_gently(const char *gitdir,
 		has_common = 0;
 	}
 
-	if (!has_common) {
-		if (candidate->is_bare != -1)
-			is_bare_repository_cfg = candidate->is_bare;
-	} else {
+	if (startup_info->force_bare_repository) {
+		candidate->is_bare = 1;
+		FREE_AND_NULL(candidate->work_tree);
+	} else if (has_common) {
+		/*
+		 * When sharing a common dir with another repository (e.g. a
+		 * linked worktree), do not let this repository's config
+		 * dictate bareness; it is inherited from the main worktree.
+		 */
+		candidate->is_bare = -1;
 		FREE_AND_NULL(candidate->work_tree);
Previously, when there was a common dir, `candidate->work_tree` was left
untouched, but now we are expclicitly setting it. I'm not sure I fully
understand this change.
I cannot blame you. All of this logic is so unbelievably tangled and
hard to follow.

In any case, I think you might have missed the fact that we `else if`
branch is now `has_common` as compared to `!has_common`? To explain the
different cases a bit:

  - When we have `force_bare_repository` we are being told that the
    repository should be treated as bare. So we set `is_bare` and also
    clear the work tree that may have been discovered.

  - When we have a commondir we know that we're in a worktree.
    Previously we did nothing in this case, and that had the implicit
    effect that `is_bare_repository_cfg` would remain at `-1`. So to
    match that behaviour we have to also reset the candidate's bareness
    to `-1`, so that we parse it via the repository's configuration at a
    later point in time.

    The other part here is that we also reset `candidate->work_tree`.
    This is because the expectation is that `$GIT_DIR/common` should
    override any "core.worktree" settings. Quoting git-config(1):

        If GIT_COMMON_DIR environment variable is set, core.worktree is
        ignored and not used for determining the root of working tree.

  - When we don't have a commondir we previosuly had to also adapt the
    global `is_bare_repository_cfg` variable. This part is not necessary
    anymore, so we basically just drop this case altogether.

Patrick
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help