git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Beller <sbeller@google.com>
To: git@vger.kernel.org, mhagger@alum.mit.edu, jrnieder@gmail.com,
	ronniesahlberg@gmail.com, gitster@pobox.com
Cc: Stefan Beller <sbeller@google.com>
Subject: [PATCH 5/8] refs.c: add transaction function to delete the reflog
Date: Fri,  5 Dec 2014 18:46:32 -0800	[thread overview]
Message-ID: <1417833995-25687-6-git-send-email-sbeller@google.com> (raw)
In-Reply-To: <1417833995-25687-1-git-send-email-sbeller@google.com>

This continues the work of the previous patch as reflogs not
only grow, but also need a cut sometimes. This patch introduces
transaction_delete_reflog as part of the transaction API to
delete the reflog.

This function serves two purposes. It can be used to actually
delete the reflog as the name indicates. The other purpose is
truncation of the reflog and rewriting it.

Signed-off-by: Stefan Beller <sbeller@google.com>
---
 refs.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/refs.c b/refs.c
index d767418..57f4941 100644
--- a/refs.c
+++ b/refs.c
@@ -3649,6 +3649,56 @@ int transaction_update_ref(struct transaction *transaction,
 }
 
 /*
+ * Delete the reflog for the given refname.
+ *
+ */
+static int transaction_delete_reflog(struct transaction *transaction,
+				       const char *refname,
+				       struct strbuf *err)
+{
+	struct lock_file *lock;
+	struct string_list_item *item;
+
+	if (transaction->state != TRANSACTION_OPEN)
+		die("BUG: delete_reflog called for transaction that is not open");
+
+	item = string_list_insert(&transaction->reflog_updates, refname);
+
+	if (!item->util) {
+		char *path = git_path("logs/locks/%s", refname);
+		lock = xcalloc(1, sizeof(struct lock_file));
+		item->util = lock;
+		if (safe_create_leading_directories(path)) {
+			strbuf_addf(err, "could not create leading directories of '%s': %s",
+				    path, strerror(errno));
+			goto failure;
+		}
+
+		if (hold_lock_file_for_update(lock, path, 0) < 0) {
+			unable_to_lock_message(path, errno, err);
+			goto failure;
+		}
+		/* The empty file indicates transaction_commit to
+		 * delete the reflog */
+		return 0;
+	}
+
+	/* The transaction already writes to this reflog.  Clear it. */
+	lock = item->util;
+	if (lseek(lock->fd, 0, SEEK_SET) < 0 ||
+	    ftruncate(lock->fd, 0)) {
+		strbuf_addf(err, "cannot truncate reflog '%s': %s",
+			    refname, strerror(errno));
+		goto failure;
+	}
+	return 0;
+
+failure:
+	transaction->state = TRANSACTION_CLOSED;
+	return -1;
+}
+
+/*
  * Append a reflog entry for refname.
  */
 static int transaction_update_reflog(struct transaction *transaction,
@@ -3885,7 +3935,17 @@ int transaction_commit(struct transaction *transaction,
 	/* Commit all reflog updates*/
 	for_each_string_list_item(item, &transaction->reflog_updates) {
 		struct lock_file *lock = item->util;
-		commit_lock_file_to(lock, git_path("logs/%s", item->string));
+
+		/* If the lock file is empty we want to delete the reflog*/
+		off_t filepos = lseek(lock->fd, 0, SEEK_END);
+		if (filepos < 0) {
+			ret = TRANSACTION_GENERIC_ERROR;
+			goto cleanup;
+		}
+		if (filepos)
+			commit_lock_file_to(lock, git_path("logs/%s", item->string));
+		else
+			remove_path(git_path("logs/%s", item->string));
 	}
 
 	clear_loose_ref_cache(&ref_cache);
-- 
2.2.0

  parent reply	other threads:[~2014-12-06  2:46 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-06  2:46 [PATCH 0/8] Making reflog modifications part of the transactions API Stefan Beller
2014-12-06  2:46 ` [PATCH 1/8] refs.c: let fprintf handle the formatting Stefan Beller
2014-12-06  2:46 ` [PATCH 2/8] refs.c: rename the transaction functions Stefan Beller
2014-12-11 21:42   ` Junio C Hamano
2014-12-11 21:48     ` Stefan Beller
2014-12-06  2:46 ` [PATCH 3/8] refs.c: rename transaction.updates to transaction.ref_updates Stefan Beller
2014-12-06  2:46 ` [PATCH 4/8] refs.c: add transaction function to append to the reflog Stefan Beller
2014-12-11 21:50   ` Junio C Hamano
2014-12-06  2:46 ` Stefan Beller [this message]
2014-12-06  2:46 ` [PATCH 6/8] refs.c: use a reflog transaction when writing during expire Stefan Beller
2014-12-06  2:46 ` [PATCH 7/8] refs.c: rename log_ref_setup to create_reflog Stefan Beller
2014-12-06  2:46 ` [PATCH 8/8] refs.c: allow deleting refs with a broken sha1 Stefan Beller
2014-12-08 20:05 ` [PATCH 0/8] Making reflog modifications part of the transactions API Stefan Beller
2014-12-08 21:54   ` Jonathan Nieder
2014-12-12 16:17 ` Michael Haggerty
2014-12-12 20:51   ` Stefan Beller
2014-12-12 21:16   ` ronnie sahlberg
2014-12-14 23:17     ` Michael Haggerty

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=1417833995-25687-6-git-send-email-sbeller@google.com \
    --to=sbeller@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=mhagger@alum.mit.edu \
    --cc=ronniesahlberg@gmail.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 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).