summaryrefslogtreecommitdiff
path: root/refs.h
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2014-04-07 13:48:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-04-07 19:09:14 (GMT)
commitcaa4046c4f480ceae5afb20e3172a437865cc51f (patch)
tree6b1af26f8d1ad2cae7b4f03e53451aafeb82a088 /refs.h
parentf11b09fb60556954c6a222f4809631470c81cae6 (diff)
downloadgit-caa4046c4f480ceae5afb20e3172a437865cc51f.zip
git-caa4046c4f480ceae5afb20e3172a437865cc51f.tar.gz
git-caa4046c4f480ceae5afb20e3172a437865cc51f.tar.bz2
refs: add a concept of a reference transaction
Build out the API for dealing with a bunch of reference checks and changes within a transaction. Define an opaque ref_transaction type that is managed entirely within refs.c. Introduce functions for beginning a transaction, adding updates to a transaction, and committing/rolling back a transaction. This API will soon replace update_refs(). Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.h')
-rw-r--r--refs.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/refs.h b/refs.h
index 08e60ac..0518dd5 100644
--- a/refs.h
+++ b/refs.h
@@ -24,6 +24,8 @@ struct ref_update {
int have_old; /* 1 if old_sha1 is valid, 0 otherwise */
};
+struct ref_transaction;
+
/*
* Bit values set in the flags argument passed to each_ref_fn():
*/
@@ -220,6 +222,69 @@ enum action_on_err {
UPDATE_REFS_QUIET_ON_ERR
};
+/*
+ * Begin a reference transaction. The reference transaction must
+ * eventually be commited using ref_transaction_commit() or rolled
+ * back using ref_transaction_rollback().
+ */
+struct ref_transaction *ref_transaction_begin(void);
+
+/*
+ * Roll back a ref_transaction and free all associated data.
+ */
+void ref_transaction_rollback(struct ref_transaction *transaction);
+
+
+/*
+ * The following functions add a reference check or update to a
+ * ref_transaction. In all of them, refname is the name of the
+ * reference to be affected. The functions make internal copies of
+ * refname, so the caller retains ownership of the parameter. flags
+ * can be REF_NODEREF; it is passed to update_ref_lock().
+ */
+
+
+/*
+ * Add a reference update to transaction. new_sha1 is the value that
+ * the reference should have after the update, or zeros if it should
+ * be deleted. If have_old is true, then old_sha1 holds the value
+ * that the reference should have had before the update, or zeros if
+ * it must not have existed beforehand.
+ */
+void ref_transaction_update(struct ref_transaction *transaction,
+ const char *refname,
+ unsigned char *new_sha1, unsigned char *old_sha1,
+ int flags, int have_old);
+
+/*
+ * Add a reference creation to transaction. new_sha1 is the value
+ * 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.
+ */
+void ref_transaction_create(struct ref_transaction *transaction,
+ const char *refname,
+ unsigned char *new_sha1,
+ int flags);
+
+/*
+ * 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).
+ */
+void ref_transaction_delete(struct ref_transaction *transaction,
+ const char *refname,
+ unsigned char *old_sha1,
+ int flags, int have_old);
+
+/*
+ * Commit all of the changes that have been queued in transaction, as
+ * atomically as possible. Return a nonzero value if there is a
+ * problem. The ref_transaction is freed by this function.
+ */
+int ref_transaction_commit(struct ref_transaction *transaction,
+ const char *msg, enum action_on_err onerr);
+
/** Lock a ref and then write its file */
int update_ref(const char *action, const char *refname,
const unsigned char *sha1, const unsigned char *oldval,