Show 62 quoted lines
> @@ -151,6 +163,27 @@ struct odb_source {
> int (*read_object_stream)(struct odb_read_stream **out,
> struct odb_source *source,
> const struct object_id *oid);
> +
> + /*
> + * This callback is expected to iterate over all objects stored in this
> + * source and invoke the callback function for each of them. It is
> + * valid to yield the same object multiple time. A non-zero exit code
> + * from the object callback shall abort iteration.
> + *
> + * The optional `oi` structure shall be populated similar to how an individual
> + * call to `odb_source_read_object_info()` would have behaved. If the caller
> + * passes a `NULL` pointer then the object itself shall not be read.
> + *
> + * The callback is expected to return a negative error code in case the
> + * iteration has failed to read all objects, 0 otherwise. When the
> + * callback function returns a non-zero error code then that error code
> + * should be returned.
> + */
> + int (*for_each_object)(struct odb_source *source,
> + const struct object_info *request,
> + odb_for_each_object_cb cb,
> + void *cb_data,
> + unsigned flags);
> };
>
> /*
> @@ -233,4 +266,30 @@ static inline int odb_source_read_object_stream(struct odb_read_stream **out,
> return source->read_object_stream(out, source, oid);
> }
>
> +/*
> + * Iterate through all objects contained in the given source and invoke the
> + * callback function for each of them. Returning a non-zero code from the
> + * callback function aborts iteration. There is no guarantee that objects
> + * are only iterated over once.
> + *
> + * The optional `oi` structure shall be populated similar to how an individual
> + * call to `odb_source_read_object_info()` would have behaved. If the caller
> + * passes a `NULL` pointer then the object itself shall not be read.
> + *
> + * The flags is a bitfield of `ODB_FOR_EACH_OBJECT_*` flags. Not all flags may
> + * apply to a specific backend, so whether or not they are honored is defined
> + * by the implementation.
> + *
> + * Returns 0 when all objects have been iterated over, a negative error code in
> + * case iteration has failed, or a non-zero value returned from the callback.
> + */
> +static inline int odb_source_for_each_object(struct odb_source *source,
> + const struct object_info *request,
> + odb_for_each_object_cb cb,
> + void *cb_data,
> + unsigned flags)
> +{
> + return source->for_each_object(source, request, cb, cb_data, flags);
> +}
> +
> #endif
>
> --
> 2.53.0.536.g309c995771.dirty