Files
Junio C Hamano 26e1e47b47 Merge branch 'jt/receive-pack-pluggable-writes'
The 'git receive-pack' command has been updated to use a new ODB
transaction interface for writing incoming packfiles, making it more
backend-agnostic.

* jt/receive-pack-pluggable-writes:
  odb/transaction: add transaction interface to write packfiles
  odb: return temporary ODB source when set
  builtin/receive-pack: explicitly pass packfile fd
  builtin/receive-pack: report unpack errors via strbuf
  builtin/receive-pack: lift global state out of unpack()
  builtin/receive-pack: read unpack limit config lazily
  builtin/receive-pack: pass shallow file explicitly
  odb/transaction: add transaction finalize interface
  builtin/receive-pack: properly clean up keep files
2026-08-31 08:25:00 -07:00

76 lines
1.6 KiB
C

#include "git-compat-util.h"
#include "gettext.h"
#include "odb/source.h"
#include "odb/transaction.h"
int odb_transaction_begin(struct object_database *odb,
struct odb_transaction **out,
enum odb_transaction_flags flags)
{
int ret;
if (odb->transaction)
return error(_("object database transaction already pending"));
ret = odb_source_begin_transaction(odb->sources, out, flags);
if (!ret)
odb->transaction = *out;
return ret;
}
int odb_transaction_commit(struct odb_transaction *transaction)
{
int ret;
if (!transaction)
return 0;
/*
* Ensure the transaction ending matches the pending transaction.
*/
ASSERT(transaction == transaction->source->odb->transaction);
ret = transaction->commit(transaction);
transaction->source->odb->transaction = NULL;
return ret;
}
int odb_transaction_finalize(struct odb_transaction *transaction)
{
int ret = 0;
if (!transaction)
return 0;
if (transaction->finalize)
ret = transaction->finalize(transaction);
free(transaction);
return ret;
}
int odb_transaction_write_object_stream(struct odb_transaction *transaction,
struct odb_stream *stream,
struct object_id *oid)
{
return transaction->write_object_stream(transaction, stream, oid);
}
int odb_transaction_write_pack(struct odb_transaction *transaction, int pack_fd,
struct strbuf *err_msg,
const struct odb_transaction_write_pack_opts *opts)
{
return transaction->write_pack(transaction, pack_fd, err_msg, opts);
}
int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env)
{
if (!transaction)
return 0;
return transaction->env(transaction, env);
}