odb: get rid of the_repository when handling the primary source

The functions `set_temporary_primary_odb()` and `restore_primary_odb()`
are responsible for managing a temporary primary source for the
database. Both of these functions implicitly rely on `the_repository`.

Refactor them to instead take an explicit object database parameter as
argument and adjust callers. Rename the functions accordingly.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2025-07-01 14:22:22 +02:00
committed by Junio C Hamano
parent 798c661ce3
commit 7eafd4472d
3 changed files with 36 additions and 27 deletions

27
odb.c
View File

@@ -329,7 +329,8 @@ void odb_add_to_alternates_memory(struct object_database *odb,
'\n', NULL, 0); '\n', NULL, 0);
} }
struct odb_source *set_temporary_primary_odb(const char *dir, int will_destroy) struct odb_source *odb_set_temporary_primary_source(struct object_database *odb,
const char *dir, int will_destroy)
{ {
struct odb_source *source; struct odb_source *source;
@@ -337,14 +338,14 @@ struct odb_source *set_temporary_primary_odb(const char *dir, int will_destroy)
* Make sure alternates are initialized, or else our entry may be * Make sure alternates are initialized, or else our entry may be
* overwritten when they are. * overwritten when they are.
*/ */
odb_prepare_alternates(the_repository->objects); odb_prepare_alternates(odb);
/* /*
* Make a new primary odb and link the old primary ODB in as an * Make a new primary odb and link the old primary ODB in as an
* alternate * alternate
*/ */
source = xcalloc(1, sizeof(*source)); source = xcalloc(1, sizeof(*source));
source->odb = the_repository->objects; source->odb = odb;
source->path = xstrdup(dir); source->path = xstrdup(dir);
/* /*
@@ -353,8 +354,8 @@ struct odb_source *set_temporary_primary_odb(const char *dir, int will_destroy)
*/ */
source->disable_ref_updates = 1; source->disable_ref_updates = 1;
source->will_destroy = will_destroy; source->will_destroy = will_destroy;
source->next = the_repository->objects->sources; source->next = odb->sources;
the_repository->objects->sources = source; odb->sources = source;
return source->next; return source->next;
} }
@@ -366,19 +367,21 @@ static void free_object_directory(struct odb_source *source)
free(source); free(source);
} }
void restore_primary_odb(struct odb_source *restore_alt, const char *old_path) void odb_restore_primary_source(struct object_database *odb,
struct odb_source *restore_source,
const char *old_path)
{ {
struct odb_source *cur_alt = the_repository->objects->sources; struct odb_source *cur_source = odb->sources;
if (strcmp(old_path, cur_alt->path)) if (strcmp(old_path, cur_source->path))
BUG("expected %s as primary object store; found %s", BUG("expected %s as primary object store; found %s",
old_path, cur_alt->path); old_path, cur_source->path);
if (cur_alt->next != restore_alt) if (cur_source->next != restore_source)
BUG("we expect the old primary object store to be the first alternate"); BUG("we expect the old primary object store to be the first alternate");
the_repository->objects->sources = restore_alt; odb->sources = restore_source;
free_object_directory(cur_alt); free_object_directory(cur_source);
} }
char *compute_alternate_path(const char *path, struct strbuf *err) char *compute_alternate_path(const char *path, struct strbuf *err)

26
odb.h
View File

@@ -73,17 +73,6 @@ struct odb_source {
char *path; char *path;
}; };
/*
* Replace the current writable object directory with the specified temporary
* object directory; returns the former primary object directory.
*/
struct odb_source *set_temporary_primary_odb(const char *dir, int will_destroy);
/*
* Restore a previous ODB replaced by set_temporary_main_odb.
*/
void restore_primary_odb(struct odb_source *restore_alternate, const char *old_path);
struct packed_git; struct packed_git;
struct multi_pack_index; struct multi_pack_index;
struct cached_object_entry; struct cached_object_entry;
@@ -187,6 +176,21 @@ void odb_clear(struct object_database *o);
*/ */
struct odb_source *odb_find_source(struct object_database *odb, const char *obj_dir); struct odb_source *odb_find_source(struct object_database *odb, const char *obj_dir);
/*
* Replace the current writable object directory with the specified temporary
* object directory; returns the former primary source.
*/
struct odb_source *odb_set_temporary_primary_source(struct object_database *odb,
const char *dir, int will_destroy);
/*
* 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 * Iterate through all alternates of the database and execute the provided
* callback function for each of them. Stop iterating once the callback * callback function for each of them. Stop iterating once the callback

View File

@@ -47,7 +47,7 @@ int tmp_objdir_destroy(struct tmp_objdir *t)
the_tmp_objdir = NULL; the_tmp_objdir = NULL;
if (t->prev_source) if (t->prev_source)
restore_primary_odb(t->prev_source, t->path.buf); odb_restore_primary_source(t->repo->objects, t->prev_source, t->path.buf);
err = remove_dir_recursively(&t->path, 0); err = remove_dir_recursively(&t->path, 0);
@@ -279,7 +279,7 @@ int tmp_objdir_migrate(struct tmp_objdir *t)
if (t->prev_source) { if (t->prev_source) {
if (t->repo->objects->sources->will_destroy) if (t->repo->objects->sources->will_destroy)
BUG("migrating an ODB that was marked for destruction"); BUG("migrating an ODB that was marked for destruction");
restore_primary_odb(t->prev_source, t->path.buf); odb_restore_primary_source(t->repo->objects, t->prev_source, t->path.buf);
t->prev_source = NULL; t->prev_source = NULL;
} }
@@ -311,7 +311,8 @@ void tmp_objdir_replace_primary_odb(struct tmp_objdir *t, int will_destroy)
{ {
if (t->prev_source) if (t->prev_source)
BUG("the primary object database is already replaced"); BUG("the primary object database is already replaced");
t->prev_source = set_temporary_primary_odb(t->path.buf, will_destroy); t->prev_source = odb_set_temporary_primary_source(t->repo->objects,
t->path.buf, will_destroy);
t->will_destroy = will_destroy; t->will_destroy = will_destroy;
} }
@@ -320,7 +321,8 @@ struct tmp_objdir *tmp_objdir_unapply_primary_odb(void)
if (!the_tmp_objdir || !the_tmp_objdir->prev_source) if (!the_tmp_objdir || !the_tmp_objdir->prev_source)
return NULL; return NULL;
restore_primary_odb(the_tmp_objdir->prev_source, the_tmp_objdir->path.buf); odb_restore_primary_source(the_tmp_objdir->repo->objects,
the_tmp_objdir->prev_source, the_tmp_objdir->path.buf);
the_tmp_objdir->prev_source = NULL; the_tmp_objdir->prev_source = NULL;
return the_tmp_objdir; return the_tmp_objdir;
} }