提交 b0626608 编写于 作者: M Michael Haggerty 提交者: Junio C Hamano

Pass a (ref_cache *) to the resolve_gitlink_*() helper functions

And remove some redundant arguments from resolve_gitlink_packed_ref().
Signed-off-by: NMichael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 7f820bd9
...@@ -413,30 +413,25 @@ static struct ref_array *get_loose_refs(struct ref_cache *refs) ...@@ -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 * Called by resolve_gitlink_ref_recursive() after it failed to read
* from "name", which is "module/.git/<refname>". Find <refname> in * from the loose refs in ref_cache refs. Find <refname> in the
* the packed-refs file for the submodule. * 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) const char *refname, unsigned char *sha1)
{ {
int retval = -1;
struct ref_entry *ref; 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); ref = search_ref_array(array, refname);
if (ref != NULL) { if (ref == NULL)
memcpy(sha1, ref->sha1, 20); return -1;
retval = 0;
} memcpy(sha1, ref->sha1, 20);
return retval; 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, const char *refname, unsigned char *sha1,
int recursion) int recursion)
{ {
...@@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, ...@@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
memcpy(name + pathlen, refname, len+1); memcpy(name + pathlen, refname, len+1);
fd = open(name, O_RDONLY); fd = open(name, O_RDONLY);
if (fd < 0) 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); len = read(fd, buffer, sizeof(buffer)-1);
close(fd); close(fd);
...@@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, ...@@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
while (isspace(*p)) while (isspace(*p))
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 resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
{ {
int len = strlen(path), retval; int len = strlen(path), retval;
char *gitdir; char *submodule, *gitdir;
struct ref_cache *refs;
const char *tmp; const char *tmp;
while (len && path[len-1] == '/') while (len && path[len-1] == '/')
len--; len--;
if (!len) if (!len)
return -1; return -1;
submodule = xstrndup(path, len);
refs = get_ref_cache(submodule);
free(submodule);
gitdir = xmalloc(len + MAXREFLEN + 8); gitdir = xmalloc(len + MAXREFLEN + 8);
memcpy(gitdir, path, len); memcpy(gitdir, path, len);
memcpy(gitdir + len, "/.git", 6); memcpy(gitdir + len, "/.git", 6);
...@@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh ...@@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
} }
gitdir[len] = '/'; gitdir[len] = '/';
gitdir[++len] = '\0'; 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); free(gitdir);
return retval; return retval;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册