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