From: Han-Wen Nienhuys <hanwen@xxxxxxxxxx> The FETCH_HEAD ref must be stored in a file, regardless of the type of ref backend. This is because it can hold more than just a single ref. To accomodate FETCH_HEAD for alternate ref backends, read FETCH_HEAD from a file generically in refs_read_raw_ref() Signed-off-by: Han-Wen Nienhuys <hanwen@xxxxxxxxxx> --- refs.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/refs.c b/refs.c index 2dd851fe81..ab7d62e237 100644 --- a/refs.c +++ b/refs.c @@ -1634,11 +1634,36 @@ int for_each_rawref(each_ref_fn fn, void *cb_data) return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data); } +static int refs_read_fetch_head(struct ref_store *ref_store, + struct object_id *oid, struct strbuf *referent, + unsigned int *type) +{ + struct strbuf full_path = STRBUF_INIT; + struct strbuf content = STRBUF_INIT; + int result = -1; + strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, "FETCH_HEAD"); + + if (strbuf_read_file(&content, full_path.buf, 0) < 0) + goto done; + + result = parse_loose_ref_contents(content.buf, oid, referent, type); + +done: + strbuf_release(&full_path); + strbuf_release(&content); + return result; +} + int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, struct object_id *oid, struct strbuf *referent, unsigned int *type) { - return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, type); + if (!strcmp(refname, "FETCH_HEAD")) { + return refs_read_fetch_head(ref_store, oid, referent, type); + } + + return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, + type); } /* This function needs to return a meaningful errno on failure */ -- gitgitgadget