Files
git/refs/packed-backend.h
Karthik Nayak d74aacd7c4 refs: receive and use the reference storage payload
An upcoming commit will add support for providing an URI via the
'extensions.refStorage' config. The URI will contain the reference
backend and a corresponding payload. The payload can be then used for
providing an alternate locations for the reference backend.

To prepare for this, modify the existing backends to accept such an
argument when initializing via the 'init()' function. Both the files
and reftable backends will parse the information to be filesystem paths
to store references. Given that no callers pass any payload yet this is
essentially a no-op change for now.

To enable this, provide a 'refs_compute_filesystem_location()' function
which will parse the current 'gitdir' and the 'payload' to provide the
final reference directory and common reference directory (if working in
a linked worktree).

The documentation and tests will be added alongside the extension of the
config variable.

Helped-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-02-25 09:27:12 -08:00

48 lines
1.5 KiB
C

#ifndef REFS_PACKED_BACKEND_H
#define REFS_PACKED_BACKEND_H
struct repository;
struct ref_transaction;
/*
* Support for storing references in a `packed-refs` file.
*
* Note that this backend doesn't check for D/F conflicts, because it
* doesn't care about them. But usually it should be wrapped in a
* `files_ref_store` that prevents D/F conflicts from being created,
* even among packed refs.
*/
struct ref_store *packed_ref_store_init(struct repository *repo,
const char *payload,
const char *gitdir,
unsigned int store_flags);
/*
* Lock the packed-refs file for writing. Flags is passed to
* hold_lock_file_for_update(). Return 0 on success. On errors, write
* an error message to `err` and return a nonzero value.
*/
int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err);
void packed_refs_unlock(struct ref_store *ref_store);
int packed_refs_is_locked(struct ref_store *ref_store);
/*
* Obtain the size of the `packed-refs` file. Reports `0` as size in case there
* is no packed-refs file. Returns 0 on success, negative otherwise.
*/
int packed_refs_size(struct ref_store *ref_store,
size_t *out);
/*
* Return true if `transaction` really needs to be carried out against
* the specified packed_ref_store, or false if it can be skipped
* (i.e., because it is an obvious NOOP). `ref_store` must be locked
* before calling this function.
*/
int is_packed_transaction_needed(struct ref_store *ref_store,
struct ref_transaction *transaction);
#endif /* REFS_PACKED_BACKEND_H */