@@ -828,59 +828,56 @@ static int match_name_with_pattern(const char *key, const char *name,
828828 return ret ;
829829}
830830
831- char * apply_refspecs (struct refspec * refspecs , int nr_refspec ,
832- const char * name )
831+ static int query_refspecs (struct refspec * refs , int ref_count , struct refspec * query )
833832{
834833 int i ;
835- char * ret = NULL ;
836- for (i = 0 ; i < nr_refspec ; i ++ ) {
837- struct refspec * refspec = refspecs + i ;
838- if (refspec -> pattern ) {
839- if (match_name_with_pattern (refspec -> src , name ,
840- refspec -> dst , & ret ))
841- return ret ;
842- } else if (!strcmp (refspec -> src , name ))
843- return strdup (refspec -> dst );
844- }
845- return NULL ;
846- }
834+ int find_src = !query -> src ;
847835
848- int remote_find_tracking (struct remote * remote , struct refspec * refspec )
849- {
850- int find_src = refspec -> src == NULL ;
851- char * needle , * * result ;
852- int i ;
836+ if (find_src && !query -> dst )
837+ return error ("query_refspecs: need either src or dst" );
853838
854- if (find_src ) {
855- if (!refspec -> dst )
856- return error ("find_tracking: need either src or dst" );
857- needle = refspec -> dst ;
858- result = & refspec -> src ;
859- } else {
860- needle = refspec -> src ;
861- result = & refspec -> dst ;
862- }
839+ for (i = 0 ; i < ref_count ; i ++ ) {
840+ struct refspec * refspec = & refs [i ];
841+ const char * key = find_src ? refspec -> dst : refspec -> src ;
842+ const char * value = find_src ? refspec -> src : refspec -> dst ;
843+ const char * needle = find_src ? query -> dst : query -> src ;
844+ char * * result = find_src ? & query -> src : & query -> dst ;
863845
864- for (i = 0 ; i < remote -> fetch_refspec_nr ; i ++ ) {
865- struct refspec * fetch = & remote -> fetch [i ];
866- const char * key = find_src ? fetch -> dst : fetch -> src ;
867- const char * value = find_src ? fetch -> src : fetch -> dst ;
868- if (!fetch -> dst )
846+ if (!refspec -> dst )
869847 continue ;
870- if (fetch -> pattern ) {
848+ if (refspec -> pattern ) {
871849 if (match_name_with_pattern (key , needle , value , result )) {
872- refspec -> force = fetch -> force ;
850+ query -> force = refspec -> force ;
873851 return 0 ;
874852 }
875853 } else if (!strcmp (needle , key )) {
876854 * result = xstrdup (value );
877- refspec -> force = fetch -> force ;
855+ query -> force = refspec -> force ;
878856 return 0 ;
879857 }
880858 }
881859 return -1 ;
882860}
883861
862+ char * apply_refspecs (struct refspec * refspecs , int nr_refspec ,
863+ const char * name )
864+ {
865+ struct refspec query ;
866+
867+ memset (& query , 0 , sizeof (struct refspec ));
868+ query .src = (char * )name ;
869+
870+ if (query_refspecs (refspecs , nr_refspec , & query ))
871+ return NULL ;
872+
873+ return query .dst ;
874+ }
875+
876+ int remote_find_tracking (struct remote * remote , struct refspec * refspec )
877+ {
878+ return query_refspecs (remote -> fetch , remote -> fetch_refspec_nr , refspec );
879+ }
880+
884881static struct ref * alloc_ref_with_prefix (const char * prefix , size_t prefixlen ,
885882 const char * name )
886883{
@@ -1681,36 +1678,47 @@ struct ref *guess_remote_head(const struct ref *head,
16811678}
16821679
16831680struct stale_heads_info {
1684- struct remote * remote ;
16851681 struct string_list * ref_names ;
16861682 struct ref * * stale_refs_tail ;
1683+ struct refspec * refs ;
1684+ int ref_count ;
16871685};
16881686
16891687static int get_stale_heads_cb (const char * refname ,
16901688 const unsigned char * sha1 , int flags , void * cb_data )
16911689{
16921690 struct stale_heads_info * info = cb_data ;
1693- struct refspec refspec ;
1694- memset (& refspec , 0 , sizeof (refspec ));
1695- refspec .dst = (char * )refname ;
1696- if (!remote_find_tracking (info -> remote , & refspec )) {
1697- if (!((flags & REF_ISSYMREF ) ||
1698- string_list_has_string (info -> ref_names , refspec .src ))) {
1699- struct ref * ref = make_linked_ref (refname , & info -> stale_refs_tail );
1700- hashcpy (ref -> new_sha1 , sha1 );
1701- }
1691+ struct refspec query ;
1692+ memset (& query , 0 , sizeof (struct refspec ));
1693+ query .dst = (char * )refname ;
1694+
1695+ if (query_refspecs (info -> refs , info -> ref_count , & query ))
1696+ return 0 ; /* No matches */
1697+
1698+ /*
1699+ * If we did find a suitable refspec and it's not a symref and
1700+ * it's not in the list of refs that currently exist in that
1701+ * remote we consider it to be stale.
1702+ */
1703+ if (!((flags & REF_ISSYMREF ) ||
1704+ string_list_has_string (info -> ref_names , query .src ))) {
1705+ struct ref * ref = make_linked_ref (refname , & info -> stale_refs_tail );
1706+ hashcpy (ref -> new_sha1 , sha1 );
17021707 }
1708+
1709+ free (query .src );
17031710 return 0 ;
17041711}
17051712
1706- struct ref * get_stale_heads (struct remote * remote , struct ref * fetch_map )
1713+ struct ref * get_stale_heads (struct refspec * refs , int ref_count , struct ref * fetch_map )
17071714{
17081715 struct ref * ref , * stale_refs = NULL ;
17091716 struct string_list ref_names = STRING_LIST_INIT_NODUP ;
17101717 struct stale_heads_info info ;
1711- info .remote = remote ;
17121718 info .ref_names = & ref_names ;
17131719 info .stale_refs_tail = & stale_refs ;
1720+ info .refs = refs ;
1721+ info .ref_count = ref_count ;
17141722 for (ref = fetch_map ; ref ; ref = ref -> next )
17151723 string_list_append (& ref_names , ref -> name );
17161724 sort_string_list (& ref_names );
0 commit comments