setup: defer object database creation

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()`.

Lift the call to `odb_new()` out of `apply_repository_format()` so that
callers have more wiggle room with when exactly they call it, and adapt
them accordingly. The only exception is `init_db()`, where we now defer
creating the object database until we call `create_object_database()`.

With this change, initializing and creating the object database on disk
is now neatly encapsulated in a single function, which will make it
easier for a subsequent commit to move creation of the on-disk data
structures into the `struct odb_source` backends.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Patrick Steinhardt 2026-08-07 05:34:28 +02:00 committed by Junio C Hamano
parent 30bc6f0e8c
commit c1d233bd30
3 changed files with 11 additions and 11 deletions

View File

@ -294,6 +294,7 @@ int repo_init(struct repository *repo,
warning("%s", err.buf); warning("%s", err.buf);
goto error; goto error;
} }
repo->objects = odb_new(repo, 0);


if (worktree) if (worktree)
repo_set_worktree(repo, worktree); repo_set_worktree(repo, worktree);

17
setup.c
View File

@ -1765,8 +1765,6 @@ int apply_repository_format(struct repository *repo,
enum apply_repository_format_flags flags, enum apply_repository_format_flags flags,
struct strbuf *err) struct strbuf *err)
{ {
enum odb_new_flags odb_new_flags = 0;

if (verify_repository_format(format, err) < 0) if (verify_repository_format(format, err) < 0)
return -1; return -1;


@ -1801,10 +1799,6 @@ int apply_repository_format(struct repository *repo,
repo->repository_format_precious_objects = repo->repository_format_precious_objects =
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);

return 0; return 0;
} }


@ -1888,6 +1882,7 @@ const char *enter_repo(struct repository *repo, const char *path, unsigned flags
read_and_verify_repository_format(&fmt, ".", NULL); read_and_verify_repository_format(&fmt, ".", NULL);
if (apply_repository_format(repo, &fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0) if (apply_repository_format(repo, &fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
die("%s", err.buf); die("%s", err.buf);
repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
startup_info->have_repository = 1; startup_info->have_repository = 1;


clear_repository_format(&fmt); clear_repository_format(&fmt);
@ -2090,6 +2085,7 @@ const char *setup_git_directory_gently(struct repository *repo, int *nongit_ok)
if (apply_repository_format(repo, &discovery.format, if (apply_repository_format(repo, &discovery.format,
APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0) APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
die("%s", err.buf); die("%s", err.buf);
repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);


clear_repository_format(&discovery.format); clear_repository_format(&discovery.format);
strbuf_release(&err); strbuf_release(&err);
@ -2651,11 +2647,13 @@ static int create_default_files(struct repository *repo,
return reinit; return reinit;
} }


static void create_object_directory(struct repository *repo) static void create_object_database(struct repository *repo)
{ {
struct strbuf path = STRBUF_INIT; struct strbuf path = STRBUF_INIT;
size_t baselen; size_t baselen;


repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);

strbuf_addstr(&path, repo_get_object_directory(repo)); strbuf_addstr(&path, repo_get_object_directory(repo));
baselen = path.len; baselen = path.len;


@ -2866,7 +2864,6 @@ int init_db(struct repository *repo,
repository_format_configure(&repo_fmt, hash, ref_storage_format); 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, &err) < 0)
die("%s", err.buf); die("%s", err.buf);
startup_info->have_repository = 1;


/* /*
* Ensure `core.hidedotfiles` is processed. This must happen after we * Ensure `core.hidedotfiles` is processed. This must happen after we
@ -2882,7 +2879,9 @@ int init_db(struct repository *repo,


if (!(flags & INIT_DB_SKIP_REFDB)) if (!(flags & INIT_DB_SKIP_REFDB))
create_reference_database(repo, initial_branch, flags & INIT_DB_QUIET); 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)) { if (repo_settings_get_shared_repository(repo)) {
char buf[10]; char buf[10];

View File

@ -245,8 +245,8 @@ enum apply_repository_format_flags {


/* /*
* Apply the given repository format to the repo. This initializes extensions * Apply the given repository format to the repo. This initializes extensions
* and basic data structures required for normal operation. Returns 0 on * required for normal operation. Returns 0 on success, a negative error code
* success, a negative error code when the format is not valid as determined by * when the format is not valid as determined by
* `verify_repository_format()`. * `verify_repository_format()`.
*/ */
int apply_repository_format(struct repository *repo, int apply_repository_format(struct repository *repo,