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 <sahlb...@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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to