From: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>

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 <pclo...@gmail.com>
Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to