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>
Michael Haggerty committed
Dec 12, 2011 at 06:38 UTC
b0626608ea80e636faaa030a35200d8e47be5564
1 file changed
+20
-20
refs.c
+20
-20
@@ -413,30 +413,25 @@ static struct ref_array *get_loose_refs(struct ref_cache *refs)
413
414
/*
415
* 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.
418
*/
419
-static int resolve_gitlink_packed_ref(char *name, int pathlen,
419
+static int resolve_gitlink_packed_ref(struct ref_cache *refs,
420
const char *refname, unsigned char *sha1)
421
{
422
- int retval = -1;
422
struct ref_entry *ref;
424
- struct ref_array *array;
423
+ struct ref_array *array = get_packed_refs(refs);
424
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));
425
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;
431
}
432
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,
435
const char *refname, unsigned char *sha1,
436
int recursion)
437
{
@@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
443
memcpy(name + pathlen, refname, len+1);
444
fd = open(name, O_RDONLY);
445
if (fd < 0)
451
- return resolve_gitlink_packed_ref(name, pathlen, refname, sha1);
446
+ return resolve_gitlink_packed_ref(refs, refname, sha1);
447
448
len = read(fd, buffer, sizeof(buffer)-1);
449
close(fd);
@@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen,
464
while (isspace(*p))
465
p++;
466
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);
468
}
469
470
int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
471
{
472
int len = strlen(path), retval;
478
- char *gitdir;
473
+ char *submodule, *gitdir;
474
+ struct ref_cache *refs;
475
const char *tmp;
476
477
while (len && path[len-1] == '/')
478
len--;
479
if (!len)
480
return -1;
481
+ submodule = xstrndup(path, len);
482
+ refs = get_ref_cache(submodule);
483
+ free(submodule);
484
+
485
gitdir = xmalloc(len + MAXREFLEN + 8);
486
memcpy(gitdir, path, len);
487
memcpy(gitdir + len, "/.git", 6);
@@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
496
}
497
gitdir[len] = '/';
498
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);
500
free(gitdir);
501
return retval;
502
}