Skip to content

Commit 93380f8

Browse files
committed
Force the nuget download of dotnet framework reference assemblies
1 parent 12fdb34 commit 93380f8

File tree

6 files changed

+215
-183
lines changed

6 files changed

+215
-183
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
4747
this.progressMonitor = new ProgressMonitor(logger);
4848
this.sourceDir = new DirectoryInfo(srcDir);
4949

50+
packageDirectory = new TemporaryDirectory(ComputeTempDirectory(sourceDir.FullName));
51+
tempWorkingDirectory = new TemporaryDirectory(FileUtils.GetTemporaryWorkingDirectory(out cleanupTempWorkingDirectory));
52+
5053
try
5154
{
52-
this.dotnet = DotNet.Make(options, progressMonitor);
55+
this.dotnet = DotNet.Make(options, progressMonitor, tempWorkingDirectory);
5356
}
5457
catch
5558
{
@@ -59,8 +62,6 @@ public DependencyManager(string srcDir, IDependencyOptions options, ILogger logg
5962

6063
this.progressMonitor.FindingFiles(srcDir);
6164

62-
packageDirectory = new TemporaryDirectory(ComputeTempDirectory(sourceDir.FullName));
63-
tempWorkingDirectory = new TemporaryDirectory(FileUtils.GetTemporaryWorkingDirectory(out cleanupTempWorkingDirectory));
6465

6566
var allFiles = GetAllFiles();
6667
var binaryFileExtensions = new HashSet<string>(new[] { ".dll", ".exe" }); // TODO: add more binary file extensions.
@@ -537,11 +538,11 @@ private void AnalyseProject(FileInfo project)
537538

538539
}
539540

540-
private bool RestoreProject(string project, string? pathToNugetConfig = null) =>
541-
dotnet.RestoreProjectToDirectory(project, packageDirectory.DirInfo.FullName, pathToNugetConfig);
541+
private bool RestoreProject(string project, bool forceDotnetRefAssemblyFetching, string? pathToNugetConfig = null) =>
542+
dotnet.RestoreProjectToDirectory(project, packageDirectory.DirInfo.FullName, forceDotnetRefAssemblyFetching, pathToNugetConfig);
542543

543544
private bool RestoreSolution(string solution, out IEnumerable<string> projects) =>
544-
dotnet.RestoreSolutionToDirectory(solution, packageDirectory.DirInfo.FullName, out projects);
545+
dotnet.RestoreSolutionToDirectory(solution, packageDirectory.DirInfo.FullName, forceDotnetRefAssemblyFetching: true, out projects);
545546

546547
/// <summary>
547548
/// Executes `dotnet restore` on all solution files in solutions.
@@ -567,7 +568,7 @@ private void RestoreProjects(IEnumerable<string> projects)
567568
{
568569
Parallel.ForEach(projects, new ParallelOptions { MaxDegreeOfParallelism = options.Threads }, project =>
569570
{
570-
RestoreProject(project);
571+
RestoreProject(project, forceDotnetRefAssemblyFetching: true);
571572
});
572573
}
573574

@@ -612,7 +613,7 @@ private void DownloadMissingPackages(List<FileInfo> allFiles)
612613
return;
613614
}
614615

615-
success = RestoreProject(tempDir.DirInfo.FullName, nugetConfig);
616+
success = RestoreProject(tempDir.DirInfo.FullName, forceDotnetRefAssemblyFetching: false, pathToNugetConfig: nugetConfig);
616617
// TODO: the restore might fail, we could retry with a prerelease (*-* instead of *) version of the package.
617618
if (!success)
618619
{

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using System.Text.RegularExpressions;
6+
using Semmle.Util;
67

78
namespace Semmle.Extraction.CSharp.DependencyFetching
89
{
@@ -13,19 +14,21 @@ internal partial class DotNet : IDotNet
1314
{
1415
private readonly IDotNetCliInvoker dotnetCliInvoker;
1516
private readonly ProgressMonitor progressMonitor;
17+
private readonly TemporaryDirectory? tempWorkingDirectory;
1618

17-
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ProgressMonitor progressMonitor)
19+
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ProgressMonitor progressMonitor, TemporaryDirectory? tempWorkingDirectory = null)
1820
{
1921
this.progressMonitor = progressMonitor;
22+
this.tempWorkingDirectory = tempWorkingDirectory;
2023
this.dotnetCliInvoker = dotnetCliInvoker;
2124
Info();
2225
}
2326

24-
private DotNet(IDependencyOptions options, ProgressMonitor progressMonitor) : this(new DotNetCliInvoker(progressMonitor, Path.Combine(options.DotNetPath ?? string.Empty, "dotnet")), progressMonitor) { }
27+
private DotNet(IDependencyOptions options, ProgressMonitor progressMonitor, TemporaryDirectory tempWorkingDirectory) : this(new DotNetCliInvoker(progressMonitor, Path.Combine(options.DotNetPath ?? string.Empty, "dotnet")), progressMonitor, tempWorkingDirectory) { }
2528

2629
internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ProgressMonitor progressMonitor) => new DotNet(dotnetCliInvoker, progressMonitor);
2730

28-
public static IDotNet Make(IDependencyOptions options, ProgressMonitor progressMonitor) => new DotNet(options, progressMonitor);
31+
public static IDotNet Make(IDependencyOptions options, ProgressMonitor progressMonitor, TemporaryDirectory tempWorkingDirectory) => new DotNet(options, progressMonitor, tempWorkingDirectory);
2932

3033
private void Info()
3134
{
@@ -37,12 +40,29 @@ private void Info()
3740
}
3841
}
3942

40-
private static string GetRestoreArgs(string projectOrSolutionFile, string packageDirectory) =>
41-
$"restore --no-dependencies \"{projectOrSolutionFile}\" --packages \"{packageDirectory}\" /p:DisableImplicitNuGetFallbackFolder=true";
43+
private string GetRestoreArgs(string projectOrSolutionFile, string packageDirectory, bool forceDotnetRefAssemblyFetching)
44+
{
45+
var args = $"restore --no-dependencies \"{projectOrSolutionFile}\" --packages \"{packageDirectory}\" /p:DisableImplicitNuGetFallbackFolder=true";
46+
47+
if (forceDotnetRefAssemblyFetching)
48+
{
49+
// Ugly hack: we set the TargetFrameworkRootPath and NetCoreTargetingPackRoot properties to an empty folder:
50+
var path = ".empty";
51+
if (tempWorkingDirectory != null)
52+
{
53+
path = Path.Combine(tempWorkingDirectory.ToString(), "emptyFakeDotnetRoot");
54+
Directory.CreateDirectory(path);
55+
}
56+
57+
args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\"";
58+
}
59+
60+
return args;
61+
}
4262

43-
public bool RestoreProjectToDirectory(string projectFile, string packageDirectory, string? pathToNugetConfig = null)
63+
public bool RestoreProjectToDirectory(string projectFile, string packageDirectory, bool forceDotnetRefAssemblyFetching, string? pathToNugetConfig = null)
4464
{
45-
var args = GetRestoreArgs(projectFile, packageDirectory);
65+
var args = GetRestoreArgs(projectFile, packageDirectory, forceDotnetRefAssemblyFetching);
4666
if (pathToNugetConfig != null)
4767
{
4868
args += $" --configfile \"{pathToNugetConfig}\"";
@@ -51,9 +71,9 @@ public bool RestoreProjectToDirectory(string projectFile, string packageDirector
5171
return dotnetCliInvoker.RunCommand(args);
5272
}
5373

54-
public bool RestoreSolutionToDirectory(string solutionFile, string packageDirectory, out IEnumerable<string> projects)
74+
public bool RestoreSolutionToDirectory(string solutionFile, string packageDirectory, bool forceDotnetRefAssemblyFetching, out IEnumerable<string> projects)
5575
{
56-
var args = GetRestoreArgs(solutionFile, packageDirectory);
76+
var args = GetRestoreArgs(solutionFile, packageDirectory, forceDotnetRefAssemblyFetching);
5777
args += " --verbosity normal";
5878
if (dotnetCliInvoker.RunCommand(args, out var output))
5979
{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
44
{
55
internal interface IDotNet
66
{
7-
bool RestoreProjectToDirectory(string project, string directory, string? pathToNugetConfig = null);
8-
bool RestoreSolutionToDirectory(string solutionFile, string packageDirectory, out IEnumerable<string> projects);
7+
bool RestoreProjectToDirectory(string project, string directory, bool forceDotnetRefAssemblyFetching, string? pathToNugetConfig = null);
8+
bool RestoreSolutionToDirectory(string solutionFile, string packageDirectory, bool forceDotnetRefAssemblyFetching, out IEnumerable<string> projects);
99
bool New(string folder);
1010
bool AddPackage(string folder, string package);
1111
IList<string> GetListedRuntimes();

csharp/extractor/Semmle.Extraction.Tests/DotNet.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void TestDotnetRestoreProjectToDirectory1()
9999
var dotnet = MakeDotnet(dotnetCliInvoker);
100100

101101
// Execute
102-
dotnet.RestoreProjectToDirectory("myproject.csproj", "mypackages");
102+
dotnet.RestoreProjectToDirectory("myproject.csproj", "mypackages", false);
103103

104104
// Verify
105105
var lastArgs = dotnetCliInvoker.GetLastArgs();
@@ -114,7 +114,7 @@ public void TestDotnetRestoreProjectToDirectory2()
114114
var dotnet = MakeDotnet(dotnetCliInvoker);
115115

116116
// Execute
117-
dotnet.RestoreProjectToDirectory("myproject.csproj", "mypackages", "myconfig.config");
117+
dotnet.RestoreProjectToDirectory("myproject.csproj", "mypackages", false, "myconfig.config");
118118

119119
// Verify
120120
var lastArgs = dotnetCliInvoker.GetLastArgs();
@@ -129,7 +129,7 @@ public void TestDotnetRestoreSolutionToDirectory1()
129129
var dotnet = MakeDotnet(dotnetCliInvoker);
130130

131131
// Execute
132-
dotnet.RestoreSolutionToDirectory("mysolution.sln", "mypackages", out var projects);
132+
dotnet.RestoreSolutionToDirectory("mysolution.sln", "mypackages", false, out var projects);
133133

134134
// Verify
135135
var lastArgs = dotnetCliInvoker.GetLastArgs();
@@ -148,7 +148,7 @@ public void TestDotnetRestoreSolutionToDirectory2()
148148
dotnetCliInvoker.Success = false;
149149

150150
// Execute
151-
dotnet.RestoreSolutionToDirectory("mysolution.sln", "mypackages", out var projects);
151+
dotnet.RestoreSolutionToDirectory("mysolution.sln", "mypackages", false, out var projects);
152152

153153
// Verify
154154
var lastArgs = dotnetCliInvoker.GetLastArgs();

csharp/extractor/Semmle.Extraction.Tests/Runtime.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ public DotNetStub(IList<string> runtimes, IList<string> sdks)
1919

2020
public bool New(string folder) => true;
2121

22-
public bool RestoreProjectToDirectory(string project, string directory, string? pathToNugetConfig = null) => true;
22+
public bool RestoreProjectToDirectory(string project, string directory, bool forceDotnetRefAssemblyFetching, string? pathToNugetConfig = null) => true;
2323

24-
public bool RestoreSolutionToDirectory(string solution, string directory, out IEnumerable<string> projects)
24+
public bool RestoreSolutionToDirectory(string solution, string directory, bool forceDotnetRefAssemblyFetching, out IEnumerable<string> projects)
2525
{
2626
projects = Array.Empty<string>();
2727
return true;

0 commit comments

Comments
 (0)