git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Stefan Beller" <sbeller@google.com>,
	"Ronnie Sahlberg" <ronniesahlberg@gmail.com>,
	"Jonathan Nieder" <jrnieder@gmail.com>,
	"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
	git@vger.kernel.org, "Michael Haggerty" <mhagger@alum.mit.edu>
Subject: [PATCH v2 03/12] struct ref_update: move "have_old" into "flags"
Date: Thu, 12 Feb 2015 12:12:14 +0100	[thread overview]
Message-ID: <1423739543-1025-4-git-send-email-mhagger@alum.mit.edu> (raw)
In-Reply-To: <1423739543-1025-1-git-send-email-mhagger@alum.mit.edu>

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>
---
 refs.c | 45 ++++++++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/refs.c b/refs.c
index 4de1383..6cfc07f 100644
--- a/refs.c
+++ b/refs.c
@@ -41,12 +41,18 @@ static unsigned char refname_disposition[256] = {
 #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.
  */
 #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.
  * Return the length of the component found, or -1 if the component is
  * not legal.  It is legal if it is something reasonable to have under
@@ -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
- * new value or to zero to delete the ref.  To check the old value
- * while locking the ref, set have_old to 1 and set old_sha1 to the
- * value or to zero to ensure the ref does not exist before update.
+ * Information needed for a single ref update. Set new_sha1 to the new
+ * value or to null_sha1 to delete the ref. To check the old value
+ * while the ref is locked, set (flags & REF_HAVE_OLD) and set
+ * old_sha1 to the old value, or to null_sha1 to ensure the ref does
+ * not exist before update.
  */
 struct ref_update {
 	unsigned char new_sha1[20];
 	unsigned char old_sha1[20];
-	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_IS_PRUNING:
+	 */
+	int flags;
 	struct ref_lock *lock;
 	int type;
 	char *msg;
@@ -3666,10 +3676,11 @@ int ref_transaction_update(struct ref_transaction *transaction,
 
 	update = add_update(transaction, refname);
 	hashcpy(update->new_sha1, new_sha1);
-	update->flags = flags;
-	update->have_old = have_old;
-	if (have_old)
+	if (have_old) {
 		hashcpy(update->old_sha1, old_sha1);
+		flags |= REF_HAVE_OLD;
+	}
+	update->flags = flags;
 	if (msg)
 		update->msg = xstrdup(msg);
 	return 0;
@@ -3785,13 +3796,13 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 
 		if (is_null_sha1(update->new_sha1))
 			flags |= REF_DELETING;
-		update->lock = lock_ref_sha1_basic(update->refname,
-						   (update->have_old ?
-						    update->old_sha1 :
-						    NULL),
-						   NULL,
-						   flags,
-						   &update->type);
+		update->lock = lock_ref_sha1_basic(
+				update->refname,
+				((update->flags & REF_HAVE_OLD) ?
+				 update->old_sha1 : NULL),
+				NULL,
+				flags,
+				&update->type);
 		if (!update->lock) {
 			ret = (errno == ENOTDIR)
 				? TRANSACTION_NAME_CONFLICT
-- 
2.1.4

  parent reply	other threads:[~2015-02-12 11:13 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-12 11:12 [PATCH v2 00/12] Allow reference values to be checked in a transaction Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 01/12] refs: move REF_DELETING to refs.c Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 02/12] refs: remove the gap in the REF_* constant values Michael Haggerty
2015-02-12 11:12 ` Michael Haggerty [this message]
2015-02-12 18:08   ` [PATCH v2 03/12] struct ref_update: move "have_old" into "flags" Stefan Beller
2015-02-12 19:15     ` Junio C Hamano
2015-02-17 14:37       ` Michael Haggerty
2015-02-17 15:52         ` Junio C Hamano
2015-02-12 11:12 ` [PATCH v2 04/12] ref_transaction_update(): remove "have_old" parameter Michael Haggerty
2015-02-12 17:32   ` Junio C Hamano
2015-02-13 17:15     ` Michael Haggerty
2015-02-13 18:27       ` Junio C Hamano
2015-02-12 11:12 ` [PATCH v2 05/12] ref_transaction_delete(): " Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 06/12] commit: add tests of commit races Michael Haggerty
2015-02-12 18:13   ` Stefan Beller
2015-02-17 14:44     ` Michael Haggerty
2015-02-12 19:36   ` Junio C Hamano
2015-02-17 15:06     ` Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 07/12] commit: avoid race when creating orphan commits Michael Haggerty
2015-02-12 19:36   ` Junio C Hamano
2015-02-12 11:12 ` [PATCH v2 08/12] ref_transaction_create(): check that new_sha1 is valid Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 09/12] ref_transaction_delete(): check that old_sha1 is not null_sha1 Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 10/12] ref_transaction_verify(): new function to check a reference's value Michael Haggerty
2015-02-12 18:21   ` Stefan Beller
2015-02-12 11:12 ` [PATCH v2 11/12] update_ref(): improve documentation Michael Haggerty
2015-02-12 11:12 ` [PATCH v2 12/12] refs.h: Remove duplication in function docstrings Michael Haggerty
2015-02-12 19:44 ` [PATCH v2 00/12] Allow reference values to be checked in a transaction Junio C Hamano

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1423739543-1025-4-git-send-email-mhagger@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=pclouds@gmail.com \
    --cc=ronniesahlberg@gmail.com \
    --cc=sbeller@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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).