Skip to content

Commit

Permalink
Add NuGet Cake support
Browse files Browse the repository at this point in the history
  • Loading branch information
devlead committed Mar 16, 2021
1 parent 9ee6e19 commit 356bc2a
Show file tree
Hide file tree
Showing 14 changed files with 213 additions and 23 deletions.
22 changes: 22 additions & 0 deletions resources/test.cake
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Install modules
#module nuget:?package=Cake.DotNetTool.Module&version=1.0.1

// Install addins.
#addin "nuget:https://api.nuget.org/v3/index.json?package=Cake.Coveralls&version=1.0.0"
#addin "nuget:https://api.nuget.org/v3/index.json?package=Cake.Twitter&version=1.0.0"
#addin "nuget:https://api.nuget.org/v3/index.json?package=Cake.Gitter&version=1.0.1"

// Install tools.
#tool "nuget:https://api.nuget.org/v3/index.json?package=coveralls.io&version=1.4.2"
#tool "nuget:https://api.nuget.org/v3/index.json?package=OpenCover&version=4.7.922"
#tool "nuget:https://api.nuget.org/v3/index.json?package=ReportGenerator&version=4.7.1"
#tool "nuget:https://api.nuget.org/v3/index.json?package=nuget.commandline&version=5.7.0"

// Install .NET Core Global tools.
#tool "dotnet:https://api.nuget.org/v3/index.json?package=GitVersion.Tool&version=5.1.2"
#tool "dotnet:https://api.nuget.org/v3/index.json?package=SignClient&version=1.2.109"
#tool "dotnet:https://api.nuget.org/v3/index.json?package=GitReleaseManager.Tool&version=0.11.0"

// Load other scripts.
#load "./build/parameters.cake"

13 changes: 13 additions & 0 deletions src/.idea/.idea.DPI/.idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/.idea/.idea.DPI/.idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/.idea/.idea.DPI/.idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/.idea/.idea.DPI/.idea/indexLayout.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions src/.idea/.idea.DPI/.idea/riderModule.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/.idea/.idea.DPI/.idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 14 additions & 13 deletions src/DPI/Commands/NuGet/NuGetAnalyzeCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ namespace DPI.Commands.NuGet
// ReSharper disable once ClassNeverInstantiated.Global
public class NuGetAnalyzeCommand<TSettings> : NuGetCommand<TSettings> where TSettings : NuGetAnalyzeSettings
{
private const string NuGetPackagesFilePattern = "{.csproj,dotnet-tools.json,packages.config}";
private INuGetPackageReferenceParser CsProjParser { get; }
private INuGetPackageReferenceParser DotNetToolsManifestParser { get; }
private INuGetPackageReferenceParser PackageConfigParser { get; }
private const string NuGetPackagesFilePattern = "{.csproj,dotnet-tools.json,packages.config,.cake}";

private NuGetParsers NuGetParsers { get; }

public override async Task<int> ExecuteAsync(CommandContext context, TSettings settings)
{
Expand Down Expand Up @@ -51,14 +50,10 @@ public override async Task<int> ExecuteAsync(CommandContext context, TSettings s
}

public NuGetAnalyzeCommand(
CsProjParser csProjParser,
DotNetToolsManifestParser dotNetToolsManifestParser,
PackageConfigParser packageConfigParser
NuGetParsers nuGetParsers
)
{
CsProjParser = csProjParser;
DotNetToolsManifestParser = dotNetToolsManifestParser;
PackageConfigParser = packageConfigParser;
NuGetParsers = nuGetParsers;
}

private async IAsyncEnumerable<PackageReference> ParseFiles(
Expand Down Expand Up @@ -121,19 +116,25 @@ NuGetAnalyzeSettings settings
Extension: filePath.GetExtension()
) switch
{
("dotnet-tools.json", _) => DotNetToolsManifestParser.Parse(
("dotnet-tools.json", _) => NuGetParsers.DotNetToolsManifestParser.Parse(
settings,
filePath,
gitFolder,
filePackageReference
),
("packages.config", _) => PackageConfigParser.Parse(
("packages.config", _) => NuGetParsers.PackageConfigParser.Parse(
settings,
filePath,
gitFolder,
filePackageReference
),
(_, ".csproj") => NuGetParsers.CsProjParser.Parse(
settings,
filePath,
gitFolder,
filePackageReference
),
(_, ".csproj") => CsProjParser.Parse(
(_, ".cake") => NuGetParsers.CakeParser.Parse(
settings,
filePath,
gitFolder,
Expand Down
11 changes: 2 additions & 9 deletions src/DPI/Commands/NuGet/NuGetReportCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,8 @@ NuGetReportSettings settings
return Invariant($"SharedKey {settings.WorkspaceId}:{Convert.ToBase64String(hmacSha256.ComputeHash(bytes))}");
}

public NuGetReportCommand(
CsProjParser csProjParser,
DotNetToolsManifestParser dotNetToolsManifestParser,
PackageConfigParser packageConfigParser
) : base(
csProjParser,
dotNetToolsManifestParser,
packageConfigParser
)
public NuGetReportCommand(NuGetParsers nuGetParsers)
: base(nuGetParsers)
{
}
}
Expand Down
11 changes: 11 additions & 0 deletions src/DPI/Models/NuGet/CakePreProcessorDirective.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace DPI.Models.NßuGet
{
public enum CakePreProcessorDirective
{
Addin,
Module,
Load,
Tool,
Unknown
}
}
3 changes: 2 additions & 1 deletion src/DPI/Models/NuGet/NuGetSourceType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public enum NuGetSourceType
CSProj,
PackagesConfig,
DotNetToolsManifest,
ProjectAssets
ProjectAssets,
Cake
}
}
96 changes: 96 additions & 0 deletions src/DPI/Parsers/NuGet/CakeParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Cake.Core;
using Cake.Core.IO;
using Cake.Core.Text;
using DPI.Commands.Settings.NuGet;
using DPI.Models.NßuGet;
using DPI.Models.NuGet;

namespace DPI.Parsers.NuGet
{
public class CakeParser : INuGetPackageReferenceParser
{
public NuGetSourceType SourceType { get; } = NuGetSourceType.Cake;

public async IAsyncEnumerable<PackageReference> Parse(
NuGetSettings settings,
FilePath filePath,
DirectoryPath? repoRootPath,
PackageReference basePackageReference
)
{
using (settings.Logger.BeginScope(nameof(CakeParser)))
{
await using var file = settings.Context.FileSystem.GetFile(filePath).OpenRead();
using var reader = new StreamReader(file, Encoding.UTF8);
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
if (string.IsNullOrWhiteSpace(line))
{
continue;
}

if (
QuoteAwareStringSplitter.Split(
Environment.ExpandEnvironmentVariables(
line.Trim()
)
).ToArray()
is not { Length: >= 2 } parts)
{
continue;
}

var preProcessorDirective = parts[0]
.ToLowerInvariant()
switch
{
"#addin" => CakePreProcessorDirective.Addin,
"#module" => CakePreProcessorDirective.Module,
"#load" => CakePreProcessorDirective.Load,
"#tool" => CakePreProcessorDirective.Tool,
_ => CakePreProcessorDirective.Unknown
};

if (preProcessorDirective == CakePreProcessorDirective.Unknown)
{
continue;
}

if (!Uri.TryCreate(parts[1].UnQuote(), UriKind.Absolute, out var uri))
{
continue;
}

var parameters = uri
.GetQueryString()
.SelectMany(key => key.Value.Select(value => (key.Key, value)))
.ToLookup(
key => key.Key,
value => value.value,
StringComparer.OrdinalIgnoreCase
);

var packageId = parameters["package"].FirstOrDefault();

if (string.IsNullOrWhiteSpace(packageId))
{
continue;
}

yield return basePackageReference with
{
SourceType = NuGetSourceType.Cake,
PackageId = packageId,
Version = parameters["version"].FirstOrDefault()
};
}
}
}
}
}
23 changes: 23 additions & 0 deletions src/DPI/Parsers/NuGet/NuGetParsers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace DPI.Parsers.NuGet
{
public class NuGetParsers
{
public INuGetPackageReferenceParser CsProjParser { get; }
public INuGetPackageReferenceParser DotNetToolsManifestParser { get; }
public INuGetPackageReferenceParser PackageConfigParser { get; }
public INuGetPackageReferenceParser CakeParser { get; }

public NuGetParsers(
CsProjParser csProjParser,
DotNetToolsManifestParser dotNetToolsManifestParser,
PackageConfigParser packageConfigParser,
CakeParser cakeParser
)
{
CsProjParser = csProjParser;
DotNetToolsManifestParser = dotNetToolsManifestParser;
PackageConfigParser = packageConfigParser;
CakeParser = cakeParser;
}
}
}
2 changes: 2 additions & 0 deletions src/DPI/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
.AddSingleton<CsProjParser>()
.AddSingleton<DotNetToolsManifestParser>()
.AddSingleton<PackageConfigParser>()
.AddSingleton<CakeParser>()
.AddSingleton<NuGetParsers>()
.AddCakeCore();

using var registrar = new DependencyInjectionRegistrar(serviceCollection);
Expand Down

0 comments on commit 356bc2a

Please sign in to comment.