@@ -98,11 +98,16 @@ private List<string> GetReachableFallbackNugetFeeds()
98
98
fallbackFeeds . Add ( PublicNugetFeed ) ;
99
99
}
100
100
101
- logger . LogInfo ( "Checking fallback Nuget feed reachability" ) ;
102
- var reachableFallbackFeeds = fallbackFeeds . Where ( feed => IsFeedReachable ( feed ) ) . ToList ( ) ;
101
+ logger . LogInfo ( $ "Checking fallback Nuget feed reachability on feeds: { string . Join ( ", " , fallbackFeeds . OrderBy ( f => f ) ) } ") ;
102
+ var ( initialTimeout , tryCount ) = GetFeedRequestSettings ( isFallback : true ) ;
103
+ var reachableFallbackFeeds = fallbackFeeds . Where ( feed => IsFeedReachable ( feed , initialTimeout , tryCount , allowExceptions : false ) ) . ToList ( ) ;
103
104
if ( reachableFallbackFeeds . Count == 0 )
104
105
{
105
- logger . LogWarning ( "No fallback Nuget feeds are reachable. Skipping fallback Nuget package restoration." ) ;
106
+ logger . LogWarning ( "No fallback Nuget feeds are reachable." ) ;
107
+ }
108
+ else
109
+ {
110
+ logger . LogInfo ( $ "Reachable fallback Nuget feeds: { string . Join ( ", " , reachableFallbackFeeds . OrderBy ( f => f ) ) } ") ;
106
111
}
107
112
108
113
return reachableFallbackFeeds ;
@@ -183,11 +188,15 @@ private void DownloadMissingPackagesFromSpecificFeeds(List<FileInfo> allNonBinar
183
188
var reachableFallbackFeeds = GetReachableFallbackNugetFeeds ( ) ;
184
189
if ( reachableFallbackFeeds . Count > 0 )
185
190
{
186
- DownloadMissingPackages ( allNonBinaryFiles , dllLocations , withNugetConfig : false , fallbackNugetFeeds : reachableFallbackFeeds ) ;
191
+ DownloadMissingPackages ( allNonBinaryFiles , dllLocations , withNugetConfigFromSrc : false , fallbackNugetFeeds : reachableFallbackFeeds ) ;
192
+ }
193
+ else
194
+ {
195
+ logger . LogWarning ( "Skipping download of missing packages from specific feeds as no fallback Nuget feeds are reachable." ) ;
187
196
}
188
197
}
189
198
190
- private void DownloadMissingPackages ( List < FileInfo > allFiles , HashSet < AssemblyLookupLocation > dllLocations , bool withNugetConfig = true , IEnumerable < string > ? fallbackNugetFeeds = null )
199
+ private void DownloadMissingPackages ( List < FileInfo > allFiles , HashSet < AssemblyLookupLocation > dllLocations , bool withNugetConfigFromSrc = true , IEnumerable < string > ? fallbackNugetFeeds = null )
191
200
{
192
201
var alreadyDownloadedPackages = GetRestoredPackageDirectoryNames ( packageDirectory . DirInfo ) ;
193
202
var alreadyDownloadedLegacyPackages = GetRestoredLegacyPackageNames ( ) ;
@@ -221,7 +230,7 @@ private void DownloadMissingPackages(List<FileInfo> allFiles, HashSet<AssemblyLo
221
230
222
231
logger . LogInfo ( $ "Found { notYetDownloadedPackages . Count } packages that are not yet restored") ;
223
232
using var tempDir = new TemporaryDirectory ( ComputeTempDirectory ( sourceDir . FullName , "nugetconfig" ) ) ;
224
- var nugetConfig = withNugetConfig
233
+ var nugetConfig = withNugetConfigFromSrc
225
234
? GetNugetConfig ( allFiles )
226
235
: CreateFallbackNugetConfig ( fallbackNugetFeeds , tempDir . DirInfo . FullName ) ;
227
236
@@ -232,7 +241,7 @@ private void DownloadMissingPackages(List<FileInfo> allFiles, HashSet<AssemblyLo
232
241
233
242
Parallel . ForEach ( notYetDownloadedPackages , new ParallelOptions { MaxDegreeOfParallelism = threads } , package =>
234
243
{
235
- var success = TryRestorePackageManually ( package . Name , nugetConfig , package . PackageReferenceSource ) ;
244
+ var success = TryRestorePackageManually ( package . Name , nugetConfig , package . PackageReferenceSource , tryWithoutNugetConfig : withNugetConfigFromSrc ) ;
236
245
if ( ! success )
237
246
{
238
247
return ;
@@ -254,6 +263,7 @@ private void DownloadMissingPackages(List<FileInfo> allFiles, HashSet<AssemblyLo
254
263
if ( fallbackNugetFeeds is null )
255
264
{
256
265
// We're not overriding the inherited Nuget feeds
266
+ logger . LogInfo ( "No fallback Nuget feeds provided. Not creating a fallback nuget.config file." ) ;
257
267
return null ;
258
268
}
259
269
@@ -365,7 +375,7 @@ private static IEnumerable<string> GetRestoredPackageDirectoryNames(DirectoryInf
365
375
. Select ( d => Path . GetFileName ( d ) . ToLowerInvariant ( ) ) ;
366
376
}
367
377
368
- private bool TryRestorePackageManually ( string package , string ? nugetConfig , PackageReferenceSource packageReferenceSource = PackageReferenceSource . SdkCsProj )
378
+ private bool TryRestorePackageManually ( string package , string ? nugetConfig = null , PackageReferenceSource packageReferenceSource = PackageReferenceSource . SdkCsProj , bool tryWithoutNugetConfig = true )
369
379
{
370
380
logger . LogInfo ( $ "Restoring package { package } ...") ;
371
381
using var tempDir = new TemporaryDirectory ( ComputeTempDirectory ( package , "missingpackages_workingdir" ) ) ;
@@ -389,7 +399,7 @@ private bool TryRestorePackageManually(string package, string? nugetConfig, Pack
389
399
var res = dotnet . Restore ( new ( tempDir . DirInfo . FullName , missingPackageDirectory . DirInfo . FullName , ForceDotnetRefAssemblyFetching : false , PathToNugetConfig : nugetConfig ) ) ;
390
400
if ( ! res . Success )
391
401
{
392
- if ( res . HasNugetPackageSourceError && nugetConfig is not null )
402
+ if ( tryWithoutNugetConfig && res . HasNugetPackageSourceError && nugetConfig is not null )
393
403
{
394
404
// Restore could not be completed because the listed source is unavailable. Try without the nuget.config:
395
405
res = dotnet . Restore ( new ( tempDir . DirInfo . FullName , missingPackageDirectory . DirInfo . FullName , ForceDotnetRefAssemblyFetching : false , PathToNugetConfig : null , ForceReevaluation : true ) ) ;
@@ -452,16 +462,10 @@ private static async Task ExecuteGetRequest(string address, HttpClient httpClien
452
462
}
453
463
}
454
464
455
- private bool IsFeedReachable ( string feed )
465
+ private bool IsFeedReachable ( string feed , int timeoutMilliSeconds , int tryCount , bool allowExceptions = true )
456
466
{
457
467
logger . LogInfo ( $ "Checking if Nuget feed '{ feed } ' is reachable...") ;
458
468
using HttpClient client = new ( ) ;
459
- int timeoutMilliSeconds = int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessInitialTimeout ) , out timeoutMilliSeconds )
460
- ? timeoutMilliSeconds
461
- : 1000 ;
462
- int tryCount = int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessRequestCount ) , out tryCount )
463
- ? tryCount
464
- : 4 ;
465
469
466
470
for ( var i = 0 ; i < tryCount ; i ++ )
467
471
{
@@ -470,6 +474,7 @@ private bool IsFeedReachable(string feed)
470
474
try
471
475
{
472
476
ExecuteGetRequest ( feed , client , cts . Token ) . GetAwaiter ( ) . GetResult ( ) ;
477
+ logger . LogInfo ( $ "Querying Nuget feed '{ feed } ' succeeded.") ;
473
478
return true ;
474
479
}
475
480
catch ( Exception exc )
@@ -478,21 +483,41 @@ private bool IsFeedReachable(string feed)
478
483
tce . CancellationToken == cts . Token &&
479
484
cts . Token . IsCancellationRequested )
480
485
{
481
- logger . LogWarning ( $ "Didn't receive answer from Nuget feed '{ feed } ' in { timeoutMilliSeconds } ms.") ;
486
+ logger . LogInfo ( $ "Didn't receive answer from Nuget feed '{ feed } ' in { timeoutMilliSeconds } ms.") ;
482
487
timeoutMilliSeconds *= 2 ;
483
488
continue ;
484
489
}
485
490
486
491
// We're only interested in timeouts.
487
- logger . LogWarning ( $ "Querying Nuget feed '{ feed } ' failed: { exc } ") ;
488
- return true ;
492
+ var start = allowExceptions ? "Considering" : "Not considering" ;
493
+ logger . LogInfo ( $ "Querying Nuget feed '{ feed } ' failed in a timely manner. { start } the feed for use. The reason for the failure: { exc . Message } ") ;
494
+ return allowExceptions ;
489
495
}
490
496
}
491
497
492
498
logger . LogWarning ( $ "Didn't receive answer from Nuget feed '{ feed } '. Tried it { tryCount } times.") ;
493
499
return false ;
494
500
}
495
501
502
+ private ( int initialTimeout , int tryCount ) GetFeedRequestSettings ( bool isFallback )
503
+ {
504
+ int timeoutMilliSeconds = isFallback && int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessInitialTimeoutForFallback ) , out timeoutMilliSeconds )
505
+ ? timeoutMilliSeconds
506
+ : int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessInitialTimeout ) , out timeoutMilliSeconds )
507
+ ? timeoutMilliSeconds
508
+ : 1000 ;
509
+ logger . LogDebug ( $ "Initial timeout for Nuget feed reachability check is { timeoutMilliSeconds } ms.") ;
510
+
511
+ int tryCount = isFallback && int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessRequestCountForFallback ) , out tryCount )
512
+ ? tryCount
513
+ : int . TryParse ( Environment . GetEnvironmentVariable ( EnvironmentVariableNames . NugetFeedResponsivenessRequestCount ) , out tryCount )
514
+ ? tryCount
515
+ : 4 ;
516
+ logger . LogDebug ( $ "Number of tries for Nuget feed reachability check is { tryCount } .") ;
517
+
518
+ return ( timeoutMilliSeconds , tryCount ) ;
519
+ }
520
+
496
521
private bool CheckFeeds ( List < FileInfo > allFiles )
497
522
{
498
523
logger . LogInfo ( "Checking Nuget feeds..." ) ;
@@ -507,7 +532,9 @@ private bool CheckFeeds(List<FileInfo> allFiles)
507
532
logger . LogInfo ( $ "Excluded Nuget feeds from responsiveness check: { string . Join ( ", " , excludedFeeds . OrderBy ( f => f ) ) } ") ;
508
533
}
509
534
510
- var allFeedsReachable = explicitFeeds . All ( feed => excludedFeeds . Contains ( feed ) || IsFeedReachable ( feed ) ) ;
535
+ var ( initialTimeout , tryCount ) = GetFeedRequestSettings ( isFallback : false ) ;
536
+
537
+ var allFeedsReachable = explicitFeeds . All ( feed => excludedFeeds . Contains ( feed ) || IsFeedReachable ( feed , initialTimeout , tryCount ) ) ;
511
538
if ( ! allFeedsReachable )
512
539
{
513
540
logger . LogWarning ( "Found unreachable Nuget feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis." ) ;
0 commit comments