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

[PATCH v2 04/11] packed_delete_refs(): implement method

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Sep 8, 2017, 13:51 UTC
Message-ID
<efcd2e74427a4b05566c1afaf81af02f4f9a5672.1504877858.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1504877858.git.mhagger@alum.mit.edu>

Implement `packed_delete_refs()` using a reference transaction. This means that `files_delete_refs()` can use `refs_delete_refs()` instead of `repack_without_refs()` to delete any packed references, decreasing the coupling between the classes.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c  |  2 +-
 refs/packed-backend.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index fccbc24ac4..2c78f63494 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1157,7 +1157,7 @@ static int files_delete_refs(struct ref_store *ref_store, const char *msg,
 	if (packed_refs_lock(refs->packed_ref_store, 0, &err))
 		goto error;
 
-	if (repack_without_refs(refs->packed_ref_store, refnames, &err)) {
+	if (refs_delete_refs(refs->packed_ref_store, msg, refnames, flags)) {
 		packed_refs_unlock(refs->packed_ref_store);
 		goto error;
 	}
diff --git a/refs/packed-backend.c b/refs/packed-backend.c
index 9ab65c5a0a..9d5f76b1dc 100644
--- a/refs/packed-backend.c
+++ b/refs/packed-backend.c
@@ -1086,7 +1086,50 @@ static int packed_initial_transaction_commit(struct ref_store *ref_store,
 static int packed_delete_refs(struct ref_store *ref_store, const char *msg,
 			     struct string_list *refnames, unsigned int flags)
 {
-	die("BUG: not implemented yet");
+	struct packed_ref_store *refs =
+		packed_downcast(ref_store, REF_STORE_WRITE, "delete_refs");
+	struct strbuf err = STRBUF_INIT;
+	struct ref_transaction *transaction;
+	struct string_list_item *item;
+	int ret;
+
+	(void)refs; /* We need the check above, but don't use the variable */
+
+	if (!refnames->nr)
+		return 0;
+
+	/*
+	 * Since we don't check the references' old_oids, the
+	 * individual updates can't fail, so we can pack all of the
+	 * updates into a single transaction.
+	 */
+
+	transaction = ref_store_transaction_begin(ref_store, &err);
+	if (!transaction)
+		return -1;
+
+	for_each_string_list_item(item, refnames) {
+		if (ref_transaction_delete(transaction, item->string, NULL,
+					   flags, msg, &err)) {
+			warning(_("could not delete reference %s: %s"),
+				item->string, err.buf);
+			strbuf_reset(&err);
+		}
+	}
+
+	ret = ref_transaction_commit(transaction, &err);
+
+	if (ret) {
+		if (refnames->nr == 1)
+			error(_("could not delete reference %s: %s"),
+			      refnames->items[0].string, err.buf);
+		else
+			error(_("could not delete references: %s"), err.buf);
+	}
+
+	ref_transaction_free(transaction);
+	strbuf_release(&err);
+	return ret;
 }
 
 static int packed_pack_refs(struct ref_store *ref_store, unsigned int flags)
-- 
2.14.1
Previous: Michael HaggertyNext: Michael Haggerty
Message 9 of 15 in “Implement transactions for the packed ref store”
  1. 00/11 Implement transactions for the packed ref storeMichael Haggerty, Sep 8, 2017
  2. 01/11 packed-backend: don't adjust the reference count on lock/unlockMichael Haggerty, Sep 8, 2017
  3. 02/11 struct ref_transaction: add a place for backends to store dataMichael Haggerty, Sep 8, 2017
  4. 05/11 files_pack_refs(): use a reference transaction to write packed refsMichael Haggerty, Sep 8, 2017
  5. 03/11 packed_ref_store: implement reference transactionsMichael Haggerty, Sep 8, 2017
  6. 07/11 files_initial_transaction_commit(): use a transaction for packed refsMichael Haggerty, Sep 8, 2017
  7. 10/11 packed-backend: rip out some now-unused codeMichael Haggerty, Sep 8, 2017
  8. 11/11 files_transaction_finish(): delete reflogs before referencesMichael Haggerty, Sep 8, 2017
  9. 04/11 packed_delete_refs(): implement methodMichael Haggerty, Sep 8, 2017
  10. 09/11 files_ref_store: use a transaction to update packed refsMichael Haggerty, Sep 8, 2017
  11. 06/11 prune_refs(): also free the linked listMichael Haggerty, Sep 8, 2017
  12. 08/11 t1404: demonstrate two problems with reference transactionsMichael Haggerty, Sep 8, 2017
  13. Jeff KingSep 9, 2017
  14. Michael HaggertySep 10, 2017
  15. Jeff KingSep 9, 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.