From: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> resolve_gitlink_ref_recursive() did about the same thing as parse_ref(), but didn't know as many tricks. It also had another random limit of 128 bytes for symrefs. So base resolve_gitlink_ref() on parse_ref() instead. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx> --- refs.c | 69 ++++++++++++++++++++++++++---------------------------------------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/refs.c b/refs.c index e1aa6a4..a7c8abd 100644 --- a/refs.c +++ b/refs.c @@ -1299,48 +1299,11 @@ static int resolve_gitlink_packed_ref(struct ref_cache *refs, return 0; } -static int resolve_gitlink_ref_recursive(struct ref_cache *refs, - const char *refname, unsigned char *sha1, - int recursion) -{ - int fd, len; - char buffer[128], *p; - char *path; - - if (recursion > MAXDEPTH) - return -1; - path = *refs->name - ? git_path_submodule(refs->name, "%s", refname) - : git_path("%s", refname); - fd = open(path, O_RDONLY); - if (fd < 0) - return resolve_gitlink_packed_ref(refs, refname, sha1); - - len = read(fd, buffer, sizeof(buffer)-1); - close(fd); - if (len < 0) - return -1; - while (len && isspace(buffer[len-1])) - len--; - buffer[len] = 0; - - /* Was it a detached head or an old-fashioned symlink? */ - if (!get_sha1_hex(buffer, sha1)) - return 0; - - /* Symref? */ - if (strncmp(buffer, "ref:", 4)) - return -1; - p = buffer + 4; - while (isspace(*p)) - p++; - - return resolve_gitlink_ref_recursive(refs, p, sha1, recursion+1); -} - int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1) { - int len = strlen(path), retval; + struct strbuf result = STRBUF_INIT; + int len = strlen(path), parseval, ret; + int depth = MAXDEPTH; char *submodule; struct ref_cache *refs; @@ -1352,8 +1315,30 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh refs = get_ref_cache(submodule); free(submodule); - retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0); - return retval; + strbuf_addstr(&result, refname); + do { + if (--depth < 0) { + errno = ELOOP; + ret = -1; + goto out; + } + path = *refs->name + ? git_path_submodule(refs->name, "%s", result.buf) + : git_path("%s", result.buf); + parseval = parse_ref(path, &result, sha1, NULL); + } while (!parseval); + + if (parseval == 1) { + ret = 0; + } else if (parseval == -2) { + ret = resolve_gitlink_packed_ref(refs, result.buf, sha1) ? -1 : 0; + } else { + ret = -1; + } + +out: + strbuf_release(&result); + return ret; } /* -- 2.1.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html