]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb/source: make `write_object_stream()` function pluggable
authorPatrick Steinhardt <ps@pks.im>
Thu, 5 Mar 2026 14:19:54 +0000 (15:19 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Mar 2026 19:45:16 +0000 (11:45 -0800)
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>
odb.c
odb/source-files.c
odb/source.h

diff --git a/odb.c b/odb.c
index 5eb60063dcc6f3437ad8d8b5f0e3e6563efdb2cc..f439de9db287bee80dbad6893c91f7af7c23bc1c 100644 (file)
--- a/odb.c
+++ b/odb.c
@@ -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,
index 67c2aff659c47efe3abb0271267e888f4aa2bce5..b8844f11b7fab2be730fd7d1e7093d3d3fe76f00 100644 (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
index c959e962f6cd894bd30c28c39f60acf666965c65..6c8bec19126e6a83b95a73ebce21ec2194708c89 100644 (file)
@@ -53,6 +53,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,
@@ -218,6 +219,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);
 };
 
 /*
@@ -356,4 +369,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