Skip to content

Commit b062660

Browse files
mhaggergitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7f820bd commit b062660

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

refs.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -413,30 +413,25 @@ static struct ref_array *get_loose_refs(struct ref_cache *refs)
413413

414414
/*
415415
* Called by resolve_gitlink_ref_recursive() after it failed to read
416-
* from "name", which is "module/.git/<refname>". Find <refname> in
417-
* the packed-refs file for the submodule.
416+
* from the loose refs in ref_cache refs. Find <refname> in the
417+
* packed-refs file for the submodule.
418418
*/
419-
static int resolve_gitlink_packed_ref(char *name, int pathlen,
419+
static int resolve_gitlink_packed_ref(struct ref_cache *refs,
420420
const char *refname, unsigned char *sha1)
421421
{
422-
int retval = -1;
423422
struct ref_entry *ref;
424-
struct ref_array *array;
423+
struct ref_array *array = get_packed_refs(refs);
425424

426-
/* being defensive: resolve_gitlink_ref() did this for us */
427-
if (pathlen < 6 || memcmp(name + pathlen - 6, "/.git/", 6))
428-
die("Oops");
429-
name[pathlen - 6] = '\0'; /* make it path to the submodule */
430-
array = get_packed_refs(get_ref_cache(name));
431425
ref = search_ref_array(array, refname);
432-
if (ref != NULL) {
433-
memcpy(sha1, ref->sha1, 20);
434-
retval = 0;
435-
}
436-
return retval;
426+
if (ref == NULL)
427+
return -1;
428+
429+
memcpy(sha1, ref->sha1, 20);
430+
return 0;
437431
}
438432

439-
static int resolve_gitlink_ref_recursive(char *name, int pathlen,
433+
static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
434+
char *name, int pathlen,
440435
const char *refname, unsigned char *sha1,
441436
int recursion)
442437
{
@@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
448443
memcpy(name + pathlen, refname, len+1);
449444
fd = open(name, O_RDONLY);
450445
if (fd < 0)
451-
return resolve_gitlink_packed_ref(name, pathlen, refname, sha1);
446+
return resolve_gitlink_packed_ref(refs, refname, sha1);
452447

453448
len = read(fd, buffer, sizeof(buffer)-1);
454449
close(fd);
@@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
469464
while (isspace(*p))
470465
p++;
471466

472-
return resolve_gitlink_ref_recursive(name, pathlen, p, sha1, recursion+1);
467+
return resolve_gitlink_ref_recursive(refs, name, pathlen, p, sha1, recursion+1);
473468
}
474469

475470
int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
476471
{
477472
int len = strlen(path), retval;
478-
char *gitdir;
473+
char *submodule, *gitdir;
474+
struct ref_cache *refs;
479475
const char *tmp;
480476

481477
while (len && path[len-1] == '/')
482478
len--;
483479
if (!len)
484480
return -1;
481+
submodule = xstrndup(path, len);
482+
refs = get_ref_cache(submodule);
483+
free(submodule);
484+
485485
gitdir = xmalloc(len + MAXREFLEN + 8);
486486
memcpy(gitdir, path, len);
487487
memcpy(gitdir + len, "/.git", 6);
@@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
496496
}
497497
gitdir[len] = '/';
498498
gitdir[++len] = '\0';
499-
retval = resolve_gitlink_ref_recursive(gitdir, len, refname, sha1, 0);
499+
retval = resolve_gitlink_ref_recursive(refs, gitdir, len, refname, sha1, 0);
500500
free(gitdir);
501501
return retval;
502502
}

0 commit comments

Comments
 (0)