@@ -98,12 +98,14 @@ public HashSet<AssemblyLookupLocation> Restore()
9898 logger . LogInfo ( $ "Checking NuGet feed responsiveness: { checkNugetFeedResponsiveness } ") ;
9999 compilationInfoContainer . CompilationInfos . Add ( ( "NuGet feed responsiveness checked" , checkNugetFeedResponsiveness ? "1" : "0" ) ) ;
100100
101+ HashSet < string > ? explicitFeeds = null ;
102+
101103 try
102104 {
103- if ( checkNugetFeedResponsiveness && ! CheckFeeds ( ) )
105+ if ( checkNugetFeedResponsiveness && ! CheckFeeds ( out explicitFeeds ) )
104106 {
105107 // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too.
106- var unresponsiveMissingPackageLocation = DownloadMissingPackagesFromSpecificFeeds ( ) ;
108+ var unresponsiveMissingPackageLocation = DownloadMissingPackagesFromSpecificFeeds ( explicitFeeds ) ;
107109 return unresponsiveMissingPackageLocation is null
108110 ? [ ]
109111 : [ unresponsiveMissingPackageLocation ] ;
@@ -163,7 +165,7 @@ public HashSet<AssemblyLookupLocation> Restore()
163165 LogAllUnusedPackages ( dependencies ) ;
164166
165167 var missingPackageLocation = checkNugetFeedResponsiveness
166- ? DownloadMissingPackagesFromSpecificFeeds ( )
168+ ? DownloadMissingPackagesFromSpecificFeeds ( explicitFeeds )
167169 : DownloadMissingPackages ( ) ;
168170
169171 if ( missingPackageLocation is not null )
@@ -173,13 +175,24 @@ public HashSet<AssemblyLookupLocation> Restore()
173175 return assemblyLookupLocations ;
174176 }
175177
176- private List < string > GetReachableFallbackNugetFeeds ( )
178+ private List < string > GetReachableFallbackNugetFeeds ( HashSet < string > ? feedsFromNugetConfigs )
177179 {
178180 var fallbackFeeds = EnvironmentVariables . GetURLs ( EnvironmentVariableNames . FallbackNugetFeeds ) . ToHashSet ( ) ;
179181 if ( fallbackFeeds . Count == 0 )
180182 {
181183 fallbackFeeds . Add ( PublicNugetOrgFeed ) ;
182- logger . LogInfo ( $ "No fallback Nuget feeds specified. Using default feed: { PublicNugetOrgFeed } ") ;
184+ logger . LogInfo ( $ "No fallback Nuget feeds specified. Adding default feed: { PublicNugetOrgFeed } ") ;
185+
186+ var shouldAddNugetConfigFeeds = EnvironmentVariables . GetBooleanOptOut ( EnvironmentVariableNames . AddNugetConfigFeedsToFallback ) ;
187+ logger . LogInfo ( $ "Adding feeds from nuget.config to fallback restore: { shouldAddNugetConfigFeeds } ") ;
188+
189+ if ( shouldAddNugetConfigFeeds && feedsFromNugetConfigs ? . Count > 0 )
190+ {
191+ // There are some feeds in `feedsFromNugetConfigs` that have already been checked for reachability, we could skip those.
192+ // But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again is safer.
193+ fallbackFeeds . UnionWith ( feedsFromNugetConfigs ) ;
194+ logger . LogInfo ( $ "Using Nuget feeds from nuget.config files as fallback feeds: { string . Join ( ", " , feedsFromNugetConfigs . OrderBy ( f => f ) ) } ") ;
195+ }
183196 }
184197
185198 logger . LogInfo ( $ "Checking fallback Nuget feed reachability on feeds: { string . Join ( ", " , fallbackFeeds . OrderBy ( f => f ) ) } ") ;
@@ -194,6 +207,8 @@ private List<string> GetReachableFallbackNugetFeeds()
194207 logger . LogInfo ( $ "Reachable fallback Nuget feeds: { string . Join ( ", " , reachableFallbackFeeds . OrderBy ( f => f ) ) } ") ;
195208 }
196209
210+ compilationInfoContainer . CompilationInfos . Add ( ( "Reachable fallback Nuget feed count" , reachableFallbackFeeds . Count . ToString ( ) ) ) ;
211+
197212 return reachableFallbackFeeds ;
198213 }
199214
@@ -272,9 +287,9 @@ private void RestoreProjects(IEnumerable<string> projects, out ConcurrentBag<Dep
272287 compilationInfoContainer . CompilationInfos . Add ( ( "Failed project restore with package source error" , nugetSourceFailures . ToString ( ) ) ) ;
273288 }
274289
275- private AssemblyLookupLocation ? DownloadMissingPackagesFromSpecificFeeds ( )
290+ private AssemblyLookupLocation ? DownloadMissingPackagesFromSpecificFeeds ( HashSet < string > ? feedsFromNugetConfigs )
276291 {
277- var reachableFallbackFeeds = GetReachableFallbackNugetFeeds ( ) ;
292+ var reachableFallbackFeeds = GetReachableFallbackNugetFeeds ( feedsFromNugetConfigs ) ;
278293 if ( reachableFallbackFeeds . Count > 0 )
279294 {
280295 return DownloadMissingPackages ( fallbackNugetFeeds : reachableFallbackFeeds ) ;
@@ -623,10 +638,10 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount,
623638 return ( timeoutMilliSeconds , tryCount ) ;
624639 }
625640
626- private bool CheckFeeds ( )
641+ private bool CheckFeeds ( out HashSet < string > explicitFeeds )
627642 {
628643 logger . LogInfo ( "Checking Nuget feeds..." ) ;
629- var ( explicitFeeds , allFeeds ) = GetAllFeeds ( ) ;
644+ ( explicitFeeds , var allFeeds ) = GetAllFeeds ( ) ;
630645
631646 var excludedFeeds = EnvironmentVariables . GetURLs ( EnvironmentVariableNames . ExcludedNugetFeedsFromResponsivenessCheck )
632647 . ToHashSet ( ) ?? [ ] ;
0 commit comments