resolve_gitlink_ref_recursive(): change to work with struct ref_cache

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>
This commit is contained in:
Michael Haggerty
2011-12-12 06:38:20 +01:00
committed by Junio C Hamano
parent b0626608ea
commit 064d51dc40

34
refs.c
View File

@ -431,17 +431,19 @@ static int resolve_gitlink_packed_ref(struct ref_cache *refs,
} }
static int resolve_gitlink_ref_recursive(struct ref_cache *refs, 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)
{ {
int fd, len = strlen(refname); int fd, len;
char buffer[128], *p; char buffer[128], *p;
char *path;
if (recursion > MAXDEPTH || len > MAXREFLEN) if (recursion > MAXDEPTH || strlen(refname) > MAXREFLEN)
return -1; return -1;
memcpy(name + pathlen, refname, len+1); path = *refs->name
fd = open(name, O_RDONLY); ? git_path_submodule(refs->name, "%s", refname)
: git_path("%s", refname);
fd = open(path, O_RDONLY);
if (fd < 0) if (fd < 0)
return resolve_gitlink_packed_ref(refs, refname, sha1); 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)) while (isspace(*p))
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 resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
{ {
int len = strlen(path), retval; int len = strlen(path), retval;
char *submodule, *gitdir; char *submodule;
struct ref_cache *refs; struct ref_cache *refs;
const char *tmp;
while (len && path[len-1] == '/') while (len && path[len-1] == '/')
len--; len--;
@ -482,22 +483,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
refs = get_ref_cache(submodule); refs = get_ref_cache(submodule);
free(submodule); free(submodule);
gitdir = xmalloc(len + MAXREFLEN + 8); retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
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);
return retval; return retval;
} }