Skip to content

Commit 85af2ec

Browse files
committed
C#: Do not pass around the set of reachable feeds. This implicitly delays the calculation of the reachable feeds until it is needed/used.
1 parent 86fc08e commit 85af2ec

3 files changed

Lines changed: 15 additions & 23 deletions

File tree

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,8 @@ public string FeedsToRestoreArgument(IEnumerable<string> feeds, string sourceArg
170170
/// (2) Use private registries, if they are configured
171171
/// </summary>
172172
/// <param name="path">Path to project/solution/packages.config</param>
173-
/// <param name="reachableFeeds">The set of reachable NuGet feeds.</param>
174173
/// <returns>The list of NuGet feeds to use for this restore.</returns>
175-
public IEnumerable<string> FeedsToUse(string path, ImmutableHashSet<string> reachableFeeds)
174+
public IEnumerable<string> FeedsToUse(string path)
176175
{
177176
// Find the path specific feeds.
178177
var folder = GetDirectoryName(path);
@@ -184,7 +183,7 @@ public IEnumerable<string> FeedsToUse(string path, ImmutableHashSet<string> reac
184183
}
185184

186185
var feedsToUse = CheckNugetFeedResponsiveness
187-
? feedsToConsider.Where(reachableFeeds.Contains)
186+
? feedsToConsider.Where(ReachableFeeds.Contains)
188187
: feedsToConsider;
189188

190189
return feedsToUse;
@@ -196,17 +195,16 @@ public IEnumerable<string> FeedsToUse(string path, ImmutableHashSet<string> reac
196195
/// (2) Use private registries, if they are configured
197196
/// </summary>
198197
/// <param name="path">Path to project/solution</param>
199-
/// <param name="reachableFeeds">The set of reachable NuGet feeds.</param>
200198
/// <returns>A string representing the NuGet sources argument for the restore command.</returns>
201-
public string? MakeDotnetRestoreSourcesArgument(string path, ImmutableHashSet<string> reachableFeeds)
199+
public string? MakeDotnetRestoreSourcesArgument(string path)
202200
{
203201
// Do not construct a set of explicit NuGet sources to use for restore.
204202
if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds)
205203
{
206204
return null;
207205
}
208206

209-
var feedsToUse = FeedsToUse(path, reachableFeeds);
207+
var feedsToUse = FeedsToUse(path);
210208

211209
return FeedsToRestoreArgument(feedsToUse, "-s");
212210
}

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ public HashSet<AssemblyLookupLocation> Restore()
110110
logger.LogInfo($"Checking NuGet feed responsiveness: {feedManager.CheckNugetFeedResponsiveness}");
111111
compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", feedManager.CheckNugetFeedResponsiveness ? "1" : "0"));
112112

113-
ImmutableHashSet<string> reachableFeeds = [];
114-
115113
EmitNugetConfigDiagnostics();
116114

117115
// Find feeds that are configured in NuGet.config files and divide them into ones that
@@ -141,12 +139,11 @@ public HashSet<AssemblyLookupLocation> Restore()
141139
: [unresponsiveMissingPackageLocation];
142140
}
143141

144-
reachableFeeds = feedManager.ReachableFeeds;
145142
}
146143

147144
try
148145
{
149-
var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, feedManager, reachableFeeds);
146+
var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, feedManager);
150147
var count = packagesConfigRestore.InstallPackages();
151148
if (packagesConfigRestore.PackageCount > 0)
152149
{
@@ -184,9 +181,9 @@ public HashSet<AssemblyLookupLocation> Restore()
184181
}
185182

186183
// Restore project dependencies with `dotnet restore`.
187-
var restoredProjects = RestoreSolutions(reachableFeeds, out var container);
184+
var restoredProjects = RestoreSolutions(out var container);
188185
var projects = fileProvider.Projects.Except(restoredProjects);
189-
RestoreProjects(projects, reachableFeeds, out var containers);
186+
RestoreProjects(projects, out var containers);
190187

191188
var dependencies = containers.Flatten(container);
192189

@@ -218,7 +215,7 @@ public HashSet<AssemblyLookupLocation> Restore()
218215
/// Populates dependencies with the relevant dependencies from the assets files generated by the restore.
219216
/// Returns a list of projects that are up to date with respect to restore.
220217
/// </summary>
221-
private IEnumerable<string> RestoreSolutions(ImmutableHashSet<string> reachableFeeds, out DependencyContainer dependencies)
218+
private IEnumerable<string> RestoreSolutions(out DependencyContainer dependencies)
222219
{
223220
var successCount = 0;
224221
var nugetSourceFailures = 0;
@@ -231,7 +228,7 @@ private IEnumerable<string> RestoreSolutions(ImmutableHashSet<string> reachableF
231228
var projects = fileProvider.Solutions.SelectMany(solution =>
232229
{
233230
logger.LogInfo($"Restoring solution {solution}...");
234-
var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution, reachableFeeds);
231+
var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution);
235232
var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
236233
if (res.Success)
237234
{
@@ -262,8 +259,7 @@ private IEnumerable<string> RestoreSolutions(ImmutableHashSet<string> reachableF
262259
/// Populates dependencies with the relative paths to the assets files generated by the restore.
263260
/// </summary>
264261
/// <param name="projects">A list of paths to project files.</param>
265-
/// <param name="reachableFeeds">The set of reachable NuGet feeds.</param>
266-
private void RestoreProjects(IEnumerable<string> projects, ImmutableHashSet<string> reachableFeeds, out ConcurrentBag<DependencyContainer> dependencies)
262+
private void RestoreProjects(IEnumerable<string> projects, out ConcurrentBag<DependencyContainer> dependencies)
267263
{
268264
var successCount = 0;
269265
var nugetSourceFailures = 0;
@@ -280,7 +276,7 @@ private void RestoreProjects(IEnumerable<string> projects, ImmutableHashSet<stri
280276
foreach (var project in projectGroup)
281277
{
282278
logger.LogInfo($"Restoring project {project}...");
283-
var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(project, reachableFeeds);
279+
var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(project);
284280
var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
285281
assets.AddDependenciesRange(res.AssetsFilePaths);
286282
lock (sync)

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ internal interface IPackagesConfigRestore
3434
/// </summary>
3535
internal class PackagesConfigRestoreFactory
3636
{
37-
public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet<string> reachableFeeds)
37+
public static IPackagesConfigRestore Create(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager)
3838
{
3939
if (SystemBuildActions.Instance.IsWindows() || SystemBuildActions.Instance.IsMonoInstalled())
4040
{
41-
return new NugetExeWrapper(fileProvider, packageDirectory, logger, feedManager, reachableFeeds);
41+
return new NugetExeWrapper(fileProvider, packageDirectory, logger, feedManager);
4242
}
4343

4444
return new NoOpPackagesConfig(fileProvider.PackagesConfigs, logger);
@@ -65,7 +65,6 @@ private class NugetExeWrapper : IPackagesConfigRestore
6565
/// </summary>
6666
private readonly DependencyDirectory packageDirectory;
6767
private readonly FeedManager feedManager;
68-
private readonly ImmutableHashSet<string> reachableFeeds;
6968

7069
private bool IsWindows => SystemBuildActions.Instance.IsWindows();
7170

@@ -76,13 +75,12 @@ private class NugetExeWrapper : IPackagesConfigRestore
7675
/// <summary>
7776
/// Create the package manager for a specified source tree.
7877
/// </summary>
79-
public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager, ImmutableHashSet<string> reachableFeeds)
78+
public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger, FeedManager feedManager)
8079
{
8180
this.fileProvider = fileProvider;
8281
this.packageDirectory = packageDirectory;
8382
this.logger = logger;
8483
this.feedManager = feedManager;
85-
this.reachableFeeds = reachableFeeds;
8684

8785
if (fileProvider.PackagesConfigs.Count > 0)
8886
{
@@ -171,7 +169,7 @@ private bool TryRestoreNugetPackage(string packagesConfig)
171169
logger.LogInfo($"Restoring file \"{packagesConfig}\"...");
172170

173171
var sourcesArgument = "";
174-
var feedsToUse = feedManager.FeedsToUse(packagesConfig, reachableFeeds).ToList();
172+
var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList();
175173
var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable;
176174

177175
// Explicitly construct the sources to be used for the restore command when checking feed

0 commit comments

Comments
 (0)