From: Han-Wen Nienhuys <hanwen@xxxxxxxxxx> This introduces refs_resolve_ref_unsafe_with_errno(), which makes the API contract for the errno output explicit. The implementation still relies on the global errno variable to ensure no side effects of this refactoring. In a follow-on commits, we will * migrate callers that need this error information * clear errno in refs_resolve_ref_unsafe() to make sure these other callers aren't using the error output accidentally. Signed-off-by: Han-Wen Nienhuys <hanwen@xxxxxxxxxx> Reviewed-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- refs.c | 12 ++++++++++++ refs/refs-internal.h | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/refs.c b/refs.c index bebe3f584da7..64e2d55adcfb 100644 --- a/refs.c +++ b/refs.c @@ -1781,6 +1781,18 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, return NULL; } +const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags, int *failure_errno) +{ + const char *result = refs_resolve_ref_unsafe(refs, refname, + resolve_flags, oid, flags); + *failure_errno = errno; + return result; +} + /* backend functions */ int refs_init_db(struct strbuf *err) { diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 904b2a9e51ae..eb97023658f8 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -153,6 +153,14 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, struct object_id *oid, struct strbuf *referent, unsigned int *type); +/* Like refs_resolve_ref_unsafe, but provide access to errno code that lead to a + * failure. */ +const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags, int *failure_errno); + /* * Write an error to `err` and return a nonzero value iff the same * refname appears multiple times in `refnames`. `refnames` must be -- gitgitgadget