mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
C#: Read from dependency directory from extractor option.
This commit is contained in:
@@ -0,0 +1,62 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Semmle.Util;
|
||||||
|
using Semmle.Util.Logging;
|
||||||
|
|
||||||
|
namespace Semmle.Extraction.CSharp.DependencyFetching
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A directory used for storing fetched dependencies.
|
||||||
|
/// When a specific directory is set via the dependency directory extractor option,
|
||||||
|
/// we store dependencies in that directory for caching purposes.
|
||||||
|
/// Otherwise, we create a temporary directory that is deleted upon disposal.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class DependencyDirectory : IDisposable
|
||||||
|
{
|
||||||
|
private readonly string userReportedDirectoryPurpose;
|
||||||
|
private readonly ILogger logger;
|
||||||
|
private readonly bool attemptCleanup;
|
||||||
|
|
||||||
|
public DirectoryInfo DirInfo { get; }
|
||||||
|
|
||||||
|
public DependencyDirectory(string subfolderName, string userReportedDirectoryPurpose, ILogger logger)
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.userReportedDirectoryPurpose = userReportedDirectoryPurpose;
|
||||||
|
|
||||||
|
string path;
|
||||||
|
if (EnvironmentVariables.GetBuildlessDependencyDir() is string dir)
|
||||||
|
{
|
||||||
|
path = dir;
|
||||||
|
attemptCleanup = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
path = FileUtils.GetTemporaryWorkingDirectory(out _);
|
||||||
|
attemptCleanup = true;
|
||||||
|
}
|
||||||
|
DirInfo = new DirectoryInfo(Path.Join(path, subfolderName));
|
||||||
|
DirInfo.Create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (!attemptCleanup)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Keeping {userReportedDirectoryPurpose} directory {DirInfo.FullName} for possible caching purposes.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DirInfo.Delete(true);
|
||||||
|
}
|
||||||
|
catch (Exception exc)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Couldn't delete {userReportedDirectoryPurpose} directory {exc.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString() => DirInfo.FullName.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,15 +25,15 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The computed packages directory.
|
/// The computed packages directory.
|
||||||
/// This will be in the Temp location
|
/// This will be in the Cached or Temp location
|
||||||
/// so as to not trample the source tree.
|
/// so as to not trample the source tree.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly TemporaryDirectory packageDirectory;
|
private readonly DependencyDirectory packageDirectory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create the package manager for a specified source tree.
|
/// Create the package manager for a specified source tree.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public NugetExeWrapper(FileProvider fileProvider, TemporaryDirectory packageDirectory, Semmle.Util.Logging.ILogger logger)
|
public NugetExeWrapper(FileProvider fileProvider, DependencyDirectory packageDirectory, Semmle.Util.Logging.ILogger logger)
|
||||||
{
|
{
|
||||||
this.fileProvider = fileProvider;
|
this.fileProvider = fileProvider;
|
||||||
this.packageDirectory = packageDirectory;
|
this.packageDirectory = packageDirectory;
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
private readonly IDotNet dotnet;
|
private readonly IDotNet dotnet;
|
||||||
private readonly DependabotProxy? dependabotProxy;
|
private readonly DependabotProxy? dependabotProxy;
|
||||||
private readonly IDiagnosticsWriter diagnosticsWriter;
|
private readonly IDiagnosticsWriter diagnosticsWriter;
|
||||||
private readonly TemporaryDirectory legacyPackageDirectory;
|
private readonly DependencyDirectory legacyPackageDirectory;
|
||||||
private readonly TemporaryDirectory missingPackageDirectory;
|
private readonly DependencyDirectory missingPackageDirectory;
|
||||||
private readonly ILogger logger;
|
private readonly ILogger logger;
|
||||||
private readonly ICompilationInfoContainer compilationInfoContainer;
|
private readonly ICompilationInfoContainer compilationInfoContainer;
|
||||||
|
|
||||||
public TemporaryDirectory PackageDirectory { get; }
|
public DependencyDirectory PackageDirectory { get; }
|
||||||
|
|
||||||
public NugetPackageRestorer(
|
public NugetPackageRestorer(
|
||||||
FileProvider fileProvider,
|
FileProvider fileProvider,
|
||||||
@@ -48,9 +48,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.compilationInfoContainer = compilationInfoContainer;
|
this.compilationInfoContainer = compilationInfoContainer;
|
||||||
|
|
||||||
PackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("packages"), "package", logger);
|
PackageDirectory = new DependencyDirectory("packages", "package", logger);
|
||||||
legacyPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("legacypackages"), "legacy package", logger);
|
legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger);
|
||||||
missingPackageDirectory = new TemporaryDirectory(ComputeTempDirectoryPath("missingpackages"), "missing package", logger);
|
missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string? TryRestore(string package)
|
public string? TryRestore(string package)
|
||||||
|
|||||||
@@ -76,5 +76,15 @@ namespace Semmle.Util
|
|||||||
{
|
{
|
||||||
return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OVERLAY_BASE_METADATA_OUT");
|
return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OVERLAY_BASE_METADATA_OUT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If set, returns the directory where buildless dependencies should be stored.
|
||||||
|
/// This is needed for caching dependencies.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string? GetBuildlessDependencyDir()
|
||||||
|
{
|
||||||
|
return Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_OPTION_BUILDLESS_DEPENDENCY_DIR");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user