]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: add function to translate errors to strings
authorKarthik Nayak <karthik.188@gmail.com>
Mon, 19 May 2025 09:58:06 +0000 (11:58 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 19 May 2025 18:06:31 +0000 (11:06 -0700)
The commit 76e760b999 (refs: introduce enum-based transaction error
types, 2025-04-08) introduced enum-based transaction error types. The
refs transaction logic was also modified to propagate these errors. For
clients of the ref transaction system, it would be beneficial to provide
human readable messages for these errors.

There is already an existing mapping in 'builtin/update-ref.c', move it
to 'refs.c' as `ref_transaction_error_msg()` and use the same within the
'builtin/update-ref.c'.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/update-ref.c
refs.c
refs.h

index 2b1e336ba1a0da324b47bd621f773afc86c5e9dd..1e6131e04ad7455a11b6dc5b83f392311278e85c 100644 (file)
@@ -575,30 +575,7 @@ static void print_rejected_refs(const char *refname,
                                void *cb_data UNUSED)
 {
        struct strbuf sb = STRBUF_INIT;
-       const char *reason = "";
-
-       switch (err) {
-       case REF_TRANSACTION_ERROR_NAME_CONFLICT:
-               reason = "refname conflict";
-               break;
-       case REF_TRANSACTION_ERROR_CREATE_EXISTS:
-               reason = "reference already exists";
-               break;
-       case REF_TRANSACTION_ERROR_NONEXISTENT_REF:
-               reason = "reference does not exist";
-               break;
-       case REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE:
-               reason = "incorrect old value provided";
-               break;
-       case REF_TRANSACTION_ERROR_INVALID_NEW_VALUE:
-               reason = "invalid new value provided";
-               break;
-       case REF_TRANSACTION_ERROR_EXPECTED_SYMREF:
-               reason = "expected symref but found regular ref";
-               break;
-       default:
-               reason = "unkown failure";
-       }
+       const char *reason = ref_transaction_error_msg(err);
 
        strbuf_addf(&sb, "rejected %s %s %s %s\n", refname,
                    new_oid ? oid_to_hex(new_oid) : new_target,
diff --git a/refs.c b/refs.c
index dce5c49ca2ba65fd6a2974e38f67134215bee369..3d580d03bb55b7b8e1f741f97a6c78c084050362 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -3314,3 +3314,23 @@ int ref_update_expects_existing_old_ref(struct ref_update *update)
        return (update->flags & REF_HAVE_OLD) &&
                (!is_null_oid(&update->old_oid) || update->old_target);
 }
+
+const char *ref_transaction_error_msg(enum ref_transaction_error err)
+{
+       switch (err) {
+       case REF_TRANSACTION_ERROR_NAME_CONFLICT:
+               return "refname conflict";
+       case REF_TRANSACTION_ERROR_CREATE_EXISTS:
+               return "reference already exists";
+       case REF_TRANSACTION_ERROR_NONEXISTENT_REF:
+               return "reference does not exist";
+       case REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE:
+               return "incorrect old value provided";
+       case REF_TRANSACTION_ERROR_INVALID_NEW_VALUE:
+               return "invalid new value provided";
+       case REF_TRANSACTION_ERROR_EXPECTED_SYMREF:
+               return "expected symref but found regular ref";
+       default:
+               return "unknown failure";
+       }
+}
diff --git a/refs.h b/refs.h
index 46a6008e07f2624239139cd8b2ff712545f07d3f..2d58af3d88257a2d5c970db40c45580961511f81 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -907,6 +907,11 @@ void ref_transaction_for_each_rejected_update(struct ref_transaction *transactio
                                              ref_transaction_for_each_rejected_update_fn cb,
                                              void *cb_data);
 
+/*
+ * Translate errors to human readable error messages.
+ */
+const char *ref_transaction_error_msg(enum ref_transaction_error err);
+
 /*
  * Free `*transaction` and all associated data.
  */