Merge branch 'rs/ref-transaction-1'
The second batch of the transactional ref update series. * rs/ref-transaction-1: (22 commits) update-ref --stdin: pass transaction around explicitly update-ref --stdin: narrow scope of err strbuf refs.c: make delete_ref use a transaction refs.c: make prune_ref use a transaction to delete the ref refs.c: remove lock_ref_sha1 refs.c: remove the update_ref_write function refs.c: remove the update_ref_lock function refs.c: make lock_ref_sha1 static walker.c: use ref transaction for ref updates fast-import.c: use a ref transaction when dumping tags receive-pack.c: use a reference transaction for updating the refs refs.c: change update_ref to use a transaction branch.c: use ref transaction for all ref updates fast-import.c: change update_branch to use ref transactions sequencer.c: use ref transactions for all ref updates commit.c: use ref transactions for updates replace.c: use the ref transaction functions for updates tag.c: use ref transactions when doing updates refs.c: add transaction.status and track OPEN/CLOSED refs.c: make ref_transaction_begin take an err argument ...
This commit is contained in:
77
refs.h
77
refs.h
@ -10,6 +10,38 @@ struct ref_lock {
|
||||
int force_write;
|
||||
};
|
||||
|
||||
/*
|
||||
* A ref_transaction represents a collection of ref updates
|
||||
* that should succeed or fail together.
|
||||
*
|
||||
* Calling sequence
|
||||
* ----------------
|
||||
* - Allocate and initialize a `struct ref_transaction` by calling
|
||||
* `ref_transaction_begin()`.
|
||||
*
|
||||
* - List intended ref updates by calling functions like
|
||||
* `ref_transaction_update()` and `ref_transaction_create()`.
|
||||
*
|
||||
* - Call `ref_transaction_commit()` to execute the transaction.
|
||||
* If this succeeds, the ref updates will have taken place and
|
||||
* the transaction cannot be rolled back.
|
||||
*
|
||||
* - At any time call `ref_transaction_free()` to discard the
|
||||
* transaction and free associated resources. In particular,
|
||||
* this rolls back the transaction if it has not been
|
||||
* successfully committed.
|
||||
*
|
||||
* Error handling
|
||||
* --------------
|
||||
*
|
||||
* On error, transaction functions append a message about what
|
||||
* went wrong to the 'err' argument. The message mentions what
|
||||
* ref was being updated (if any) when the error occurred so it
|
||||
* can be passed to 'die' or 'error' as-is.
|
||||
*
|
||||
* The message is appended to err without first clearing err.
|
||||
* err will not be '\n' terminated.
|
||||
*/
|
||||
struct ref_transaction;
|
||||
|
||||
/*
|
||||
@ -141,14 +173,17 @@ extern int is_branch(const char *refname);
|
||||
extern int peel_ref(const char *refname, unsigned char *sha1);
|
||||
|
||||
/*
|
||||
* Locks a "refs/" ref returning the lock on success and NULL on failure.
|
||||
* On failure errno is set to something meaningful.
|
||||
* Flags controlling lock_any_ref_for_update(), ref_transaction_update(),
|
||||
* ref_transaction_create(), etc.
|
||||
* REF_NODEREF: act on the ref directly, instead of dereferencing
|
||||
* symbolic references.
|
||||
*
|
||||
* Flags >= 0x100 are reserved for internal use.
|
||||
*/
|
||||
extern struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1);
|
||||
|
||||
/** Locks any ref (for 'HEAD' type refs). */
|
||||
#define REF_NODEREF 0x01
|
||||
/* errno is set to something meaningful on failure */
|
||||
/*
|
||||
* This function sets errno to something meaningful on failure.
|
||||
*/
|
||||
extern struct ref_lock *lock_any_ref_for_update(const char *refname,
|
||||
const unsigned char *old_sha1,
|
||||
int flags, int *type_p);
|
||||
@ -232,7 +267,7 @@ enum action_on_err {
|
||||
* Begin a reference transaction. The reference transaction must
|
||||
* be freed by calling ref_transaction_free().
|
||||
*/
|
||||
struct ref_transaction *ref_transaction_begin(void);
|
||||
struct ref_transaction *ref_transaction_begin(struct strbuf *err);
|
||||
|
||||
/*
|
||||
* The following functions add a reference check or update to a
|
||||
@ -250,7 +285,7 @@ struct ref_transaction *ref_transaction_begin(void);
|
||||
* it must not have existed beforehand.
|
||||
* Function returns 0 on success and non-zero on failure. A failure to update
|
||||
* means that the transaction as a whole has failed and will need to be
|
||||
* rolled back. On failure the err buffer will be updated.
|
||||
* rolled back.
|
||||
*/
|
||||
int ref_transaction_update(struct ref_transaction *transaction,
|
||||
const char *refname,
|
||||
@ -264,28 +299,34 @@ int ref_transaction_update(struct ref_transaction *transaction,
|
||||
* that the reference should have after the update; it must not be the
|
||||
* null SHA-1. It is verified that the reference does not exist
|
||||
* already.
|
||||
* Function returns 0 on success and non-zero on failure. A failure to create
|
||||
* means that the transaction as a whole has failed and will need to be
|
||||
* rolled back.
|
||||
*/
|
||||
void ref_transaction_create(struct ref_transaction *transaction,
|
||||
const char *refname,
|
||||
const unsigned char *new_sha1,
|
||||
int flags);
|
||||
int ref_transaction_create(struct ref_transaction *transaction,
|
||||
const char *refname,
|
||||
const unsigned char *new_sha1,
|
||||
int flags,
|
||||
struct strbuf *err);
|
||||
|
||||
/*
|
||||
* Add a reference deletion to transaction. If have_old is true, then
|
||||
* old_sha1 holds the value that the reference should have had before
|
||||
* the update (which must not be the null SHA-1).
|
||||
* Function returns 0 on success and non-zero on failure. A failure to delete
|
||||
* means that the transaction as a whole has failed and will need to be
|
||||
* rolled back.
|
||||
*/
|
||||
void ref_transaction_delete(struct ref_transaction *transaction,
|
||||
const char *refname,
|
||||
const unsigned char *old_sha1,
|
||||
int flags, int have_old);
|
||||
int ref_transaction_delete(struct ref_transaction *transaction,
|
||||
const char *refname,
|
||||
const unsigned char *old_sha1,
|
||||
int flags, int have_old,
|
||||
struct strbuf *err);
|
||||
|
||||
/*
|
||||
* Commit all of the changes that have been queued in transaction, as
|
||||
* atomically as possible. Return a nonzero value if there is a
|
||||
* problem.
|
||||
* If err is non-NULL we will add an error string to it to explain why
|
||||
* the transaction failed. The string does not end in newline.
|
||||
*/
|
||||
int ref_transaction_commit(struct ref_transaction *transaction,
|
||||
const char *msg, struct strbuf *err);
|
||||
|
||||
Reference in New Issue
Block a user