@@ -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
475470int 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