[PATCH 07/13] tmp-objdir: absorb logic to set and restore primary sources
flat view
HOTtoday
From: Patrick Steinhardt <hidden>
Date: 2026-10-02 10:08:47
Subsystem:
the rest · Maintainer:
Linus Torvalds
The functions `odb_set_temporary_primary_source()` and `odb_restore_primary_source()` can be used to adapt the primary object database source. Nowadays though we only have a single user of this subsystem left, which is the "tmp-objdir" subsystem. Despite that, this functionality is also becoming less useful overall as alternates are becoming an implementation detail of the "files" backend. And with that change, there will only ever be a single source attached to the object database anyway. Move the logic into the "tmp-objdir" subsystem accordingly. Signed-off-by: Patrick Steinhardt <redacted> --- odb.c | 45 --------------------------------------------- odb.h | 17 ----------------- tmp-objdir.c | 38 ++++++++++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 66 deletions(-)
diff --git a/odb.c b/odb.c
index 1dc8647159..8b54271c27 100644
--- a/odb.c
+++ b/odb.c@@ -239,51 +239,6 @@ static struct odb_source *odb_add_alternate_recursively(struct object_database * return alternate; } -struct odb_source *odb_set_temporary_primary_source(struct object_database *odb, - const char *dir, int will_destroy, - struct odb_source **prev_source) -{ - struct odb_source *source; - - /* - * Make a new primary odb and link the old primary ODB in as an - * alternate - */ - source = odb_source_new(odb, dir, false); - - /* - * Disable ref updates while a temporary odb is active, since - * the objects in the database may roll back. - */ - odb->repo->disable_ref_updates = true; - source->will_destroy = will_destroy; - source->next = odb->sources; - odb->sources = source; - - if (prev_source) - *prev_source = source->next; - - return source; -} - -void odb_restore_primary_source(struct object_database *odb, - struct odb_source *restore_source, - const char *old_path) -{ - struct odb_source *cur_source = odb->sources; - - if (strcmp(old_path, cur_source->path)) - BUG("expected %s as primary object store; found %s", - old_path, cur_source->path); - - if (cur_source->next != restore_source) - BUG("we expect the old primary object store to be the first alternate"); - - odb->repo->disable_ref_updates = false; - odb->sources = restore_source; - odb_source_free(cur_source); -} - char *compute_alternate_path(const char *path, struct strbuf *err) { char *ref_git = NULL;
diff --git a/odb.h b/odb.h
index 5c86572b5d..4143812f55 100644
--- a/odb.h
+++ b/odb.h@@ -226,23 +226,6 @@ struct odb_fsck_options { */ int odb_fsck(struct object_database *odb, struct odb_fsck_options *opts); -/* - * Replace the current writable object directory with the specified temporary - * object directory and return the newly installed primary source. The former - * primary source is reported via `prev_source` when non-NULL. - */ -struct odb_source *odb_set_temporary_primary_source(struct object_database *odb, - const char *dir, int will_destroy, - struct odb_source **prev_source); - -/* - * Restore the primary source that was previously replaced by - * `odb_set_temporary_primary_source()`. - */ -void odb_restore_primary_source(struct object_database *odb, - struct odb_source *restore_source, - const char *old_path); - /* * Iterate through all alternates of the database and execute the provided * callback function for each of them. Stop iterating once the callback
diff --git a/tmp-objdir.c b/tmp-objdir.c
index deaaf6ba2e..31a7920be7 100644
--- a/tmp-objdir.c
+++ b/tmp-objdir.c@@ -51,6 +51,26 @@ static void tmp_objdir_reparent(const char *old_cwd, free(path); } +/* + * Restore the primary source that was previously replaced by + * `tmp_objdir_replace_primary_odb()`. + */ +static void tmp_objdir_restore_source(struct tmp_objdir *t) +{ + struct odb_source *cur_source = t->repo->objects->sources; + + if (strcmp(t->path.buf, cur_source->path)) + BUG("expected %s as primary object store; found %s", + t->path.buf, cur_source->path); + + if (cur_source->next != t->prev_source) + BUG("we expect the old primary object store to be the first alternate"); + + t->repo->disable_ref_updates = false; + t->repo->objects->sources = t->prev_source; + odb_source_free(cur_source); +} + int tmp_objdir_destroy(struct tmp_objdir *t) { int err;
@@ -62,7 +82,7 @@ int tmp_objdir_destroy(struct tmp_objdir *t) the_tmp_objdir = NULL; if (t->prev_source) - odb_restore_primary_source(t->repo->objects, t->prev_source, t->path.buf); + tmp_objdir_restore_source(t); err = remove_dir_recursively(&t->path, 0);
@@ -298,7 +318,7 @@ int tmp_objdir_migrate(struct tmp_objdir *t) if (t->prev_source) { if (t->repo->objects->sources->will_destroy) BUG("migrating an ODB that was marked for destruction"); - odb_restore_primary_source(t->repo->objects, t->prev_source, t->path.buf); + tmp_objdir_restore_source(t); t->prev_source = NULL; }
@@ -328,6 +348,16 @@ struct odb_source *tmp_objdir_replace_primary_odb(struct tmp_objdir *t, BUG("the primary object database is already replaced"); t->will_destroy = will_destroy; - return odb_set_temporary_primary_source(t->repo->objects, t->path.buf, - will_destroy, &t->prev_source); + /* + * Make a new primary source and link the old primary source in as an + * alternate. Disable ref updates while a temporary source is active, + * since the objects in the database may roll back. + */ + t->prev_source = t->repo->objects->sources; + t->repo->objects->sources = odb_source_new(t->repo->objects, t->path.buf, false); + t->repo->objects->sources->next = t->prev_source; + t->repo->objects->sources->will_destroy = will_destroy; + t->repo->disable_ref_updates = true; + + return t->repo->objects->sources; }
--
2.56.0.379.gc618271300.dirty