odb: introduce odb_for_each_object()

Introduce a new function `odb_for_each_object()` that knows to iterate
through all objects part of a given object database. This function is
essentially a simple wrapper around the object database sources.

Subsequent commits will adapt callers to use this new function.

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-01-26 10:51:23 +01:00
committed by Junio C Hamano
parent 736464b84f
commit df2fbdfa55
3 changed files with 53 additions and 3 deletions

View File

@@ -139,9 +139,10 @@ int for_each_loose_object(struct object_database *odb,
/*
* Iterate through all loose objects in the given object database source and
* invoke the callback function for each of them. If given, the object info
* will be populated with the object's data as if you had called
* `odb_source_loose_read_object_info()` on the object.
* invoke the callback function for each of them. If an object info request is
* given, then the object info will be read for every individual object and
* passed to the callback as if `odb_source_loose_read_object_info()` was
* called for the object.
*/
int odb_source_loose_for_each_object(struct odb_source *source,
const struct object_info *request,

29
odb.c
View File

@@ -995,6 +995,35 @@ int odb_freshen_object(struct object_database *odb,
return 0;
}
int odb_for_each_object(struct object_database *odb,
const struct object_info *request,
odb_for_each_object_cb cb,
void *cb_data,
unsigned flags)
{
int ret;
odb_prepare_alternates(odb);
for (struct odb_source *source = odb->sources; source; source = source->next) {
if (flags & ODB_FOR_EACH_OBJECT_LOCAL_ONLY && !source->local)
continue;
if (!(flags & ODB_FOR_EACH_OBJECT_PROMISOR_ONLY)) {
ret = odb_source_loose_for_each_object(source, request,
cb, cb_data, flags);
if (ret)
return ret;
}
ret = packfile_store_for_each_object(source->packfiles, request,
cb, cb_data, flags);
if (ret)
return ret;
}
return 0;
}
void odb_assert_oid_type(struct object_database *odb,
const struct object_id *oid, enum object_type expect)
{

20
odb.h
View File

@@ -475,6 +475,26 @@ typedef int (*odb_for_each_object_cb)(const struct object_id *oid,
struct object_info *oi,
void *cb_data);
/*
* Iterate through all objects contained in the object database. Note that
* objects may be iterated over multiple times in case they are either stored
* in different backends or in case they are stored in multiple sources.
* If an object info request is given, then the object info will be read and
* passed to the callback as if `odb_read_object_info()` was called for the
* object.
*
* Returning a non-zero error code from the callback function will cause
* iteration to abort. The error code will be propagated.
*
* Returns 0 on success, a negative error code in case a failure occurred, or
* an arbitrary non-zero error code returned by the callback itself.
*/
int odb_for_each_object(struct object_database *odb,
const struct object_info *request,
odb_for_each_object_cb cb,
void *cb_data,
unsigned flags);
enum {
/*
* By default, `odb_write_object()` does not actually write anything