Skip to content

Commit e85d059

Browse files
committed
C#: Read from dependency directory from extractor option.
1 parent caccee9 commit e85d059

File tree

4 files changed

+81
-9
lines changed

4 files changed

+81
-9
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.IO;
3+
using Semmle.Util;
4+
using Semmle.Util.Logging;
5+
6+
namespace Semmle.Extraction.CSharp.DependencyFetching
7+
{
8+
/// <summary>
9+
/// A directory used for storing fetched dependencies.
10+
/// When a specific directory is set via the dependency directory extractor option,
11+
/// we store dependencies in that directory for caching purposes.
12+
/// Otherwise, we create a temporary directory that is deleted upon disposal.
13+
/// </summary>
14+
public sealed class DependencyDirectory : IDisposable
15+
{
16+
private readonly string userReportedDirectoryPurpose;
17+
private readonly ILogger logger;
18+
private readonly bool attemptCleanup;
19+
20+
public DirectoryInfo DirInfo { get; }
21+
22+
public DependencyDirectory(string subfolderName, string userReportedDirectoryPurpose, ILogger logger)
23+
{
24+
this.logger = logger;
25+
this.userReportedDirectoryPurpose = userReportedDirectoryPurpose;
26+
27+
string path;
28+
if (EnvironmentVariables.GetBuildlessDependencyDir() is string dir)
29+
{
30+
path = dir;
31+
attemptCleanup = false;
32+
}
33+
else
34+
{
35+
path = FileUtils.GetTemporaryWorkingDirectory(out _);
36+
attemptCleanup = true;
37+
}
38+
DirInfo = new DirectoryInfo(Path.Join(path, subfolderName));
39+
DirInfo.Create();
40+
}
41+
42+
public void Dispose()
43+
{
44+
if (!attemptCleanup)
45+
{
46+
logger.LogInfo($"Keeping {userReportedDirectoryPurpose} directory {DirInfo.FullName} for possible caching purposes.");
47+
return;
48+
}
49+
50+
try
51+
{
52+
DirInfo.Delete(true);
53+
}
54+
catch (Exception exc)
55+
{
56+
logger.LogInfo($"Couldn't delete {userReportedDirectoryPurpose} directory {exc.Message}");
57+
}
58+
}
59+
60+
public override string ToString() => DirInfo.FullName.ToString();
61+
}
62+
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ internal class NugetExeWrapper : IDisposable
2525

2626
/// <summary>
2727
/// The computed packages directory.
28-
/// This will be in the Temp location
28+
/// This will be in the Cached or Temp location
2929
/// so as to not trample the source tree.
3030
/// </summary>
31-
private readonly TemporaryDirectory packageDirectory;
31+
private readonly DependencyDirectory packageDirectory;
3232

3333
/// <summary>
3434
/// Create the package manager for a specified source tree.
3535
/// </summary>
36-
public NugetExeWrapper(FileProvider fileProvider, TemporaryDirectory packageDirectory, Semmle.Util.Logging.ILogger logger)
36+
public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger)
3737
{
3838
this.fileProvider = fileProvider;
3939
this.packageDirectory = packageDirectory;

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ internal sealed partial class NugetPackageRestorer : IDisposable
2424
private readonly IDotNet dotnet;
2525
private readonly DependabotProxy? dependabotProxy;
2626
private readonly IDiagnosticsWriter diagnosticsWriter;
27-
private readonly TemporaryDirectory legacyPackageDirectory;
28-
private readonly TemporaryDirectory missingPackageDirectory;
27+
private readonly DependencyDirectory legacyPackageDirectory;
28+
private readonly DependencyDirectory missingPackageDirectory;
2929
private readonly ILogger logger;
3030
private readonly ICompilationInfoContainer compilationInfoContainer;
3131

32-
public TemporaryDirectory PackageDirectory { get; }
32+
public DependencyDirectory PackageDirectory { get; }
3333

3434
public NugetPackageRestorer(
3535
FileProvider fileProvider,
@@ -48,9 +48,9 @@ public NugetPackageRestorer(
4848
this.logger = logger;
4949
this.compilationInfoContainer = compilationInfoContainer;
5050

51-
PackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("packages"), "package", logger);
52-
legacyPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("legacypackages"), "legacy package", logger);
53-
missingPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("missingpackages"), "missing package", logger);
51+
PackageDirectory = new DependencyDirectory("packages", "package", logger);
52+
legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger);
53+
missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger);
5454
}
5555

5656
public string? TryRestore(string package)

csharp/extractor/Semmle.Util/EnvironmentVariables.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,15 @@ public static IEnumerable<string> GetURLs(string name)
7676
{
7777
return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OVERLAY_BASE_METADATA_OUT");
7878
}
79+
80+
/// <summary>
81+
/// If set, returns the directory where buildless dependencies should be stored.
82+
/// This is needed for caching dependencies.
83+
/// </summary>
84+
/// <returns></returns>
85+
public static string? GetBuildlessDependencyDir()
86+
{
87+
return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_BUILDLESS_DEPENDENCY_DIR");
88+
}
7989
}
8090
}

0 commit comments

Comments
 (0)