Browse Source

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 <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Han-Wen Nienhuys 4 years ago committed by Junio C Hamano
parent
commit
e39620f07e
  1. 34
      refs/files-backend.c
  2. 6
      refs/refs-internal.h

34
refs/files-backend.c

@ -360,7 +360,6 @@ static int files_read_raw_ref(struct ref_store *ref_store, @@ -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,6 +464,21 @@ stat_ref: @@ -465,6 +464,21 @@ stat_ref:
close(fd);
strbuf_rtrim(&sb_contents);
buf = sb_contents.buf;

ret = parse_loose_ref_contents(buf, oid, referent, type);

out:
save_errno = errno;
strbuf_release(&sb_path);
strbuf_release(&sb_contents);
errno = save_errno;
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++;
@ -472,29 +486,19 @@ stat_ref: @@ -472,29 +486,19 @@ stat_ref:
strbuf_reset(referent);
strbuf_addstr(referent, buf);
*type |= REF_ISSYMREF;
ret = 0;
goto out;
return 0;
}

/*
* Please note that FETCH_HEAD has additional
* data after the sha.
* 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;
return -1;
}

ret = 0;

out:
save_errno = errno;
strbuf_release(&sb_path);
strbuf_release(&sb_contents);
errno = save_errno;
return ret;
return 0;
}

static void unlock_ref(struct ref_lock *lock)

6
refs/refs-internal.h

@ -674,6 +674,12 @@ struct ref_store { @@ -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.

Loading…
Cancel
Save