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

[PATCH 18/29] refs: allow log-only updates

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Apr 27, 2016, 16:57 UTC
Message-ID
<37887529301c11100ae7bc71495f72ed071a66ca.1461768690.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1461768689.git.mhagger@alum.mit.edu>
From: David Turner <dturner@twopensource.com>

The refs infrastructure learns about log-only ref updates, which only update the reflog. Later, we will use this to separate symbolic reference resolution from ref updating.

Signed-off-by: David Turner <dturner@twopensource.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c | 16 ++++++++++------
 refs/refs-internal.h |  7 +++++++
 2 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index e86e3de..91416db 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2688,7 +2688,7 @@ static int commit_ref_update(struct ref_lock *lock,
 			}
 		}
 	}
-	if (commit_ref(lock)) {
+	if (!(flags & REF_LOG_ONLY) && commit_ref(lock)) {
 		strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
 		unlock_ref(lock);
 		return -1;
@@ -3106,7 +3106,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 			goto cleanup;
 		}
 		if ((update->flags & REF_HAVE_NEW) &&
-		    !(update->flags & REF_DELETING)) {
+		    !(update->flags & REF_DELETING) &&
+		    !(update->flags & REF_LOG_ONLY)) {
 			int overwriting_symref = ((update->type & REF_ISSYMREF) &&
 						  (update->flags & REF_NODEREF));
 
@@ -3138,8 +3139,9 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 		}
 		if (!(update->flags & REF_NEEDS_COMMIT)) {
 			/*
-			 * We didn't have to write anything to the lockfile.
-			 * Close it to free up the file descriptor:
+			 * We didn't call write_ref_to_lockfile(), so
+			 * the lockfile is still open. Close it to
+			 * free up the file descriptor:
 			 */
 			if (close_ref(update->lock)) {
 				strbuf_addf(err, "couldn't close '%s.lock'",
@@ -3154,7 +3156,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 	for (i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = updates[i];
 
-		if (update->flags & REF_NEEDS_COMMIT) {
+		if (update->flags & REF_NEEDS_COMMIT ||
+		    update->flags & REF_LOG_ONLY) {
 			if (commit_ref_update(update->lock,
 					      update->new_sha1, update->msg,
 					      update->flags, err)) {
@@ -3173,7 +3176,8 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 	for (i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = updates[i];
 
-		if (update->flags & REF_DELETING) {
+		if (update->flags & REF_DELETING &&
+		    !(update->flags & REF_LOG_ONLY)) {
 			if (delete_ref_loose(update->lock, update->type, err)) {
 				ret = TRANSACTION_GENERIC_ERROR;
 				goto cleanup;
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index 37a1a37..6b53ba1 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -43,6 +43,13 @@
  */
 
 /*
+ * Used as a flag in ref_update::flags when we want to log a ref
+ * update but not actually perform it.  This is used when a symbolic
+ * ref update is split up.
+ */
+#define REF_LOG_ONLY 0x80
+
+/*
  * Return true iff refname is minimally safe. "Safe" here means that
  * deleting a loose reference by this name will not do any damage, for
  * example by causing a file that is not a reference to be deleted.
-- 
2.8.1
Previous: Michael HaggertyNext: Michael Haggerty
Message 39 of 70 in “Yet more preparation for reference backends”
  1. 00/29 Yet more preparation for reference backendsMichael Haggerty, Apr 27, 2016
  2. 01/29 safe_create_leading_directories(): improve docstringMichael Haggerty, Apr 27, 2016
  3. 02/29 remove_dir_recursively(): add docstringMichael Haggerty, Apr 27, 2016
  4. 03/29 refname_is_safe(): use skip_prefix()Michael Haggerty, Apr 27, 2016
  5. 04/29 refname_is_safe(): don't allow the empty stringMichael Haggerty, Apr 27, 2016
  6. 05/29 refname_is_safe(): insist that the refname already be normalizedMichael Haggerty, Apr 27, 2016
  7. Junio C HamanoApr 27, 2016
  8. David TurnerApr 27, 2016
  9. Jeff KingApr 27, 2016
  10. David TurnerApr 27, 2016
  11. Jeff KingApr 27, 2016
  12. Jeff KingApr 27, 2016
  13. David TurnerApr 28, 2016
  14. 06/29 commit_ref_update(): write error message to *err, not stderrMichael Haggerty, Apr 27, 2016
  15. 07/29 rename_ref(): remove unneeded local variableMichael Haggerty, Apr 27, 2016
  16. 08/29 ref_transaction_commit(): remove local variable nMichael Haggerty, Apr 27, 2016
  17. Junio C HamanoApr 27, 2016
  18. Junio C HamanoApr 27, 2016
  19. 09/29 read_raw_ref(): rename flags argument to typeMichael Haggerty, Apr 27, 2016
  20. 10/29 read_raw_ref(): clear *type at start of functionMichael Haggerty, Apr 27, 2016
  21. 11/29 read_raw_ref(): rename symref argument to referentMichael Haggerty, Apr 27, 2016
  22. 12/29 read_raw_ref(): improve docstringMichael Haggerty, Apr 27, 2016
  23. Junio C HamanoApr 27, 2016
  24. 13/29 lock_ref_sha1_basic(): remove unneeded local variableMichael Haggerty, Apr 27, 2016
  25. 14/29 refs: make error messages more consistentMichael Haggerty, Apr 27, 2016
  26. 15/29 ref_transaction_create(): disallow recursive pruningMichael Haggerty, Apr 27, 2016
  27. Junio C HamanoApr 27, 2016
  28. David TurnerApr 27, 2016
  29. Junio C HamanoApr 27, 2016
  30. Junio C HamanoApr 27, 2016
  31. David TurnerApr 28, 2016
  32. Junio C HamanoApr 28, 2016
  33. Michael HaggertyApr 29, 2016
  34. Junio C HamanoApr 29, 2016
  35. Junio C HamanoApr 29, 2016
  36. Michael HaggertyApr 29, 2016
  37. 16/29 ref_transaction_commit(): correctly report close_ref() failureMichael Haggerty, Apr 27, 2016
  38. 17/29 delete_branches(): use resolve_refdup()Michael Haggerty, Apr 27, 2016
  39. 18/29 refs: allow log-only updatesMichael Haggerty, Apr 27, 2016
  40. 19/29 refs: don't dereference on renameMichael Haggerty, Apr 27, 2016
  41. Junio C HamanoApr 27, 2016
  42. Michael HaggertyApr 29, 2016
  43. Junio C HamanoApr 29, 2016
  44. Michael HaggertyApr 29, 2016
  45. Jeff KingApr 29, 2016
  46. Michael HaggertyApr 29, 2016
  47. Jeff KingApr 29, 2016
  48. Junio C HamanoApr 29, 2016
  49. David TurnerApr 29, 2016
  50. Michael HaggertyApr 30, 2016
  51. Junio C HamanoMay 2, 2016
  52. 20/29 verify_refname_available(): adjust constness in declarationMichael Haggerty, Apr 27, 2016
  53. 21/29 add_update(): initialize the whole ref_updateMichael Haggerty, Apr 27, 2016
  54. 22/29 lock_ref_for_update(): new functionMichael Haggerty, Apr 27, 2016
  55. 23/29 unlock_ref(): move definition higher in the fileMichael Haggerty, Apr 27, 2016
  56. 24/29 ref_transaction_update(): check refname_is_safe() at a minimumMichael Haggerty, Apr 27, 2016
  57. Junio C HamanoApr 27, 2016
  58. Michael HaggertyApr 29, 2016
  59. Junio C HamanoApr 29, 2016
  60. 25/29 refs: resolve symbolic refs firstMichael Haggerty, Apr 27, 2016
  61. David TurnerApr 28, 2016
  62. Michael HaggertyApr 29, 2016
  63. David TurnerApr 29, 2016
  64. Junio C HamanoMay 2, 2016
  65. 26/29 lock_ref_for_update(): don't re-read non-symbolic referencesMichael Haggerty, Apr 27, 2016
  66. 27/29 lock_ref_for_update(): don't resolve symrefsMichael Haggerty, Apr 27, 2016
  67. 28/29 commit_ref_update(): remove the flags parameterMichael Haggerty, Apr 27, 2016
  68. 29/29 lock_ref_sha1_basic(): only handle REF_NODEREF modeMichael Haggerty, Apr 27, 2016
  69. Junio C HamanoApr 29, 2016
  70. David TurnerApr 29, 2016

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.