Code

resolve_gitlink_ref_recursive(): change to work with struct ref_cache
authorMichael Haggerty <mhagger@alum.mit.edu>
Mon, 12 Dec 2011 05:38:20 +0000 (06:38 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Dec 2011 17:08:53 +0000 (09:08 -0800)
resolve_gitlink_ref() and resolve_gitlink_ref_recursive(), together,
basically duplicated the code in git_path_submodule().  So use that
function instead.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c

diff --git a/refs.c b/refs.c
index bf1f1643383ffb4418078223a919ef62a9005c6e..ba7a8b020b64db9699de8a201f6898c9c3a639e5 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -431,17 +431,19 @@ static int resolve_gitlink_packed_ref(struct ref_cache *refs,
 }
 
 static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
-                                        char *name, int pathlen,
                                         const char *refname, unsigned char *sha1,
                                         int recursion)
 {
-       int fd, len = strlen(refname);
+       int fd, len;
        char buffer[128], *p;
+       char *path;
 
-       if (recursion > MAXDEPTH || len > MAXREFLEN)
+       if (recursion > MAXDEPTH || strlen(refname) > MAXREFLEN)
                return -1;
-       memcpy(name + pathlen, refname, len+1);
-       fd = open(name, O_RDONLY);
+       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);
 
@@ -464,15 +466,14 @@ static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
        while (isspace(*p))
                p++;
 
-       return resolve_gitlink_ref_recursive(refs, name, pathlen, p, sha1, recursion+1);
+       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;
-       char *submodule, *gitdir;
+       char *submodule;
        struct ref_cache *refs;
-       const char *tmp;
 
        while (len && path[len-1] == '/')
                len--;
@@ -482,22 +483,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
        refs = get_ref_cache(submodule);
        free(submodule);
 
-       gitdir = xmalloc(len + MAXREFLEN + 8);
-       memcpy(gitdir, path, len);
-       memcpy(gitdir + len, "/.git", 6);
-       len += 5;
-
-       tmp = read_gitfile(gitdir);
-       if (tmp) {
-               free(gitdir);
-               len = strlen(tmp);
-               gitdir = xmalloc(len + MAXREFLEN + 3);
-               memcpy(gitdir, tmp, len);
-       }
-       gitdir[len] = '/';
-       gitdir[++len] = '\0';
-       retval = resolve_gitlink_ref_recursive(refs, gitdir, len, refname, sha1, 0);
-       free(gitdir);
+       retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
        return retval;
 }