]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: standardize output of refs_read_symbolic_ref
authorBence Ferdinandy <bence@ferdinandy.com>
Fri, 22 Nov 2024 12:28:44 +0000 (13:28 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Nov 2024 02:46:35 +0000 (11:46 +0900)
When the symbolic reference we want to read with refs_read_symbolic_ref
is actually not a symbolic reference, the files and the reftable
backends return different values (1 and -1 respectively). Standardize
the returned values so that 0 is success, -1 is a generic error and -2
is that the reference was actually non-symbolic.

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

diff --git a/refs.h b/refs.h
index 108dfc93b3428db491916ad8a55daea649d83ffd..22c2b45b8bb08f57d291aedd57cba3bb8e90bf14 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -83,6 +83,17 @@ int refs_read_ref_full(struct ref_store *refs, const char *refname,
 
 int refs_read_ref(struct ref_store *refs, const char *refname, struct object_id *oid);
 
+#define NOT_A_SYMREF -2
+
+/*
+ * Read the symbolic ref named "refname" and write its immediate referent into
+ * the provided buffer. Referent is left empty if "refname" is not a symbolic
+ * ref. It does not resolve the symbolic reference recursively in case the
+ * target is also a symbolic ref.
+ *
+ * Returns 0 on success, -2 if the "refname" is not a symbolic ref,
+ * -1 otherwise.
+ */
 int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
                           struct strbuf *referent);
 
index 0824c0b8a946909791da36ddb4171db4ad98913b..4cc43c32f282da3caf5ef0396ad3750d9246ecb8 100644 (file)
@@ -596,10 +596,9 @@ static int files_read_symbolic_ref(struct ref_store *ref_store, const char *refn
        unsigned int type;
 
        ret = read_ref_internal(ref_store, refname, &oid, referent, &type, &failure_errno, 1);
-       if (ret)
-               return ret;
-
-       return !(type & REF_ISSYMREF);
+       if (!ret && !(type & REF_ISSYMREF))
+               return NOT_A_SYMREF;
+       return ret;
 }
 
 int parse_loose_ref_contents(const struct git_hash_algo *algop,
index 2313c830d8facaa17b0b4b073df0de958023062a..1399fee61cef03df54786d5f5e3de946e73d8edd 100644 (file)
@@ -673,6 +673,11 @@ struct ref_storage_be {
 
        ref_iterator_begin_fn *iterator_begin;
        read_raw_ref_fn *read_raw_ref;
+
+       /*
+        * Please refer to `refs_read_symbolic_ref()` for the expected
+        * behaviour.
+        */
        read_symbolic_ref_fn *read_symbolic_ref;
 
        reflog_iterator_begin_fn *reflog_iterator_begin;
index 3c96fbf66f9e208b20eca16541fb07646fd5edb6..f74b8c4bb4542803235840c0374121277a8b6565 100644 (file)
@@ -830,10 +830,12 @@ static int reftable_be_read_symbolic_ref(struct ref_store *ref_store,
                return ret;
 
        ret = reftable_stack_read_ref(stack, refname, &ref);
-       if (ret == 0 && ref.value_type == REFTABLE_REF_SYMREF)
+       if (ret)
+               ret = -1;
+       else if (ref.value_type == REFTABLE_REF_SYMREF)
                strbuf_addstr(referent, ref.value.symref);
        else
-               ret = -1;
+               ret = NOT_A_SYMREF;
 
        reftable_ref_record_release(&ref);
        return ret;