resolve_gitlink_ref(): implement using resolve_ref_recursively()

resolve_ref_recursively() can handle references in arbitrary files
reference stores, so use it to resolve "gitlink" (i.e., submodule)
references. Aside from removing redundant code, this allows submodule
lookups to benefit from the much more robust code that we use for
reading non-submodule references. And, since the code is now agnostic
about reference backends, it will work for any future references
backend (so move its definition to refs.c).

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael Haggerty
2016-09-04 18:08:22 +02:00
committed by Junio C Hamano
parent bd40dcda27
commit 424dcc7683
2 changed files with 24 additions and 67 deletions

24
refs.c
View File

@ -1299,6 +1299,30 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
resolve_flags, sha1, flags);
}
int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
{
int len = strlen(path);
struct strbuf submodule = STRBUF_INIT;
struct ref_store *refs;
int flags;
while (len && path[len-1] == '/')
len--;
if (!len)
return -1;
strbuf_add(&submodule, path, len);
refs = get_ref_store(submodule.buf);
strbuf_release(&submodule);
if (!refs)
return -1;
if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) ||
is_null_sha1(sha1))
return -1;
return 0;
}
/* A pointer to the ref_store for the main repository: */
static struct ref_store *main_ref_store;