@@ -828,59 +828,56 @@ static int match_name_with_pattern(const char *key, const char *name,
828
828
return ret ;
829
829
}
830
830
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 )
833
832
{
834
833
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 ;
847
835
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" );
853
838
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 ;
863
845
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 )
869
847
continue ;
870
- if (fetch -> pattern ) {
848
+ if (refspec -> pattern ) {
871
849
if (match_name_with_pattern (key , needle , value , result )) {
872
- refspec -> force = fetch -> force ;
850
+ query -> force = refspec -> force ;
873
851
return 0 ;
874
852
}
875
853
} else if (!strcmp (needle , key )) {
876
854
* result = xstrdup (value );
877
- refspec -> force = fetch -> force ;
855
+ query -> force = refspec -> force ;
878
856
return 0 ;
879
857
}
880
858
}
881
859
return -1 ;
882
860
}
883
861
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
+
884
881
static struct ref * alloc_ref_with_prefix (const char * prefix , size_t prefixlen ,
885
882
const char * name )
886
883
{
@@ -1681,36 +1678,47 @@ struct ref *guess_remote_head(const struct ref *head,
1681
1678
}
1682
1679
1683
1680
struct stale_heads_info {
1684
- struct remote * remote ;
1685
1681
struct string_list * ref_names ;
1686
1682
struct ref * * stale_refs_tail ;
1683
+ struct refspec * refs ;
1684
+ int ref_count ;
1687
1685
};
1688
1686
1689
1687
static int get_stale_heads_cb (const char * refname ,
1690
1688
const unsigned char * sha1 , int flags , void * cb_data )
1691
1689
{
1692
1690
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 );
1702
1707
}
1708
+
1709
+ free (query .src );
1703
1710
return 0 ;
1704
1711
}
1705
1712
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 )
1707
1714
{
1708
1715
struct ref * ref , * stale_refs = NULL ;
1709
1716
struct string_list ref_names = STRING_LIST_INIT_NODUP ;
1710
1717
struct stale_heads_info info ;
1711
- info .remote = remote ;
1712
1718
info .ref_names = & ref_names ;
1713
1719
info .stale_refs_tail = & stale_refs ;
1720
+ info .refs = refs ;
1721
+ info .ref_count = ref_count ;
1714
1722
for (ref = fetch_map ; ref ; ref = ref -> next )
1715
1723
string_list_append (& ref_names , ref -> name );
1716
1724
sort_string_list (& ref_names );
0 commit comments