Ronnie Sahlberg <sahlberg@xxxxxxxxxx> 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@xxxxxxxxxx> > Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> > --- > 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; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html