struct ref_update: move "have_old" into "flags"

Instead of having a separate have_old field, record this boolean value
as a bit in the "flags" field.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael Haggerty 2015-02-17 18:00:14 +01:00 committed by Junio C Hamano
parent fec14ec38c
commit 8df4e51138
1 changed files with 28 additions and 17 deletions

45
refs.c
View File

@ -41,11 +41,17 @@ static unsigned char refname_disposition[256] = {
#define REF_DELETING 0x02 #define REF_DELETING 0x02


/* /*
* Used as a flag to ref_transaction_delete when a loose ref is being * Used as a flag in ref_update::flags when a loose ref is being
* pruned. * pruned.
*/ */
#define REF_ISPRUNING 0x04 #define REF_ISPRUNING 0x04


/*
* Used as a flag in ref_update::flags when old_sha1 should be
* checked.
*/
#define REF_HAVE_OLD 0x08

/* /*
* Try to read one refname component from the front of refname. * Try to read one refname component from the front of refname.
* Return the length of the component found, or -1 if the component is * Return the length of the component found, or -1 if the component is
@ -3563,16 +3569,20 @@ int for_each_reflog(each_ref_fn fn, void *cb_data)
} }


/** /**
* Information needed for a single ref update. Set new_sha1 to the * Information needed for a single ref update. Set new_sha1 to the new
* new value or to zero to delete the ref. To check the old value * value or to null_sha1 to delete the ref. To check the old value
* while locking the ref, set have_old to 1 and set old_sha1 to the * while the ref is locked, set (flags & REF_HAVE_OLD) and set
* value or to zero to ensure the ref does not exist before update. * old_sha1 to the old value, or to null_sha1 to ensure the ref does
* not exist before update.
*/ */
struct ref_update { struct ref_update {
unsigned char new_sha1[20]; unsigned char new_sha1[20];
unsigned char old_sha1[20]; unsigned char old_sha1[20];
unsigned int flags; /* REF_NODEREF? */ /*
int have_old; /* 1 if old_sha1 is valid, 0 otherwise */ * One or more of REF_HAVE_OLD, REF_NODEREF,
* REF_DELETING, and REF_ISPRUNING:
*/
unsigned int flags;
struct ref_lock *lock; struct ref_lock *lock;
int type; int type;
char *msg; char *msg;
@ -3666,10 +3676,11 @@ int ref_transaction_update(struct ref_transaction *transaction,


update = add_update(transaction, refname); update = add_update(transaction, refname);
hashcpy(update->new_sha1, new_sha1); hashcpy(update->new_sha1, new_sha1);
update->flags = flags; if (have_old) {
update->have_old = have_old;
if (have_old)
hashcpy(update->old_sha1, old_sha1); hashcpy(update->old_sha1, old_sha1);
flags |= REF_HAVE_OLD;
}
update->flags = flags;
if (msg) if (msg)
update->msg = xstrdup(msg); update->msg = xstrdup(msg);
return 0; return 0;
@ -3785,13 +3796,13 @@ int ref_transaction_commit(struct ref_transaction *transaction,


if (is_null_sha1(update->new_sha1)) if (is_null_sha1(update->new_sha1))
flags |= REF_DELETING; flags |= REF_DELETING;
update->lock = lock_ref_sha1_basic(update->refname, update->lock = lock_ref_sha1_basic(
(update->have_old ? update->refname,
update->old_sha1 : ((update->flags & REF_HAVE_OLD) ?
NULL), update->old_sha1 : NULL),
NULL, NULL,
flags, flags,
&update->type); &update->type);
if (!update->lock) { if (!update->lock) {
ret = (errno == ENOTDIR) ret = (errno == ENOTDIR)
? TRANSACTION_NAME_CONFLICT ? TRANSACTION_NAME_CONFLICT