odb/source: make reprepare() function pluggable

Introduce a new callback function in `struct odb_source` to make the
function pluggable.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2026-02-23 17:17:58 +01:00
committed by Junio C Hamano
parent b24837e932
commit ae48509378
3 changed files with 27 additions and 5 deletions

7
odb.c
View File

@@ -1119,11 +1119,8 @@ void odb_reprepare(struct object_database *o)
o->loaded_alternates = 0;
odb_prepare_alternates(o);
for (source = o->sources; source; source = source->next) {
struct odb_source_files *files = odb_source_files_downcast(source);
odb_source_loose_reprepare(source);
packfile_store_reprepare(files->packed);
}
for (source = o->sources; source; source = source->next)
odb_source_reprepare(source);
o->approximate_object_count_valid = 0;

View File

@@ -28,6 +28,13 @@ static void odb_source_files_free(struct odb_source *source)
free(files);
}
static void odb_source_files_reprepare(struct odb_source *source)
{
struct odb_source_files *files = odb_source_files_downcast(source);
odb_source_loose_reprepare(&files->base);
packfile_store_reprepare(files->packed);
}
struct odb_source_files *odb_source_files_new(struct object_database *odb,
const char *path,
bool local)
@@ -40,6 +47,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb,
files->packed = packfile_store_new(&files->base);
files->base.free = odb_source_files_free;
files->base.reprepare = odb_source_files_reprepare;
/*
* Ideally, we would only ever store absolute paths in the source. This

View File

@@ -58,6 +58,13 @@ struct odb_source {
* all associated resources. The function will never be called with a NULL pointer.
*/
void (*free)(struct odb_source *source);
/*
* This callback is expected to clear underlying caches of the object
* database source. The function is called when the repository has for
* example just been repacked so that new objects will become visible.
*/
void (*reprepare)(struct odb_source *source);
};
/*
@@ -97,4 +104,14 @@ void odb_source_free(struct odb_source *source);
*/
void odb_source_release(struct odb_source *source);
/*
* Reprepare the object database source and clear any caches. Depending on the
* backend used this may have the effect that concurrently-written objects
* become visible.
*/
static inline void odb_source_reprepare(struct odb_source *source)
{
source->reprepare(source);
}
#endif