From: Toon Claes <toon@iotcl.com>
To: Patrick Steinhardt <ps@pks.im>, git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>, Justin Tobler <jltobler@gmail.com>
Subject: Re: [PATCH v3 4/6] setup: defer object database creation
Date: Wed, 05 Aug 2026 16:21:39 +0200 [thread overview]
Message-ID: <8733ws6424.fsf@emacs.iotcl.com> (raw)
In-Reply-To: <20260805-pks-odb-create-on-disk-v3-4-c0ee3ac5141f@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
> In a subsequent commit we'll make the creation of the on-disk data
> structures of an object database pluggable. This will lead to an
> in-between state where we have already configured the repository's
> object database, but it's not usable yet until we eventually call
> `create_object_directory()`.
>
> Defer the object database creation so that we handle both steps in the
> same function.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> setup.c | 24 +++++++++++++++---------
> setup.h | 9 +++++++++
> 2 files changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/setup.c b/setup.c
> index 5dfab3e79e..d85171f3b6 100644
> --- a/setup.c
> +++ b/setup.c
> @@ -1765,8 +1765,6 @@ int apply_repository_format(struct repository *repo,
> enum apply_repository_format_flags flags,
> struct strbuf *err)
> {
> - enum odb_new_flags odb_new_flags = 0;
> -
> if (verify_repository_format(format, err) < 0)
> return -1;
>
> @@ -1801,9 +1799,12 @@ int apply_repository_format(struct repository *repo,
> repo->repository_format_precious_objects =
> format->precious_objects;
>
> - if (flags & APPLY_REPOSITORY_FORMAT_HONOR_ENV)
> - odb_new_flags |= ODB_NEW_HONOR_ENV;
> - repo->objects = odb_new(repo, odb_new_flags);
> + if (!(flags & APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION)) {
> + enum odb_new_flags odb_new_flags = 0;
> + if (flags & APPLY_REPOSITORY_FORMAT_HONOR_ENV)
> + odb_new_flags |= ODB_NEW_HONOR_ENV;
> + repo->objects = odb_new(repo, odb_new_flags);
> + }
>
> return 0;
> }
> @@ -2651,11 +2652,13 @@ static int create_default_files(struct repository *repo,
> return reinit;
> }
>
> -static void create_object_directory(struct repository *repo)
> +static void create_object_database(struct repository *repo)
> {
> struct strbuf path = STRBUF_INIT;
> size_t baselen;
>
> + repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
> +
> strbuf_addstr(&path, repo_get_object_directory(repo));
> baselen = path.len;
>
> @@ -2864,9 +2867,10 @@ int init_db(struct repository *repo,
> */
> read_and_verify_repository_format(&repo_fmt, repo_get_git_dir(repo), NULL);
> repository_format_configure(&repo_fmt, hash, ref_storage_format);
> - if (apply_repository_format(repo, &repo_fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
> + if (apply_repository_format(repo, &repo_fmt,
> + APPLY_REPOSITORY_FORMAT_HONOR_ENV |
> + APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION, &err) < 0)
> die("%s", err.buf);
> - startup_info->have_repository = 1;
>
> /*
> * Ensure `core.hidedotfiles` is processed. This must happen after we
> @@ -2882,7 +2886,9 @@ int init_db(struct repository *repo,
>
> if (!(flags & INIT_DB_SKIP_REFDB))
> create_reference_database(repo, initial_branch, flags & INIT_DB_QUIET);
> - create_object_directory(repo);
> + create_object_database(repo);
> +
> + startup_info->have_repository = 1;
>
> if (repo_settings_get_shared_repository(repo)) {
> char buf[10];
> diff --git a/setup.h b/setup.h
> index 654f10e059..e55d647b70 100644
> --- a/setup.h
> +++ b/setup.h
> @@ -241,6 +241,15 @@ enum apply_repository_format_flags {
> * relate to the object database.
> */
> APPLY_REPOSITORY_FORMAT_HONOR_ENV = (1 << 0),
> +
> + /*
> + * Usually, the object database is created after the repository format
> + * was applied. This step is skipped if this flag is set, which leaves
> + * us with a partially-working repository.
> + *
> + * This is useful when initializing a new repository.
> + */
> + APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION = (1 << 1),
> };
>
> /*
>
> --
> 2.55.0.679.g6767b8d81c.dirty
>
With [PATCH v3 3/6], Justin's objection[1] is stronger now:
> Naive question: would it be simpler to just require invoking `odb_new()`
> explicitly after `apply_repository_format()` in all cases? There doesn't
> appear to be too many callsites.
As a matter of fact, I've given this a try and see these changes on top
of this series below.
[1]: <amkXcmwzbBYsMgjc@denethor>
--- >8 ---
diff --git a/repository.c b/repository.c
index 6d633002b4..9eee74113c 100644
--- a/repository.c
+++ b/repository.c
@@ -295,6 +295,8 @@ int repo_init(struct repository *repo,
goto error;
}
+ repo->objects = odb_new(repo, 0);
+
if (worktree)
repo_set_worktree(repo, worktree);
diff --git a/setup.c b/setup.c
index af02cd965c..1106f38bb0 100644
--- a/setup.c
+++ b/setup.c
@@ -1799,13 +1799,6 @@ int apply_repository_format(struct repository *repo,
repo->repository_format_precious_objects =
format->precious_objects;
- if (!(flags & APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION)) {
- enum odb_new_flags odb_new_flags = 0;
- if (flags & APPLY_REPOSITORY_FORMAT_HONOR_ENV)
- odb_new_flags |= ODB_NEW_HONOR_ENV;
- repo->objects = odb_new(repo, odb_new_flags);
- }
-
return 0;
}
@@ -1889,6 +1882,7 @@ const char *enter_repo(struct repository *repo, const char *path, unsigned flags
read_and_verify_repository_format(&fmt, ".", NULL);
if (apply_repository_format(repo, &fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
die("%s", err.buf);
+ repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
startup_info->have_repository = 1;
clear_repository_format(&fmt);
@@ -2092,6 +2086,8 @@ const char *setup_git_directory_gently(struct repository *repo, int *nongit_ok)
APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
die("%s", err.buf);
+ repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
+
clear_repository_format(&discovery.format);
strbuf_release(&err);
}
@@ -2870,8 +2866,7 @@ int init_db(struct repository *repo,
read_and_verify_repository_format(&repo_fmt, repo_get_git_dir(repo), NULL);
repository_format_configure(&repo_fmt, hash, ref_storage_format);
if (apply_repository_format(repo, &repo_fmt,
- APPLY_REPOSITORY_FORMAT_HONOR_ENV |
- APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION, &err) < 0)
+ APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
die("%s", err.buf);
/*
diff --git a/setup.h b/setup.h
index e55d647b70..654f10e059 100644
--- a/setup.h
+++ b/setup.h
@@ -241,15 +241,6 @@ enum apply_repository_format_flags {
* relate to the object database.
*/
APPLY_REPOSITORY_FORMAT_HONOR_ENV = (1 << 0),
-
- /*
- * Usually, the object database is created after the repository format
- * was applied. This step is skipped if this flag is set, which leaves
- * us with a partially-working repository.
- *
- * This is useful when initializing a new repository.
- */
- APPLY_REPOSITORY_FORMAT_SKIP_ODB_CREATION = (1 << 1),
};
/*
next prev parent reply other threads:[~2026-08-05 14:21 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-24 3:48 [PATCH 0/5] odb: make creation of object database pluggable Patrick Steinhardt
2026-07-24 3:48 ` [PATCH 1/5] loose: load loose object map for the correct source Patrick Steinhardt
2026-07-24 17:26 ` Junio C Hamano
2026-07-28 20:14 ` Justin Tobler
2026-07-30 12:47 ` Toon Claes
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-24 3:48 ` [PATCH 2/5] setup: detangle loading of loose object maps Patrick Steinhardt
2026-07-24 18:41 ` Junio C Hamano
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-28 20:32 ` Justin Tobler
2026-07-30 14:27 ` Toon Claes
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-24 3:48 ` [PATCH 3/5] setup: defer object database creation Patrick Steinhardt
2026-07-24 18:50 ` Junio C Hamano
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-28 21:13 ` Justin Tobler
2026-08-04 7:21 ` Patrick Steinhardt
2026-08-04 7:28 ` Patrick Steinhardt
2026-07-24 3:48 ` [PATCH 4/5] odb/source: introduce function to map source type to name Patrick Steinhardt
2026-07-26 20:34 ` Junio C Hamano
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-24 3:48 ` [PATCH 5/5] odb: make creation of on-disk structures pluggable Patrick Steinhardt
2026-07-26 20:42 ` Junio C Hamano
2026-08-04 7:21 ` Patrick Steinhardt
2026-07-28 21:23 ` Justin Tobler
2026-08-04 8:29 ` [PATCH v2 0/5] odb: make creation of object database pluggable Patrick Steinhardt
2026-08-04 8:29 ` [PATCH v2 1/5] loose: load loose object map for the correct source Patrick Steinhardt
2026-08-04 8:29 ` [PATCH v2 2/5] setup: detangle loading of loose object maps Patrick Steinhardt
2026-08-04 8:29 ` [PATCH v2 3/5] setup: defer object database creation Patrick Steinhardt
2026-08-04 18:48 ` Toon Claes
2026-08-05 7:27 ` Patrick Steinhardt
2026-08-04 8:29 ` [PATCH v2 4/5] odb/source: introduce function to map source type to name Patrick Steinhardt
2026-08-04 8:29 ` [PATCH v2 5/5] odb: make creation of on-disk structures pluggable Patrick Steinhardt
2026-08-04 16:36 ` [PATCH v2 0/5] odb: make creation of object database pluggable Justin Tobler
2026-08-05 9:28 ` [PATCH v3 0/6] " Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 1/6] loose: load loose object map for the correct source Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 2/6] setup: detangle loading of loose object maps Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 3/6] setup: handle ODB-related environment variables in `odb_new()` Patrick Steinhardt
2026-08-05 13:29 ` Toon Claes
2026-08-06 6:04 ` Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 4/6] setup: defer object database creation Patrick Steinhardt
2026-08-05 14:21 ` Toon Claes [this message]
2026-08-06 6:02 ` Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 5/6] odb/source: introduce function to map source type to name Patrick Steinhardt
2026-08-05 9:28 ` [PATCH v3 6/6] odb: make creation of on-disk structures pluggable Patrick Steinhardt
2026-08-05 15:57 ` Toon Claes
2026-08-06 7:50 ` [PATCH v4 0/6] odb: make creation of object database pluggable Patrick Steinhardt
2026-08-06 7:50 ` [PATCH v4 1/6] loose: load loose object map for the correct source Patrick Steinhardt
2026-08-06 7:51 ` [PATCH v4 2/6] setup: detangle loading of loose object maps Patrick Steinhardt
2026-08-06 7:51 ` [PATCH v4 3/6] setup: handle ODB-related environment variables in `odb_new()` Patrick Steinhardt
2026-08-06 7:51 ` [PATCH v4 4/6] setup: defer object database creation Patrick Steinhardt
2026-08-06 14:23 ` Toon Claes
2026-08-06 14:54 ` Patrick Steinhardt
2026-08-06 17:39 ` Junio C Hamano
2026-08-06 7:51 ` [PATCH v4 5/6] odb/source: introduce function to map source type to name Patrick Steinhardt
2026-08-06 7:51 ` [PATCH v4 6/6] odb: make creation of on-disk structures pluggable Patrick Steinhardt
2026-08-06 14:26 ` [PATCH v4 0/6] odb: make creation of object database pluggable Toon Claes
2026-08-07 3:34 ` [PATCH v5 " Patrick Steinhardt
2026-08-07 3:34 ` [PATCH v5 1/6] loose: load loose object map for the correct source Patrick Steinhardt
2026-08-07 3:34 ` [PATCH v5 2/6] setup: detangle loading of loose object maps Patrick Steinhardt
2026-08-07 3:34 ` [PATCH v5 3/6] setup: handle ODB-related environment variables in `odb_new()` Patrick Steinhardt
2026-08-07 3:34 ` [PATCH v5 4/6] setup: defer object database creation Patrick Steinhardt
2026-08-07 4:28 ` Junio C Hamano
2026-08-07 7:16 ` Toon Claes
2026-08-07 3:34 ` [PATCH v5 5/6] odb/source: introduce function to map source type to name Patrick Steinhardt
2026-08-07 3:34 ` [PATCH v5 6/6] odb: make creation of on-disk structures pluggable Patrick Steinhardt
2026-08-07 7:17 ` [PATCH v5 0/6] odb: make creation of object database pluggable Toon Claes
2026-08-07 9:10 ` Patrick Steinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8733ws6424.fsf@emacs.iotcl.com \
--to=toon@iotcl.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.