diff options
| author | Justin Tobler <jltobler@gmail.com> | 2026-07-10 11:37:19 -0500 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-07-10 13:21:53 -0700 |
| commit | 28fbc0676936e2c024f3973066bec6b2bbfed610 (patch) | |
| tree | cf89e7a6c872991a789edda1b369d750f7018912 | |
| parent | dbb3c87ee40d55a1224275de118f0ec19b60ca32 (diff) | |
odb/transaction: add transaction env interface
The ODB transaction backend is responsible for creating/managing its own
staging area for writing objects. Other child processes spawned by Git
may need access to uncommitted objects or write new objects in the
staging area though.
Introduce `odb_transaction_env()` which is expected to provide the set
of environment variables needed by a child process to access the
transaction's staging area.
Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | object-file.c | 16 | ||||
| -rw-r--r-- | odb/transaction.c | 8 | ||||
| -rw-r--r-- | odb/transaction.h | 17 |
3 files changed, 41 insertions, 0 deletions
diff --git a/object-file.c b/object-file.c index f1ec9f6a8b..7426a0c891 100644 --- a/object-file.c +++ b/object-file.c @@ -27,6 +27,7 @@ #include "path.h" #include "read-cache-ll.h" #include "setup.h" +#include "strvec.h" #include "tempfile.h" #include "tmp-objdir.h" @@ -1685,6 +1686,20 @@ static int odb_transaction_files_commit(struct odb_transaction *base) return 0; } +static int odb_transaction_files_env(struct odb_transaction *base, + struct strvec *env) +{ + struct odb_transaction_files *transaction = + container_of(base, struct odb_transaction_files, base); + int ret; + + ret = odb_transaction_files_prepare(&transaction->base); + if (!ret) + strvec_pushv(env, tmp_objdir_env(transaction->objdir)); + + return ret; +} + int odb_transaction_files_begin(struct odb_source *source, struct odb_transaction **out) { @@ -1694,6 +1709,7 @@ int odb_transaction_files_begin(struct odb_source *source, transaction->base.source = source; transaction->base.commit = odb_transaction_files_commit; transaction->base.write_object_stream = odb_transaction_files_write_object_stream; + transaction->base.env = odb_transaction_files_env; *out = &transaction->base; return 0; diff --git a/odb/transaction.c b/odb/transaction.c index 249ef4d9b7..92ec8786a1 100644 --- a/odb/transaction.c +++ b/odb/transaction.c @@ -43,3 +43,11 @@ int odb_transaction_write_object_stream(struct odb_transaction *transaction, { return transaction->write_object_stream(transaction, stream, len, oid); } + +int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env) +{ + if (!transaction) + return 0; + + return transaction->env(transaction, env); +} diff --git a/odb/transaction.h b/odb/transaction.h index 3b0a5a78e5..5e51ce5ca4 100644 --- a/odb/transaction.h +++ b/odb/transaction.h @@ -34,6 +34,14 @@ struct odb_transaction { int (*write_object_stream)(struct odb_transaction *transaction, struct odb_write_stream *stream, size_t len, struct object_id *oid); + + /* + * This callback is expected to populate the provided strvec with the + * environment variables that a child process should inherit so that its + * object writes participate in the transaction. Returns 0 on success, a + * negative error code otherwise. + */ + int (*env)(struct odb_transaction *transaction, struct strvec *env); }; /* @@ -69,4 +77,13 @@ int odb_transaction_write_object_stream(struct odb_transaction *transaction, struct odb_write_stream *stream, size_t len, struct object_id *oid); +/* + * Populates the provided strvec with the environment variables that a child + * process should inherit so that its object writes participate in the + * transaction, suitable for using via child_process.env. Returns 0 on success, + * a negative error code otherwise. Note that, if the specified transaction is + * NULL, the function is a no-op and no error is returned. + */ +int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env); + #endif |
