git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 23/31] reflog.c: use the existing transaction to also lock and update the ref

From
Ronnie Sahlberg <sahlberg@google.com>
Date
May 14, 2014, 22:13 UTC
Message-ID
<1400105610-21194-24-git-send-email-sahlberg@google.com>
In-Reply-To
<1400105610-21194-1-git-send-email-sahlberg@google.com>

reflog.c has a transaction for updating the reflog. Use this transaction also for locking the ref itself and updating the ref instead of locking the file directly and writing to it. This now completely eliminates the refs and reflog implementation from reflog.c.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 builtin/reflog.c | 44 ++++++++++++++++++++------------------------
 1 file changed, 20 insertions(+), 24 deletions(-)
diff --git a/builtin/reflog.c b/builtin/reflog.c
index 2239249..78fd442 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -351,7 +351,6 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 {
 	struct cmd_reflog_expire_cb *cmd = cb_data;
 	struct expire_reflog_cb cb;
-	struct ref_lock *lock;
 	struct commit *tip_commit;
 	struct commit_list *tips;
 	int status = 0;
@@ -359,23 +358,24 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 	memset(&cb, 0, sizeof(cb));
 	cb.refname = ref;
 
+	if (!reflog_exists(ref))
+		goto finish;
+
+	cb.t = transaction_begin();
 	/*
-	 * we take the lock for the ref itself to prevent it from
-	 * getting updated.
+	 * This locks the ref itself, preventing it from getting
+	 * updated.
 	 */
-	lock = lock_any_ref_for_update(ref, sha1, 0, NULL);
-	if (!lock)
+	if (transaction_update_sha1(cb.t, cb.refname,
+				    sha1, sha1, 0, 1, NULL, NULL)) {
+		transaction_rollback(cb.t);
 		return error("cannot lock ref '%s'", ref);
-	if (!reflog_exists(ref))
-		goto finish;
-	if (!cmd->dry_run) {
-		cb.t = transaction_begin();
-		transaction_update_reflog(cb.t, cb.refname,
-					  null_sha1, null_sha1, NULL,
-					  0, 0, NULL,
-					  REFLOG_TRUNCATE,
-					  NULL);
 	}
+	transaction_update_reflog(cb.t, cb.refname,
+				  null_sha1, null_sha1, NULL,
+				  0, 0, NULL,
+				  REFLOG_TRUNCATE,
+				  NULL);
 
 	cb.cmd = cmd;
 
@@ -421,23 +421,19 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
 		}
 	}
  finish:
-	if (cb.t) {
+	if (!cmd->dry_run) {
 		if (cmd->updateref &&
-		    (write_in_full(lock->lock_fd,
-				   sha1_to_hex(cb.last_kept_sha1), 40) != 40 ||
-		     write_str_in_full(lock->lock_fd, "\n") != 1 ||
-		     close_ref(lock) < 0)) {
+		    transaction_update_sha1(cb.t, cb.refname,
+					    cb.last_kept_sha1, sha1,
+					    0, 1, NULL, NULL)) {
 			status |= error("Couldn't write %s",
-				lock->lk->filename);
+				cb.refname);
 			transaction_rollback(cb.t);
 		} else if (transaction_commit(cb.t, NULL)) {
 			status |= error("cannot commit reflog for %s", ref);
-		} else if (cmd->updateref && commit_ref(lock)) {
-			status |= error("Couldn't set %s", lock->ref_name);
 		}
-		transaction_free(cb.t);
 	}
-	unlock_ref(lock);
+	transaction_free(cb.t);
 	return status;
 }
 
-- 
2.0.0.rc3.506.g3739a35
Previous: Ronnie SahlbergNext: Ronnie Sahlberg
Message 35 of 43 in “Finish implementing ref and reflog transactions”
  1. 00/31 Finish implementing ref and reflog transactionsRonnie Sahlberg, May 14, 2014
  2. 01/31 refs.c make ref_transaction_create a wrapper to ref_transaction_updateRonnie Sahlberg, May 14, 2014
  3. 02/31 refs.c: make ref_transaction_delete a wrapper for ref_transaction_updateRonnie Sahlberg, May 14, 2014
  4. 03/31 refs.c: rename the transaction functionsRonnie Sahlberg, May 14, 2014
  5. Junio C HamanoMay 16, 2014
  6. Ronnie SahlbergMay 19, 2014
  7. Junio C HamanoMay 19, 2014
  8. 04/31 refs.c: add a new update_type field to ref_updateRonnie Sahlberg, May 14, 2014
  9. 05/31 refs.c: add a function to append a reflog entry to a fdRonnie Sahlberg, May 14, 2014
  10. 06/31 refs.c: add a transaction function to append a reflog entryRonnie Sahlberg, May 14, 2014
  11. 07/31 refs.c: add a flag to allow reflog updates to truncate the logRonnie Sahlberg, May 14, 2014
  12. Junio C HamanoMay 16, 2014
  13. Ronnie SahlbergMay 19, 2014
  14. 08/31 refs.c: only write reflog update if msg is non-NULLRonnie Sahlberg, May 14, 2014
  15. Junio C HamanoMay 16, 2014
  16. Ronnie SahlbergMay 19, 2014
  17. 09/31 refs.c: allow multiple reflog updates during a single transactionRonnie Sahlberg, May 14, 2014
  18. Junio C HamanoMay 16, 2014
  19. Eric SunshineMay 16, 2014
  20. Ronnie SahlbergMay 19, 2014
  21. Ronnie SahlbergMay 19, 2014
  22. 10/31 reflog.c: use a reflog transaction when writing during expireRonnie Sahlberg, May 14, 2014
  23. 11/31 refs.c: null terminate the string in copy_msgRonnie Sahlberg, May 14, 2014
  24. 12/31 refs.c: track the refnames we are deleting in the transaction structureRonnie Sahlberg, May 14, 2014
  25. 13/31 refs.c: update the list of deleted refs during _update instead of _commitRonnie Sahlberg, May 14, 2014
  26. 14/31 refs.c: return error instead of dying when locking fails during transactionRonnie Sahlberg, May 14, 2014
  27. 15/31 refs.c: lock the ref during _update instead of during _commitRonnie Sahlberg, May 14, 2014
  28. 16/31 refs.c: add an error argument to create/delete/update just like commitRonnie Sahlberg, May 14, 2014
  29. 17/31 refs.c: make _update_reflog take an error argumentRonnie Sahlberg, May 14, 2014
  30. 18/31 refs.c: return immediately from _commit if the transaction has an errorRonnie Sahlberg, May 14, 2014
  31. 19/31 tests: move tests for -z update/delete/verify to after the ref is createdRonnie Sahlberg, May 14, 2014
  32. 20/31 refs.c: check for lock conflicts already in _updateRonnie Sahlberg, May 14, 2014
  33. 21/31 refs.c allow multiple updates of the same ref in a transactionRonnie Sahlberg, May 14, 2014
  34. 22/31 refs.c: release all remaining locks during transaction_freeRonnie Sahlberg, May 14, 2014
  35. 23/31 reflog.c: use the existing transaction to also lock and update the refRonnie Sahlberg, May 14, 2014
  36. 24/31 refs.c: make unlock_ref staticRonnie Sahlberg, May 14, 2014
  37. 25/31 refs.c: make close_ref staticRonnie Sahlberg, May 14, 2014
  38. 26/31 refs.c: make commit_ref staticRonnie Sahlberg, May 14, 2014
  39. 27/31 refs.c: remove the function lock_any_ref_for_updateRonnie Sahlberg, May 14, 2014
  40. 28/31 refs.c: make struct ref_lock private to refs.cRonnie Sahlberg, May 14, 2014
  41. 29/31 refs.c: allow passing raw git_committer_info as email to _update_reflogRonnie Sahlberg, May 14, 2014
  42. 30/31 refs.c: move ref_update and other definitions to earlier in the fileRonnie Sahlberg, May 14, 2014
  43. 31/31 refs.c: use the transaction to manage the reflog in rename_refsRonnie Sahlberg, May 14, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.