git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ronnie Sahlberg <sahlberg@google.com>
To: git@vger.kernel.org
Cc: mhagger@alum.mit.edu, Ronnie Sahlberg <sahlberg@google.com>
Subject: [PATCH 12/31] refs.c: track the refnames we are deleting in the transaction structure
Date: Wed, 14 May 2014 15:13:11 -0700	[thread overview]
Message-ID: <1400105610-21194-13-git-send-email-sahlberg@google.com> (raw)
In-Reply-To: <1400105610-21194-1-git-send-email-sahlberg@google.com>

Track the names of the refs we are deleting in the ref_transaction structure
instead of building an array of names during _commit.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 refs.c | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/refs.c b/refs.c
index 58bbf1b..cc31efe 100644
--- a/refs.c
+++ b/refs.c
@@ -3299,6 +3299,8 @@ struct ref_transaction {
 	size_t alloc;
 	size_t nr;
 	enum ref_transaction_status status;
+	const char **delnames;
+	int delnum;
 };
 
 struct ref_transaction *transaction_begin(void)
@@ -3306,6 +3308,15 @@ struct ref_transaction *transaction_begin(void)
 	return xcalloc(1, sizeof(struct ref_transaction));
 }
 
+static void add_delname(struct ref_transaction *transaction,
+			const char *refname)
+{
+	transaction->delnames = xrealloc(transaction->delnames,
+					 ++transaction->delnum *
+					 sizeof(const char *));
+	transaction->delnames[transaction->delnum - 1] = xstrdup(refname);
+}
+
 void transaction_free(struct ref_transaction *transaction)
 {
 	int i;
@@ -3319,6 +3330,9 @@ void transaction_free(struct ref_transaction *transaction)
 		free(transaction->updates[i]);
 	}
 	free(transaction->updates);
+	for (i = 0; i < transaction->delnum; i++)
+		free((char *)transaction->delnames[i]);
+	free((char *)transaction->delnames);
 	free(transaction);
 }
 
@@ -3518,8 +3532,7 @@ static int ref_update_reject_duplicates(struct ref_update **updates, int n,
 int transaction_commit(struct ref_transaction *transaction,
 			   struct strbuf *err)
 {
-	int ret = 0, delnum = 0, i;
-	const char **delnames;
+	int ret = 0, i;
 	int n = transaction->nr;
 	struct ref_update **updates = transaction->updates;
 
@@ -3531,9 +3544,6 @@ int transaction_commit(struct ref_transaction *transaction,
 		return 0;
 	}
 
-	/* Allocate work space */
-	delnames = xmalloc(sizeof(*delnames) * n);
-
 	/* Copy, sort, and reject duplicate refs */
 	qsort(updates, n, sizeof(*updates), ref_update_compare);
 	ret = ref_update_reject_duplicates(updates, n, err);
@@ -3546,7 +3556,7 @@ int transaction_commit(struct ref_transaction *transaction,
 		if (update->update_type != UPDATE_SHA1)
 			continue;
 		if (update->flags & REF_ISPACKONLY)
-			delnames[delnum++] = update->refname;
+			add_delname(transaction, update->refname);
 	}
 
 	/* Acquire all ref locks while verifying old values */
@@ -3564,7 +3574,8 @@ int transaction_commit(struct ref_transaction *transaction,
 						    NULL),
 						   update->flags,
 						   &update->type,
-						   delnames, delnum);
+						   transaction->delnames,
+						   transaction->delnum);
 		if (!update->lock) {
 			if (err)
 				strbuf_addf(err, "Cannot lock the ref '%s'.",
@@ -3631,7 +3642,8 @@ int transaction_commit(struct ref_transaction *transaction,
 		if (update->lock) {
 			ret |= delete_ref_loose(update->lock, update->type);
 			if (!(update->flags & REF_ISPRUNING))
-				delnames[delnum++] = update->lock->ref_name;
+				add_delname(transaction,
+					    update->lock->ref_name);
 		}
 	}
 
@@ -3677,9 +3689,9 @@ int transaction_commit(struct ref_transaction *transaction,
 		}
 	}
 
-	ret |= repack_without_refs(delnames, delnum);
-	for (i = 0; i < delnum; i++)
-		unlink_or_warn(git_path("logs/%s", delnames[i]));
+	ret |= repack_without_refs(transaction->delnames, transaction->delnum);
+	for (i = 0; i < transaction->delnum; i++)
+		unlink_or_warn(git_path("logs/%s", transaction->delnames[i]));
 	clear_loose_ref_cache(&ref_cache);
 
 cleanup:
@@ -3701,7 +3713,6 @@ cleanup:
 	for (i = 0; i < n; i++)
 		if (updates[i]->lock)
 			unlock_ref(updates[i]->lock);
-	free(delnames);
 	return ret;
 }
 
-- 
2.0.0.rc3.506.g3739a35

  parent reply	other threads:[~2014-05-14 22:14 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-14 22:12 [PATCH 00/31] Finish implementing ref and reflog transactions Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 01/31] refs.c make ref_transaction_create a wrapper to ref_transaction_update Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 02/31] refs.c: make ref_transaction_delete a wrapper for ref_transaction_update Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 03/31] refs.c: rename the transaction functions Ronnie Sahlberg
2014-05-16 21:15   ` Junio C Hamano
2014-05-19 23:11     ` Ronnie Sahlberg
2014-05-19 23:25       ` Junio C Hamano
2014-05-14 22:13 ` [PATCH 04/31] refs.c: add a new update_type field to ref_update Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 05/31] refs.c: add a function to append a reflog entry to a fd Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 06/31] refs.c: add a transaction function to append a reflog entry Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 07/31] refs.c: add a flag to allow reflog updates to truncate the log Ronnie Sahlberg
2014-05-16 21:20   ` Junio C Hamano
2014-05-19 23:27     ` Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 08/31] refs.c: only write reflog update if msg is non-NULL Ronnie Sahlberg
2014-05-16 21:24   ` Junio C Hamano
2014-05-19 22:55     ` Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 09/31] refs.c: allow multiple reflog updates during a single transaction Ronnie Sahlberg
2014-05-16 21:35   ` Junio C Hamano
2014-05-16 22:01     ` Eric Sunshine
2014-05-19 22:58       ` Ronnie Sahlberg
2014-05-19 23:06     ` Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 10/31] reflog.c: use a reflog transaction when writing during expire Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 11/31] refs.c: null terminate the string in copy_msg Ronnie Sahlberg
2014-05-14 22:13 ` Ronnie Sahlberg [this message]
2014-05-14 22:13 ` [PATCH 13/31] refs.c: update the list of deleted refs during _update instead of _commit Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 14/31] refs.c: return error instead of dying when locking fails during transaction Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 15/31] refs.c: lock the ref during _update instead of during _commit Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 16/31] refs.c: add an error argument to create/delete/update just like commit Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 17/31] refs.c: make _update_reflog take an error argument Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 18/31] refs.c: return immediately from _commit if the transaction has an error Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 19/31] tests: move tests for -z update/delete/verify to after the ref is created Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 20/31] refs.c: check for lock conflicts already in _update Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 21/31] refs.c allow multiple updates of the same ref in a transaction Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 22/31] refs.c: release all remaining locks during transaction_free Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 23/31] reflog.c: use the existing transaction to also lock and update the ref Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 24/31] refs.c: make unlock_ref static Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 25/31] refs.c: make close_ref static Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 26/31] refs.c: make commit_ref static Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 27/31] refs.c: remove the function lock_any_ref_for_update Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 28/31] refs.c: make struct ref_lock private to refs.c Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 29/31] refs.c: allow passing raw git_committer_info as email to _update_reflog Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 30/31] refs.c: move ref_update and other definitions to earlier in the file Ronnie Sahlberg
2014-05-14 22:13 ` [PATCH 31/31] refs.c: use the transaction to manage the reflog in rename_refs 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=1400105610-21194-13-git-send-email-sahlberg@google.com \
    --to=sahlberg@google.com \
    --cc=git@vger.kernel.org \
    --cc=mhagger@alum.mit.edu \
    /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 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 NNTP newsgroup(s).