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>main
parent
dbb3c87ee4
commit
28fbc06769
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue