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

[PATCH 2/5] refs.c: make add_packed_ref return an error instead of calling die

From
Ronnie Sahlberg <sahlberg@google.com>
Date
Jul 31, 2014, 21:25 UTC
Message-ID
<1406841910-3278-3-git-send-email-sahlberg@google.com>
In-Reply-To
<1406841910-3278-1-git-send-email-sahlberg@google.com>

Change add_packed_ref to return an error instead of calling die(). Update all callers to check the return value of add_packed_ref.

We can also skip checking the refname format since this function is now static and only called from the transaction code. If we are updating a ref and the refname is bad then we fail the transaction already in transaction_update_sha1(). For the ref deletion case the only caveat is that we would not want to move the badly named ref into the packed refs file during transaction commit. This again is not a problem since if the name is bad, then resolve_ref_unsafe() will fail which protects us from calling add_packed_ref() with the bad name.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
---
 refs.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/refs.c b/refs.c
index 65eee72..0aad8c8 100644
--- a/refs.c
+++ b/refs.c
@@ -1135,17 +1135,16 @@ static struct ref_dir *get_packed_refs(struct ref_cache *refs)
 	return get_packed_ref_dir(get_packed_ref_cache(refs));
 }
 
-static void add_packed_ref(const char *refname, const unsigned char *sha1)
+static int add_packed_ref(const char *refname, const unsigned char *sha1)
 {
 	struct packed_ref_cache *packed_ref_cache =
 		get_packed_ref_cache(&ref_cache);
 
 	if (!packed_ref_cache->lock)
-		die("internal error: packed refs not locked");
-	if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT))
-		die("Reference has invalid format: '%s'", refname);
+		return -1;
 	add_ref(get_packed_ref_dir(packed_ref_cache),
 		create_ref_entry(refname, sha1, REF_ISPACKED));
+	return 0;
 }
 
 /*
@@ -3666,7 +3665,13 @@ int transaction_commit(struct ref_transaction *transaction,
 					RESOLVE_REF_READING, NULL))
 			continue;
 
-		add_packed_ref(update->refname, sha1);
+		if (add_packed_ref(update->refname, sha1)) {
+			if (err)
+				strbuf_addf(err, "Failed to add %s to packed "
+					    "refs", update->refname);
+			ret = -1;
+			goto cleanup;
+		}
 		need_repack = 1;
 	}
 	if (need_repack) {
@@ -3778,7 +3783,13 @@ int transaction_commit(struct ref_transaction *transaction,
 
 		packed = get_packed_refs(&ref_cache);
 		remove_entry(packed, update->refname);
-		add_packed_ref(update->refname, update->new_sha1);
+		if (add_packed_ref(update->refname, update->new_sha1)) {
+			if (err)
+				strbuf_addf(err, "Failed to add %s to packed "
+					    "refs", update->refname);
+			ret = -1;
+			goto cleanup;
+		}
 		need_repack = 1;
 
 		try_remove_empty_parents((char *)update->refname);
-- 
2.0.1.523.g70700c9
Previous: Ronnie SahlbergNext: Ronnie Sahlberg
Message 3 of 7 in “ref-transactions-req-strbuf-err”
  1. 0/5 ref-transactions-req-strbuf-errRonnie Sahlberg, Jul 31, 2014
  2. 1/5 refs.c: replace the onerr argument in update_ref with a strbuf errRonnie Sahlberg, Jul 31, 2014
  3. 2/5 refs.c: make add_packed_ref return an error instead of calling dieRonnie Sahlberg, Jul 31, 2014
  4. 3/5 refs.c: make lock_packed_refs take an err argumentRonnie Sahlberg, Jul 31, 2014
  5. 4/5 refs.c: add an err argument to commit_packed_refsRonnie Sahlberg, Jul 31, 2014
  6. 5/5 refs.c: add an err argument to pack_refsRonnie Sahlberg, Jul 31, 2014
  7. Ronnie SahlbergAug 8, 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.