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

[PATCH v3 24/30] packed_refs_lock(): report errors via a `struct strbuf *err`

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jul 1, 2017, 18:31 UTC
Message-ID
<f76dd91617965cdd2d72821de60bfcd1a70ab9bb.1498933362.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1498933362.git.mhagger@alum.mit.edu>

That way the callers don't have to come up with error messages themselves.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs/files-backend.c  |  6 ++----
 refs/packed-backend.c | 17 +++++++++++------
 refs/packed-backend.h |  6 +++---
 3 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 88de907148..8ea4e9ab05 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1096,7 +1096,7 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
 	struct ref_to_prune *refs_to_prune = NULL;
 	struct strbuf err = STRBUF_INIT;
 
-	packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR);
+	packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR, &err);
 
 	iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL, 0);
 	while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
@@ -2679,9 +2679,7 @@ static int files_initial_transaction_commit(struct ref_store *ref_store,
 		}
 	}
 
-	if (packed_refs_lock(refs->packed_ref_store, 0)) {
-		strbuf_addf(err, "unable to lock packed-refs file: %s",
-			    strerror(errno));
+	if (packed_refs_lock(refs->packed_ref_store, 0, err)) {
 		ret = TRANSACTION_GENERIC_ERROR;
 		goto cleanup;
 	}
diff --git a/refs/packed-backend.c b/refs/packed-backend.c
index cd214e07a1..78e877a9e3 100644
--- a/refs/packed-backend.c
+++ b/refs/packed-backend.c
@@ -515,7 +515,7 @@ static int write_packed_entry(FILE *fh, const char *refname,
 	return 0;
 }
 
-int packed_refs_lock(struct ref_store *ref_store, int flags)
+int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err)
 {
 	struct packed_ref_store *refs =
 		packed_downcast(ref_store, REF_STORE_WRITE | REF_STORE_MAIN,
@@ -537,9 +537,15 @@ int packed_refs_lock(struct ref_store *ref_store, int flags)
 	if (hold_lock_file_for_update_timeout(
 			    &refs->lock,
 			    refs->path,
-			    flags, timeout_value) < 0 ||
-	    close_lock_file(&refs->lock))
+			    flags, timeout_value) < 0) {
+		unable_to_lock_message(refs->path, errno, err);
+		return -1;
+	}
+
+	if (close_lock_file(&refs->lock)) {
+		strbuf_addf(err, "unable to close %s: %s", refs->path, strerror(errno));
 		return -1;
+	}
 
 	/*
 	 * Now that we hold the `packed-refs` lock, make sure that our
@@ -698,10 +704,9 @@ int repack_without_refs(struct ref_store *ref_store,
 	if (!needs_repacking)
 		return 0; /* no refname exists in packed refs */
 
-	if (packed_refs_lock(&refs->base, 0)) {
-		unable_to_lock_message(refs->path, errno, err);
+	if (packed_refs_lock(&refs->base, 0, err))
 		return -1;
-	}
+
 	packed = get_packed_refs(refs);
 
 	/* Remove refnames from the cache */
diff --git a/refs/packed-backend.h b/refs/packed-backend.h
index dbc00d3396..210e3f35ce 100644
--- a/refs/packed-backend.h
+++ b/refs/packed-backend.h
@@ -6,10 +6,10 @@ struct ref_store *packed_ref_store_create(const char *path,
 
 /*
  * Lock the packed-refs file for writing. Flags is passed to
- * hold_lock_file_for_update(). Return 0 on success. On errors, set
- * errno appropriately and return a nonzero value.
+ * hold_lock_file_for_update(). Return 0 on success. On errors, write
+ * an error message to `err` and return a nonzero value.
  */
-int packed_refs_lock(struct ref_store *ref_store, int flags);
+int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err);
 
 void add_packed_ref(struct ref_store *ref_store,
 		    const char *refname, const struct object_id *oid);
-- 
2.11.0
Previous: Michael HaggertyNext: Jeff King
Message 31 of 52 in “Create a reference backend for packed refs”
  1. 00/30 Create a reference backend for packed refsMichael Haggerty, Jul 1, 2017
  2. 01/30 t1408: add a test of stale packed refs covered by loose refsMichael Haggerty, Jul 1, 2017
  3. 03/30 packed_ref_store: new structMichael Haggerty, Jul 1, 2017
  4. 04/30 packed_ref_store: move `packed_refs_path` hereMichael Haggerty, Jul 1, 2017
  5. 02/30 add_packed_ref(): teach function to overwrite existing refsMichael Haggerty, Jul 1, 2017
  6. 06/30 clear_packed_ref_cache(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  7. 05/30 packed_ref_store: move `packed_refs_lock` member hereMichael Haggerty, Jul 1, 2017
  8. 09/30 get_packed_refs(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  9. 07/30 validate_packed_ref_cache(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  10. 12/30 commit_packed_refs(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  11. 08/30 get_packed_ref_cache(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  12. 10/30 add_packed_ref(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  13. 11/30 lock_packed_refs(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  14. 16/30 packed_peel_ref(): new function, extracted from `files_peel_ref()`Michael Haggerty, Jul 1, 2017
  15. 15/30 repack_without_refs(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  16. 14/30 get_packed_ref(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  17. 17/30 packed_ref_store: support iterationMichael Haggerty, Jul 1, 2017
  18. 19/30 packed-backend: new module for handling packed referencesMichael Haggerty, Jul 1, 2017
  19. 18/30 packed_read_raw_ref(): new function, replacing `resolve_packed_ref()`Michael Haggerty, Jul 1, 2017
  20. 22/30 commit_packed_refs(): use a staging file separate from the lockfileMichael Haggerty, Jul 1, 2017
  21. 20/30 packed_ref_store: make class into a subclass of `ref_store`Michael Haggerty, Jul 1, 2017
  22. 13/30 rollback_packed_refs(): take a `packed_ref_store *` parameterMichael Haggerty, Jul 1, 2017
  23. 23/30 packed_refs_lock(): function renamed from lock_packed_refs()Michael Haggerty, Jul 1, 2017
  24. 28/30 repack_without_refs(): don't lock or unlock the packed refsMichael Haggerty, Jul 1, 2017
  25. 29/30 t3210: add some tests of bogus packed-refs file contentsMichael Haggerty, Jul 1, 2017
  26. 26/30 clear_packed_ref_cache(): don't protest if the lock is heldMichael Haggerty, Jul 1, 2017
  27. 30/30 read_packed_refs(): die if `packed-refs` contains bogus dataMichael Haggerty, Jul 1, 2017
  28. 27/30 commit_packed_refs(): remove call to `packed_refs_unlock()`Michael Haggerty, Jul 1, 2017
  29. 21/30 commit_packed_refs(): report errors rather than dyingMichael Haggerty, Jul 1, 2017
  30. 25/30 packed_refs_unlock(), packed_refs_is_locked(): new functionsMichael Haggerty, Jul 1, 2017
  31. 24/30 packed_refs_lock(): report errors via a `struct strbuf *err`Michael Haggerty, Jul 1, 2017
  32. Jeff KingJul 5, 2017
  33. Stefan BellerJul 20, 2017
  34. Jonathan NiederJul 20, 2017
  35. packed_ref_store: handle a packed-refs file that is a symlinkMichael Haggerty, Jul 26, 2017
  36. Stefan BellerJul 27, 2017
  37. Jonathan NiederJul 27, 2017
  38. Michael HaggertyJul 27, 2017
  39. Junio C HamanoJul 27, 2017
  40. Jeff KingJul 27, 2017
  41. Junio C HamanoJul 27, 2017
  42. Michael HaggertyJul 28, 2017
  43. Ævar Arnfjörð BjarmasonMay 31, 2021
  44. Jeff KingJun 3, 2021
  45. t: use portable wrapper for readlink(1)Jeff King, Jun 3, 2021
  46. Ævar Arnfjörð BjarmasonJun 4, 2021
  47. Felipe ContrerasJun 3, 2021
  48. Jeff KingJun 3, 2021
  49. Felipe ContrerasJun 3, 2021
  50. Ævar Arnfjörð BjarmasonJun 4, 2021
  51. Felipe ContrerasJun 5, 2021
  52. Ævar Arnfjörð BjarmasonJun 4, 2021

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.