From: Junio C Hamano <gitster@pobox.com>
To: Ronnie Sahlberg <sahlberg@google.com>
Cc: git@vger.kernel.org, Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCH 04/15] refs.c: add a new update_type field to ref_update
Date: Thu, 23 Oct 2014 10:47:53 -0700 [thread overview]
Message-ID: <xmqqppdismnq.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1413919462-3458-5-git-send-email-sahlberg@google.com> (Ronnie Sahlberg's message of "Tue, 21 Oct 2014 12:24:11 -0700")
Ronnie Sahlberg <sahlberg@google.com> writes:
> commit 1bfd3091a3d95a6268894182117eed823217dd9d upstream.
>
> Add a field that describes what type of update this refers to. For now
> the only type is UPDATE_SHA1 but we will soon add more types.
OK, so the idea is that 03/15 and 07/15 that let callers to say
transaction_update_REF or transaction_update_REFLOG are nicety
wrappers and the underlying machinery will use UPDATE_SHA1 (added
here) and UPDATE_LOG (added in 07/15), which I find is a nice
layering.
Going in a good direction.
> Change-Id: I9bf76454d1c789877a6aeb360cbb309971c9b5c4
> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> refs.c | 27 +++++++++++++++++++++++----
> 1 file changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/refs.c b/refs.c
> index a1bfaa2..8803b95 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -3504,6 +3504,10 @@ int for_each_reflog(each_ref_fn fn, void *cb_data)
> return retval;
> }
>
> +enum transaction_update_type {
> + UPDATE_SHA1 = 0
> +};
> +
> /**
> * Information needed for a single ref update. Set new_sha1 to the
> * new value or to zero to delete the ref. To check the old value
> @@ -3511,6 +3515,7 @@ int for_each_reflog(each_ref_fn fn, void *cb_data)
> * value or to zero to ensure the ref does not exist before update.
> */
> struct ref_update {
> + enum transaction_update_type update_type;
> unsigned char new_sha1[20];
> unsigned char old_sha1[20];
> int flags; /* REF_NODEREF? */
> @@ -3571,12 +3576,14 @@ void transaction_free(struct transaction *transaction)
> }
>
> static struct ref_update *add_update(struct transaction *transaction,
> - const char *refname)
> + const char *refname,
> + enum transaction_update_type update_type)
> {
> size_t len = strlen(refname);
> struct ref_update *update = xcalloc(1, sizeof(*update) + len + 1);
>
> strcpy((char *)update->refname, refname);
> + update->update_type = update_type;
> ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
> transaction->updates[transaction->nr++] = update;
> return update;
> @@ -3606,7 +3613,7 @@ int transaction_update_ref(struct transaction *transaction,
> return -1;
> }
>
> - update = add_update(transaction, refname);
> + update = add_update(transaction, refname, UPDATE_SHA1);
> hashcpy(update->new_sha1, new_sha1);
> update->flags = flags;
> update->have_old = have_old;
> @@ -3684,13 +3691,17 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
>
> assert(err);
>
> - for (i = 1; i < n; i++)
> + for (i = 1; i < n; i++) {
> + if (updates[i - 1]->update_type != UPDATE_SHA1 ||
> + updates[i]->update_type != UPDATE_SHA1)
> + continue;
> if (!strcmp(updates[i - 1]->refname, updates[i]->refname)) {
> strbuf_addf(err,
> "Multiple updates for ref '%s' not allowed.",
> updates[i]->refname);
> return 1;
> }
> + }
> return 0;
> }
>
> @@ -3722,13 +3733,17 @@ int transaction_commit(struct transaction *transaction,
> goto cleanup;
> }
>
> - /* Acquire all locks while verifying old values */
> + /* Acquire all ref locks while verifying old values */
> for (i = 0; i < n; i++) {
> struct ref_update *update = updates[i];
> int flags = update->flags;
>
> + if (update->update_type != UPDATE_SHA1)
> + continue;
> +
> if (is_null_sha1(update->new_sha1))
> flags |= REF_DELETING;
> +
> update->lock = lock_ref_sha1_basic(update->refname,
> (update->have_old ?
> update->old_sha1 :
> @@ -3750,6 +3765,8 @@ int transaction_commit(struct transaction *transaction,
> for (i = 0; i < n; i++) {
> struct ref_update *update = updates[i];
>
> + if (update->update_type != UPDATE_SHA1)
> + continue;
> if (!is_null_sha1(update->new_sha1)) {
> if (write_ref_sha1(update->lock, update->new_sha1,
> update->msg)) {
> @@ -3767,6 +3784,8 @@ int transaction_commit(struct transaction *transaction,
> for (i = 0; i < n; i++) {
> struct ref_update *update = updates[i];
>
> + if (update->update_type != UPDATE_SHA1)
> + continue;
> if (update->lock) {
> if (delete_ref_loose(update->lock, update->type, err)) {
> ret = TRANSACTION_GENERIC_ERROR;
next prev parent reply other threads:[~2014-10-23 17:48 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-21 19:24 [PATCH 00/15] ref-transactions-reflog Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 01/15] refs.c make ref_transaction_create a wrapper to ref_transaction_update Ronnie Sahlberg
2014-10-23 17:42 ` Junio C Hamano
2014-10-23 17:44 ` Ronnie Sahlberg
2014-10-23 17:54 ` Junio C Hamano
2014-10-28 18:40 ` Junio C Hamano
2014-10-21 19:24 ` [PATCH 02/15] refs.c: make ref_transaction_delete a wrapper for ref_transaction_update Ronnie Sahlberg
2014-10-23 17:43 ` Junio C Hamano
2014-10-21 19:24 ` [PATCH 03/15] refs.c: rename the transaction functions Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 04/15] refs.c: add a new update_type field to ref_update Ronnie Sahlberg
2014-10-23 17:47 ` Junio C Hamano [this message]
2014-10-21 19:24 ` [PATCH 05/15] refs.c: add a function to append a reflog entry to a fd Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 06/15] copy.c: make copy_fd preserve meaningful errno Ronnie Sahlberg
2014-10-23 17:51 ` Junio C Hamano
2014-10-23 17:54 ` Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 07/15] refs.c: add a transaction function to append a reflog entry Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 08/15] refs.c: add a flag to allow reflog updates to truncate the log Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 09/15] refs.c: only write reflog update if msg is non-NULL Ronnie Sahlberg
2014-10-23 18:32 ` Junio C Hamano
2014-10-28 19:17 ` Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 10/15] refs.c: allow multiple reflog updates during a single transaction Ronnie Sahlberg
2014-10-23 18:54 ` Junio C Hamano
2014-10-28 19:59 ` Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 11/15] reflog.c: use a reflog transaction when writing during expire Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 12/15] refs.c: rename log_ref_setup to create_reflog Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 13/15] refs.c: make unlock_ref/close_ref/commit_ref static Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 14/15] refs.c: remove lock_any_ref_for_update Ronnie Sahlberg
2014-10-21 19:24 ` [PATCH 15/15] refs.c: allow deleting refs with a broken sha1 Ronnie Sahlberg
-- strict thread matches above, loose matches on Subject: below --
2014-07-23 17:03 [PATCH 00/15] ref-transactions for reflogs Ronnie Sahlberg
2014-07-23 17:03 ` [PATCH 04/15] refs.c: add a new update_type field to ref_update Ronnie Sahlberg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqppdismnq.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
--cc=sahlberg@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.