odb/source: make write_object_stream() 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:18:05 +01:00
committed by Junio C Hamano
parent bf6737bcd5
commit 15e787477b
3 changed files with 38 additions and 1 deletions

2
odb.c
View File

@@ -1013,7 +1013,7 @@ int odb_write_object_stream(struct object_database *odb,
struct odb_write_stream *stream, size_t len,
struct object_id *oid)
{
return odb_source_loose_write_stream(odb->sources, stream, len, oid);
return odb_source_write_object_stream(odb->sources, stream, len, oid);
}
struct object_database *odb_new(struct repository *repo,

View File

@@ -109,6 +109,14 @@ static int odb_source_files_write_object(struct odb_source *source,
oid, compat_oid, flags);
}
static int odb_source_files_write_object_stream(struct odb_source *source,
struct odb_write_stream *stream,
size_t len,
struct object_id *oid)
{
return odb_source_loose_write_stream(source, stream, len, oid);
}
struct odb_source_files *odb_source_files_new(struct object_database *odb,
const char *path,
bool local)
@@ -128,6 +136,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb,
files->base.for_each_object = odb_source_files_for_each_object;
files->base.freshen_object = odb_source_files_freshen_object;
files->base.write_object = odb_source_files_write_object;
files->base.write_object_stream = odb_source_files_write_object_stream;
/*
* Ideally, we would only ever store absolute paths in the source. This

View File

@@ -54,6 +54,7 @@ enum object_info_flags {
struct object_id;
struct object_info;
struct odb_read_stream;
struct odb_write_stream;
/*
* A callback function that can be used to iterate through objects. If given,
@@ -216,6 +217,18 @@ struct odb_source {
struct object_id *oid,
struct object_id *compat_oid,
unsigned flags);
/*
* This callback is expected to persist the given object stream into
* the object source.
*
* The resulting object ID shall be written into the out pointer. The
* callback is expected to return 0 on success, a negative error code
* otherwise.
*/
int (*write_object_stream)(struct odb_source *source,
struct odb_write_stream *stream, size_t len,
struct object_id *oid);
};
/*
@@ -351,4 +364,19 @@ static inline int odb_source_write_object(struct odb_source *source,
compat_oid, flags);
}
/*
* Write an object into the object database source via a stream. The overall
* length of the object must be known in advance.
*
* Return 0 on success, a negative error code otherwise. Populates the given
* out pointer for the object ID.
*/
static inline int odb_source_write_object_stream(struct odb_source *source,
struct odb_write_stream *stream,
size_t len,
struct object_id *oid)
{
return source->write_object_stream(source, stream, len, oid);
}
#endif