Code

Pass a (ref_cache *) to the resolve_gitlink_*() helper functions
authorMichael Haggerty <mhagger@alum.mit.edu>
Mon, 12 Dec 2011 05:38:19 +0000 (06:38 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Dec 2011 17:08:53 +0000 (09:08 -0800)
And remove some redundant arguments from resolve_gitlink_packed_ref().

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 91ec3954b78d59000cad99fdeea2761d1f0831b4..bf1f1643383ffb4418078223a919ef62a9005c6e 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -413,30 +413,25 @@ static struct ref_array *get_loose_refs(struct ref_cache *refs)
 
 /*
  * Called by resolve_gitlink_ref_recursive() after it failed to read
- * from "name", which is "module/.git/<refname>". Find <refname> in
- * the packed-refs file for the submodule.
+ * from the loose refs in ref_cache refs. Find <refname> in the
+ * packed-refs file for the submodule.
  */
-static int resolve_gitlink_packed_ref(char *name, int pathlen,
+static int resolve_gitlink_packed_ref(struct ref_cache *refs,
                                      const char *refname, unsigned char *sha1)
 {
-       int retval = -1;
        struct ref_entry *ref;
-       struct ref_array *array;
+       struct ref_array *array = get_packed_refs(refs);
 
-       /* being defensive: resolve_gitlink_ref() did this for us */
-       if (pathlen < 6 || memcmp(name + pathlen - 6, "/.git/", 6))
-               die("Oops");
-       name[pathlen - 6] = '\0'; /* make it path to the submodule */
-       array = get_packed_refs(get_ref_cache(name));
        ref = search_ref_array(array, refname);
-       if (ref != NULL) {
-               memcpy(sha1, ref->sha1, 20);
-               retval = 0;
-       }
-       return retval;
+       if (ref == NULL)
+               return -1;
+
+       memcpy(sha1, ref->sha1, 20);
+       return 0;
 }
 
-static int resolve_gitlink_ref_recursive(char *name, int pathlen,
+static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
+                                        char *name, int pathlen,
                                         const char *refname, unsigned char *sha1,
                                         int recursion)
 {
@@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
        memcpy(name + pathlen, refname, len+1);
        fd = open(name, O_RDONLY);
        if (fd < 0)
-               return resolve_gitlink_packed_ref(name, pathlen, refname, sha1);
+               return resolve_gitlink_packed_ref(refs, refname, sha1);
 
        len = read(fd, buffer, sizeof(buffer)-1);
        close(fd);
@@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
        while (isspace(*p))
                p++;
 
-       return resolve_gitlink_ref_recursive(name, pathlen, p, sha1, recursion+1);
+       return resolve_gitlink_ref_recursive(refs, name, pathlen, p, sha1, recursion+1);
 }
 
 int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
 {
        int len = strlen(path), retval;
-       char *gitdir;
+       char *submodule, *gitdir;
+       struct ref_cache *refs;
        const char *tmp;
 
        while (len && path[len-1] == '/')
                len--;
        if (!len)
                return -1;
+       submodule = xstrndup(path, len);
+       refs = get_ref_cache(submodule);
+       free(submodule);
+
        gitdir = xmalloc(len + MAXREFLEN + 8);
        memcpy(gitdir, path, len);
        memcpy(gitdir + len, "/.git", 6);
@@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
        }
        gitdir[len] = '/';
        gitdir[++len] = '\0';
-       retval = resolve_gitlink_ref_recursive(gitdir, len, refname, sha1, 0);
+       retval = resolve_gitlink_ref_recursive(refs, gitdir, len, refname, sha1, 0);
        free(gitdir);
        return retval;
 }