[PATCH 17/17] odb/source: make `begin_transaction()` function pluggable
From: Patrick Steinhardt <hidden>
Date: 2026-02-23 16:18:56
Subsystem:
the rest · Maintainer:
Linus Torvalds
Introduce a new callback function in `struct odb_source` to make the function pluggable. Signed-off-by: Patrick Steinhardt <redacted> --- odb/source-files.c | 11 +++++++++++ odb/source.h | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+)
diff --git a/odb/source-files.c b/odb/source-files.c
index c32cd67b26..14cb9adeca 100644
--- a/odb/source-files.c
+++ b/odb/source-files.c@@ -122,6 +122,16 @@ static int odb_source_files_write_object_stream(struct odb_source *source, return odb_source_loose_write_stream(source, stream, len, oid); } +static int odb_source_files_begin_transaction(struct odb_source *source, + struct odb_transaction **out) +{ + struct odb_transaction *tx = odb_transaction_files_begin(source); + if (!tx) + return -1; + *out = tx; + return 0; +} + static int odb_source_files_read_alternates(struct odb_source *source, struct strvec *out) {
@@ -213,6 +223,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb, 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; + files->base.begin_transaction = odb_source_files_begin_transaction; files->base.read_alternates = odb_source_files_read_alternates; files->base.write_alternate = odb_source_files_write_alternate;
diff --git a/odb/source.h b/odb/source.h
index cf301679da..0e99052e08 100644
--- a/odb/source.h
+++ b/odb/source.h@@ -54,6 +54,7 @@ enum object_info_flags { struct object_id; struct object_info; struct odb_read_stream; +struct odb_transaction; struct odb_write_stream; struct strvec;
@@ -231,6 +232,19 @@ struct odb_source { struct odb_write_stream *stream, size_t len, struct object_id *oid); + /* + * This callback is expected to create a new transaction that can be + * used to write objects to. The objects shall only be persisted into + * the object database when the transcation's commit function is + * called. Otherwise, the objects shall be discarded. + * + * Returns 0 on success, in which case the `*out` pointer will have + * been populated with the object database transaction. Returns a + * negative error code otherwise. + */ + int (*begin_transaction)(struct odb_source *source, + struct odb_transaction **out); + /* * This callback is expected to read the list of alternate object * database sources connected to it and write them into the `strvec`.
@@ -434,4 +448,17 @@ static inline int odb_source_write_alternate(struct odb_source *source, return source->write_alternate(source, alternate); } +/* + * Create a new transaction that can be used to write objects into a temporary + * staging area. The objects will only be persisted when the transaction is + * committed. + * + * Returns 0 on success, a negative error code otherwise. + */ +static inline int odb_source_begin_transaction(struct odb_source *source, + struct odb_transaction **out) +{ + return source->begin_transaction(source, out); +} + #endif
--
2.53.0.536.g309c995771.dirty