]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: add TRANSACTION_CREATE_EXISTS error
authorBence Ferdinandy <bence@ferdinandy.com>
Fri, 22 Nov 2024 12:28:48 +0000 (13:28 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Nov 2024 02:46:36 +0000 (11:46 +0900)
Currently there is only one special error for transaction, for when
there is a naming conflict, all other errors are dumped under a generic
error. Add a new special error case for when the caller requests the
reference to be updated only when it does not yet exist and the
reference actually does exist.

Signed-off-by: Bence Ferdinandy <bence@ferdinandy.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.h
refs/files-backend.c
refs/reftable-backend.c

diff --git a/refs.h b/refs.h
index 5c46ac9f3435ccf9cbed034e42c6dd583d9f346e..b243739e4b4f1a3f8a2074fd192376015b4a0858 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -773,8 +773,10 @@ int ref_transaction_verify(struct ref_transaction *transaction,
 
 /* Naming conflict (for example, the ref names A and A/B conflict). */
 #define TRANSACTION_NAME_CONFLICT -1
+/* When only creation was requested, but the ref already exists. */
+#define TRANSACTION_CREATE_EXISTS -2
 /* All other errors. */
-#define TRANSACTION_GENERIC_ERROR -2
+#define TRANSACTION_GENERIC_ERROR -3
 
 /*
  * Perform the preparatory stages of committing `transaction`. Acquire
index 4cc43c32f282da3caf5ef0396ad3750d9246ecb8..23ae74089d5288e28b6c59cd5ea2db7abd92b010 100644 (file)
@@ -2501,14 +2501,18 @@ static int split_symref_update(struct ref_update *update,
 static int check_old_oid(struct ref_update *update, struct object_id *oid,
                         struct strbuf *err)
 {
+       int ret = TRANSACTION_GENERIC_ERROR;
+
        if (!(update->flags & REF_HAVE_OLD) ||
                   oideq(oid, &update->old_oid))
                return 0;
 
-       if (is_null_oid(&update->old_oid))
+       if (is_null_oid(&update->old_oid)) {
                strbuf_addf(err, "cannot lock ref '%s': "
                            "reference already exists",
                            ref_update_original_update_refname(update));
+               ret = TRANSACTION_CREATE_EXISTS;
+       }
        else if (is_null_oid(oid))
                strbuf_addf(err, "cannot lock ref '%s': "
                            "reference is missing but expected %s",
@@ -2521,7 +2525,7 @@ static int check_old_oid(struct ref_update *update, struct object_id *oid,
                            oid_to_hex(oid),
                            oid_to_hex(&update->old_oid));
 
-       return -1;
+       return ret;
 }
 
 /*
@@ -2601,9 +2605,11 @@ static int lock_ref_for_update(struct files_ref_store *refs,
                                        ret = TRANSACTION_GENERIC_ERROR;
                                        goto out;
                                }
-                       } else if  (check_old_oid(update, &lock->old_oid, err)) {
-                               ret = TRANSACTION_GENERIC_ERROR;
-                               goto out;
+                       } else {
+                               ret = check_old_oid(update, &lock->old_oid, err);
+                               if  (ret) {
+                                       goto out;
+                               }
                        }
                } else {
                        /*
@@ -2634,9 +2640,11 @@ static int lock_ref_for_update(struct files_ref_store *refs,
                                    update->old_target);
                        ret = TRANSACTION_GENERIC_ERROR;
                        goto out;
-               } else if  (check_old_oid(update, &lock->old_oid, err)) {
-                       ret = TRANSACTION_GENERIC_ERROR;
-                       goto out;
+               } else {
+                       ret = check_old_oid(update, &lock->old_oid, err);
+                       if  (ret) {
+                               goto out;
+                       }
                }
 
                /*
index f74b8c4bb4542803235840c0374121277a8b6565..d764c2c3afaadedc201c16ab80d24d3e14dfd1c2 100644 (file)
@@ -1208,10 +1208,13 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
                                goto done;
                        }
                } else if ((u->flags & REF_HAVE_OLD) && !oideq(&current_oid, &u->old_oid)) {
-                       if (is_null_oid(&u->old_oid))
+                       ret = TRANSACTION_NAME_CONFLICT;
+                       if (is_null_oid(&u->old_oid)) {
                                strbuf_addf(err, _("cannot lock ref '%s': "
                                                   "reference already exists"),
                                            ref_update_original_update_refname(u));
+                               ret = TRANSACTION_CREATE_EXISTS;
+                       }
                        else if (is_null_oid(&current_oid))
                                strbuf_addf(err, _("cannot lock ref '%s': "
                                                   "reference is missing but expected %s"),
@@ -1223,7 +1226,6 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
                                            ref_update_original_update_refname(u),
                                            oid_to_hex(&current_oid),
                                            oid_to_hex(&u->old_oid));
-                       ret = -1;
                        goto done;
                }