@@ -553,22 +553,47 @@ static struct ref *get_ref_map(struct remote *remote,
553553 struct ref * rm ;
554554 struct ref * ref_map = NULL ;
555555 struct ref * * tail = & ref_map ;
556+ /*
557+ * The --refmap command line option, if given, takes precedence
558+ * over remote.<name>.refmap.
559+ */
560+ struct refspec * effective_refmap =
561+ refmap .nr ? & refmap : remote ? & remote -> refmap : NULL ;
562+ struct refspec inferred_rs ;
563+ int infer_from_refmap = 0 ;
556564
557565 /* opportunistically-updated references: */
558566 struct ref * orefs = NULL , * * oref_tail = & orefs ;
559567
560568 struct hashmap existing_refs ;
561569 int existing_refs_populated = 0 ;
562570
571+ refspec_init_fetch (& inferred_rs , the_hash_algo );
572+
563573 filter_prefetch_refspec (rs );
564574 if (remote )
565575 filter_prefetch_refspec (& remote -> fetch );
566576
577+ if (!rs -> nr && remote && !remote -> fetch .nr &&
578+ effective_refmap && effective_refmap -> nr ) {
579+ struct string_list tracked = STRING_LIST_INIT_DUP ;
580+ struct string_list_item * item ;
581+
582+ branches_tracking_remote (the_repository , remote , & tracked );
583+ for_each_string_list_item (item , & tracked )
584+ refspec_append (& inferred_rs , item -> string );
585+ string_list_clear (& tracked , 0 );
586+
587+ rs = & inferred_rs ;
588+ infer_from_refmap = 1 ;
589+ }
590+
567591 if (rs -> nr ) {
568592 struct refspec * fetch_refspec ;
569593
570594 for (i = 0 ; i < rs -> nr ; i ++ ) {
571- get_fetch_map (remote_refs , & rs -> items [i ], & tail , 0 );
595+ get_fetch_map (remote_refs , & rs -> items [i ], & tail ,
596+ infer_from_refmap );
572597 if (rs -> items [i ].dst && rs -> items [i ].dst [0 ])
573598 * autotags = 1 ;
574599 }
@@ -596,13 +621,15 @@ static struct ref *get_ref_map(struct remote *remote,
596621 * by ref_remove_duplicates() in favor of one of these
597622 * opportunistic entries with FETCH_HEAD_IGNORE.
598623 */
599- if (refmap . nr )
600- fetch_refspec = & refmap ;
624+ if (effective_refmap && effective_refmap -> nr )
625+ fetch_refspec = effective_refmap ;
601626 else
602627 fetch_refspec = & remote -> fetch ;
603628
604629 for (i = 0 ; i < fetch_refspec -> nr ; i ++ )
605630 get_fetch_map (ref_map , & fetch_refspec -> items [i ], & oref_tail , 1 );
631+ } else if (infer_from_refmap ) {
632+ /* Already fully handled above. */
606633 } else if (refmap .nr ) {
607634 die ("--refmap option is only meaningful with command-line refspec(s)" );
608635 } else {
@@ -698,6 +725,7 @@ static struct ref *get_ref_map(struct remote *remote,
698725 if (existing_refs_populated )
699726 hashmap_clear_and_free (& existing_refs , struct refname_hash_entry , ent );
700727
728+ refspec_clear (& inferred_rs );
701729 return ref_map ;
702730}
703731
@@ -1970,6 +1998,26 @@ static void collect_updated_tips(struct oidset *tips, struct ref *ref_map)
19701998 }
19711999}
19722000
2001+ static int late_resolve_frh (const struct transport * transport ,
2002+ const struct fetch_config * config )
2003+ {
2004+ /*
2005+ * See remote.c's handling of remote.<name>.followRemoteHEAD
2006+ * for the analogous, still-unresolved case.
2007+ */
2008+
2009+ int follow_remote_head = FOLLOW_REMOTE_NEVER ;
2010+
2011+ if (transport -> remote -> follow_remote_head )
2012+ follow_remote_head = transport -> remote -> follow_remote_head ;
2013+ else if (config -> follow_remote_head_seen )
2014+ follow_remote_head =
2015+ get_follow_remote_head (config -> follow_remote_head_raw );
2016+ else
2017+ follow_remote_head = BUILTIN_FOLLOW_REMOTE_HEAD_DFLT ;
2018+ return follow_remote_head ;
2019+ }
2020+
19732021static int do_fetch (struct transport * transport ,
19742022 struct refspec * rs ,
19752023 const struct fetch_config * config ,
@@ -2007,31 +2055,48 @@ static int do_fetch(struct transport *transport,
20072055
20082056 if (rs -> nr ) {
20092057 refspec_ref_prefixes (rs , & transport_ls_refs_options .ref_prefixes );
2058+ } else if (transport -> remote -> fetch .nr ) {
2059+ struct string_list tracked = STRING_LIST_INIT_DUP ;
2060+ struct string_list_item * item ;
2061+
2062+ refspec_ref_prefixes (& transport -> remote -> fetch ,
2063+ & transport_ls_refs_options .ref_prefixes );
2064+
2065+ follow_remote_head = late_resolve_frh (transport , config );
2066+
2067+ /*
2068+ * The configured refspec may not cover the current
2069+ * branch's upstream (e.g. a narrowed -t refspec), so
2070+ * make sure we can still fetch it regardless.
2071+ */
2072+ collect_upstream_from_remote (the_repository , & tracked ,
2073+ transport -> remote , NULL );
2074+ for_each_string_list_item (item , & tracked )
2075+ strvec_push (& transport_ls_refs_options .ref_prefixes ,
2076+ item -> string );
2077+ string_list_clear (& tracked , 0 );
20102078 } else {
2011- struct branch * branch = branch_get (NULL );
2079+ /*
2080+ * The --refmap command line option, if given, takes
2081+ * precedence over remote.<name>.refmap.
2082+ */
2083+ struct refspec * effective_refmap = refmap .nr ? & refmap :
2084+ & transport -> remote -> refmap ;
2085+ struct string_list tracked = STRING_LIST_INIT_DUP ;
2086+ struct string_list_item * item ;
20122087
2013- if (transport -> remote -> fetch .nr ) {
2014- refspec_ref_prefixes (& transport -> remote -> fetch ,
2015- & transport_ls_refs_options .ref_prefixes );
2016- /*
2017- * See remote.c's handling of remote.<name>.followRemoteHEAD
2018- * for the analogous, still-unresolved case.
2019- */
2020- if (transport -> remote -> follow_remote_head )
2021- follow_remote_head = transport -> remote -> follow_remote_head ;
2022- else if (config -> follow_remote_head_seen )
2023- follow_remote_head = get_follow_remote_head (config -> follow_remote_head_raw );
2024- else
2025- follow_remote_head = BUILTIN_FOLLOW_REMOTE_HEAD_DFLT ;
2026- }
2027- if (branch && branch_has_merge_config (branch ) &&
2028- !strcmp (branch -> remote_name , transport -> remote -> name )) {
2029- int i ;
2030- for (i = 0 ; i < branch -> merge_nr ; i ++ ) {
2031- strvec_push (& transport_ls_refs_options .ref_prefixes ,
2032- branch -> merge [i ]-> src );
2033- }
2088+ if (effective_refmap -> nr ) {
2089+ branches_tracking_remote (the_repository ,
2090+ transport -> remote , & tracked );
2091+ follow_remote_head = late_resolve_frh (transport , config );
2092+ } else {
2093+ collect_upstream_from_remote (the_repository , & tracked ,
2094+ transport -> remote , NULL );
20342095 }
2096+ for_each_string_list_item (item , & tracked )
2097+ strvec_push (& transport_ls_refs_options .ref_prefixes ,
2098+ item -> string );
2099+ string_list_clear (& tracked , 0 );
20352100
20362101 /*
20372102 * If there are no refs specified to fetch, then we just
0 commit comments