Skip to content

Commit 4e3476f

Browse files
committed
C#: Preserve semantics of reachability for default feeds when using [mono] nuget.
1 parent 98cadc6 commit 4e3476f

3 files changed

Lines changed: 24 additions & 7 deletions

File tree

‎csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ internal sealed partial class FeedManager : IDisposable
1717
private readonly IFileProvider fileProvider;
1818
private readonly DependencyDirectory emptyPackageDirectory;
1919
private readonly ImmutableHashSet<string> privateRegistryFeeds;
20-
private readonly ImmutableHashSet<string> defaultFeeds;
2120
private readonly IFeedManagerIO feedManagerIo;
2221

2322
/// <summary>
@@ -75,6 +74,12 @@ internal sealed partial class FeedManager : IDisposable
7574

7675
private readonly Lazy<ImmutableHashSet<string>> lazyReachableDefaultFeeds;
7776

77+
/// <summary>
78+
/// Gets the list of default NuGet feeds that are configured in the environment.
79+
/// This is either the public NuGet feed or a set of feeds specified by the environment.
80+
/// </summary>
81+
public ImmutableHashSet<string> DefaultFeeds { get; init; }
82+
7883
/// <summary>
7984
/// Gets the list of reachable default NuGet feeds.
8085
/// </summary>
@@ -88,7 +93,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
8893
this.feedManagerIo = feedManagerIo;
8994
privateRegistryFeeds = dependabotProxy?.RegistryURLs ?? [];
9095
HasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0;
91-
defaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true
96+
DefaultFeeds = dependabotProxy?.RegistryBaseURLs.Any() == true
9297
? dependabotProxy.RegistryBaseURLs
9398
: [PublicNugetOrgFeed];
9499
emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger);
@@ -107,7 +112,7 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
107112
var reachableFallbackFeeds = GetReachableFallbackNugetFeeds();
108113
return reachableFallbackFeeds.ToImmutableHashSet();
109114
});
110-
lazyReachableDefaultFeeds = new Lazy<ImmutableHashSet<string>>(() => CheckSpecifiedFeeds(defaultFeeds));
115+
lazyReachableDefaultFeeds = new Lazy<ImmutableHashSet<string>>(() => CheckSpecifiedFeeds(DefaultFeeds));
111116
}
112117

113118
public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotProxy, IFileProvider fileProvider)
@@ -311,8 +316,8 @@ private List<string> GetReachableFallbackNugetFeeds()
311316
var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet();
312317
if (fallbackFeeds.Count == 0)
313318
{
314-
fallbackFeeds.UnionWith(defaultFeeds);
315-
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", defaultFeeds.OrderBy(f => f))}");
319+
fallbackFeeds.UnionWith(DefaultFeeds);
320+
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feeds: {string.Join(", ", DefaultFeeds.OrderBy(f => f))}");
316321

317322
var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback);
318323
logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}");

‎csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,18 @@ private bool TryRestoreNugetPackage(string packagesConfig)
165165

166166
List<string> sourcesArgument = [];
167167
var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList();
168-
var useDefaultFeeds = feedsToUse.Count == 0 && feedManager.ReachableDefaultFeeds.Count > 0;
168+
var defaultFeeds = feedManager.CheckNugetFeedResponsiveness
169+
? feedManager.ReachableDefaultFeeds
170+
: feedManager.DefaultFeeds;
171+
var useDefaultFeeds = feedsToUse.Count == 0 && defaultFeeds.Count > 0;
169172

170173
// Explicitly construct the sources to be used for the restore command when checking feed
171174
// responsiveness, using private registries, or falling back to default feeds.
172175
if (feedManager.CheckNugetFeedResponsiveness || feedManager.HasPrivateRegistryFeeds || useDefaultFeeds)
173176
{
174177
if (useDefaultFeeds)
175178
{
176-
feedsToUse.AddRange(feedManager.ReachableDefaultFeeds);
179+
feedsToUse.AddRange(defaultFeeds);
177180
}
178181
var restoreFeeds = feedManager.RestoreFeeds(feedsToUse);
179182
sourcesArgument = restoreFeeds.SelectMany<string, string>(feed => ["-Source", feed]).ToList();

‎csharp/extractor/Semmle.Extraction.Tests/FeedManager.cs‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,13 @@ public void TestDefaultFeeds1()
205205
var feedManager = MakeFeedManager();
206206

207207
// Execute
208+
var defaultFeeds = feedManager.DefaultFeeds;
208209
var reachableDefault = feedManager.ReachableDefaultFeeds;
209210

210211
// Verify
212+
Assert.Equal([
213+
"https://api.nuget.org/v3/index.json"
214+
], defaultFeeds);
211215
Assert.Equal([
212216
"https://api.nuget.org/v3/index.json"
213217
], reachableDefault);
@@ -225,10 +229,15 @@ public void TestDefaultFeeds2()
225229
var feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider, feedManagerIo);
226230

227231
// Execute
232+
var defaultFeeds = feedManager.DefaultFeeds;
228233
var reachableDefault = feedManager.ReachableDefaultFeeds;
229234
var reachableFallback = feedManager.ReachableFallbackFeeds;
230235

231236
// Verify
237+
Assert.Equal([
238+
"https://example.com/base1",
239+
"https://example.com/base2"
240+
], defaultFeeds);
232241
Assert.Equal([
233242
"https://example.com/base2"
234243
], reachableDefault);

0 commit comments

Comments
 (0)