From e39620f07e092f36642ab97c6ced47be5b609d58 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 19 Aug 2020 14:27:55 +0000 Subject: [PATCH] refs: split off reading loose ref data in separate function This prepares for handling FETCH_HEAD (which is not a regular ref) separately from the ref backend. Signed-off-by: Han-Wen Nienhuys Signed-off-by: Junio C Hamano --- refs/files-backend.c | 50 ++++++++++++++++++++++++-------------------- refs/refs-internal.h | 6 ++++++ 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/refs/files-backend.c b/refs/files-backend.c index 985631f33e..3a3573986f 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -360,7 +360,6 @@ static int files_read_raw_ref(struct ref_store *ref_store, struct strbuf sb_path = STRBUF_INIT; const char *path; const char *buf; - const char *p; struct stat st; int fd; int ret = -1; @@ -465,29 +464,8 @@ stat_ref: close(fd); strbuf_rtrim(&sb_contents); buf = sb_contents.buf; - if (skip_prefix(buf, "ref:", &buf)) { - while (isspace(*buf)) - buf++; - strbuf_reset(referent); - strbuf_addstr(referent, buf); - *type |= REF_ISSYMREF; - ret = 0; - goto out; - } - - /* - * Please note that FETCH_HEAD has additional - * data after the sha. - */ - if (parse_oid_hex(buf, oid, &p) || - (*p != '\0' && !isspace(*p))) { - *type |= REF_ISBROKEN; - errno = EINVAL; - goto out; - } - - ret = 0; + ret = parse_loose_ref_contents(buf, oid, referent, type); out: save_errno = errno; @@ -497,6 +475,32 @@ out: return ret; } +int parse_loose_ref_contents(const char *buf, struct object_id *oid, + struct strbuf *referent, unsigned int *type) +{ + const char *p; + if (skip_prefix(buf, "ref:", &buf)) { + while (isspace(*buf)) + buf++; + + strbuf_reset(referent); + strbuf_addstr(referent, buf); + *type |= REF_ISSYMREF; + return 0; + } + + /* + * FETCH_HEAD has additional data after the sha. + */ + if (parse_oid_hex(buf, oid, &p) || + (*p != '\0' && !isspace(*p))) { + *type |= REF_ISBROKEN; + errno = EINVAL; + return -1; + } + return 0; +} + static void unlock_ref(struct ref_lock *lock) { rollback_lock_file(&lock->lk); diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 357359a0be..24d79fb5c1 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -674,6 +674,12 @@ struct ref_store { const struct ref_storage_be *be; }; +/* + * Parse contents of a loose ref file. + */ +int parse_loose_ref_contents(const char *buf, struct object_id *oid, + struct strbuf *referent, unsigned int *type); + /* * Fill in the generic part of refs and add it to our collection of * reference stores.