Pass a (ref_cache *) to the resolve_gitlink_*() helper functions
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>
This commit is contained in:

committed by
Junio C Hamano

parent
7f820bd920
commit
b0626608ea
40
refs.c
40
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
|
* 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,
|
|||||||
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,
|
|||||||
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
|
|||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user