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

[PATCH v2 2/9] prune_ref(): call `ref_transaction_add_update()` directly

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Nov 5, 2017, 08:42 UTC
Message-ID
<4421de69e71019b4f137fbc5ce0c275138691b3c.1509870243.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1509870243.git.mhagger@alum.mit.edu>

`prune_ref()` needs to use the `REF_ISPRUNING` flag, but we want to make that flag private to the files backend. So instead of calling `ref_transaction_delete()`, which is a public function and therefore shouldn't allow the `REF_ISPRUNING` flag, change `prune_ref()` to call `ref_transaction_add_update()`, which is private to the refs module. (Note that we don't need any of the other services provided by `ref_transaction_delete()`.)

This allows us to change `ref_transaction_update()` to reject the `REF_ISPRUNING` flag. Do so by adjusting `REF_TRANSACTION_UPDATE_ALLOWED_FLAGS`. Also add parentheses to its definition to avoid potential future mishaps.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs.h               |  4 +---
 refs/files-backend.c | 25 ++++++++++++++++---------
 2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/refs.h b/refs.h
index 15fd419c7d..4ffef9502d 100644
--- a/refs.h
+++ b/refs.h
@@ -349,9 +349,7 @@ int refs_pack_refs(struct ref_store *refs, unsigned int flags);
  * Flags that can be passed in to ref_transaction_update
  */
 #define REF_TRANSACTION_UPDATE_ALLOWED_FLAGS \
-	REF_ISPRUNING |                      \
-	REF_FORCE_CREATE_REFLOG |            \
-	REF_NODEREF
+	(REF_NODEREF | REF_FORCE_CREATE_REFLOG)
 
 /*
  * Setup reflog before using. Fill in err and return -1 on failure.
diff --git a/refs/files-backend.c b/refs/files-backend.c
index fadf1036d3..ba72d28b13 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -989,22 +989,29 @@ static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)
 {
 	struct ref_transaction *transaction;
 	struct strbuf err = STRBUF_INIT;
+	int ret = -1;
 
 	if (check_refname_format(r->name, 0))
 		return;
 
 	transaction = ref_store_transaction_begin(&refs->base, &err);
-	if (!transaction ||
-	    ref_transaction_delete(transaction, r->name, &r->oid,
-				   REF_ISPRUNING | REF_NODEREF, NULL, &err) ||
-	    ref_transaction_commit(transaction, &err)) {
-		ref_transaction_free(transaction);
+	if (!transaction)
+		goto cleanup;
+	ref_transaction_add_update(
+			transaction, r->name,
+			REF_NODEREF | REF_HAVE_NEW | REF_HAVE_OLD | REF_ISPRUNING,
+			&null_oid, &r->oid, NULL);
+	if (ref_transaction_commit(transaction, &err))
+		goto cleanup;
+
+	ret = 0;
+
+cleanup:
+	if (ret)
 		error("%s", err.buf);
-		strbuf_release(&err);
-		return;
-	}
-	ref_transaction_free(transaction);
 	strbuf_release(&err);
+	ref_transaction_free(transaction);
+	return;
 }
 
 /*
-- 
2.14.1
Previous: Michael HaggertyNext: Michael Haggerty
Message 8 of 12 in “Tidy up the constants related to ref_update::flags”
  1. 0/9 Tidy up the constants related to ref_update::flagsMichael Haggerty, Nov 5, 2017
  2. 1/9 files_transaction_prepare(): don't leak flags to packed transactionMichael Haggerty, Nov 5, 2017
  3. 7/9 refs: rename constant `REF_ISPRUNING` to `REF_IS_PRUNING`Michael Haggerty, Nov 5, 2017
  4. 8/9 write_packed_entry(): take `object_id` argumentsMichael Haggerty, Nov 5, 2017
  5. 9/9 refs: update some more docs to use "oid" rather than "sha1"Michael Haggerty, Nov 5, 2017
  6. 5/9 refs: tidy up and adjust visibility of the `ref_update` flagsMichael Haggerty, Nov 5, 2017
  7. 6/9 refs: rename constant `REF_NODEREF` to `REF_NO_DEREF`Michael Haggerty, Nov 5, 2017
  8. 2/9 prune_ref(): call `ref_transaction_add_update()` directlyMichael Haggerty, Nov 5, 2017
  9. 3/9 ref_transaction_update(): die on disallowed flagsMichael Haggerty, Nov 5, 2017
  10. Martin ÅgrenNov 7, 2017
  11. Thomas GummererNov 7, 2017
  12. 4/9 ref_transaction_add_update(): remove a checkMichael Haggerty, Nov 5, 2017

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.