diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2014-10-15 17:06:21 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-10-15 15:26:37 -0700 |
commit | ae922f1983bb2c0b1aeaf34a8e51faed40cfc6ac (patch) | |
tree | 785d30459fd6bb67110deea285f54b93f0a5d898 | |
parent | c9261977441b4e4b9b718f20026f1074a5d20ec3 (diff) | |
download | git-ae922f1983bb2c0b1aeaf34a8e51faed40cfc6ac.tar.gz |
refs.c: rewrite resolve_gitlink_ref() to use parse_ref()
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@gmail.com>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | refs.c | 69 |
1 files changed, 27 insertions, 42 deletions
@@ -1301,48 +1301,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; @@ -1354,8 +1317,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; } /* |