Pin CLI tool references for all projects in a solution

This commit is contained in:
Pranav K 2017-07-13 16:44:29 -07:00
parent 97fd4f432b
commit cd11f71428
1 changed files with 38 additions and 16 deletions

View File

@ -40,13 +40,18 @@ namespace PinVersions
public void Execute()
{
var solutionPinMetadata = GetPinVersionMetadata();
foreach (var item in solutionPinMetadata)
var solutionPinMetadata = GetProjectPinVersionMetadata();
foreach (var cliToolReference in solutionPinMetadata.CLIToolReferences)
{
Console.WriteLine($"Pinning CLI Tool {cliToolReference.Item1.Name}({cliToolReference.Item1.VersionRange} to {cliToolReference.Item2} for all projects in {_repositoryRoot}.");
}
foreach (var item in solutionPinMetadata.PinVersionLookup)
{
var projectPinMetadata = item.Value;
var specProject = projectPinMetadata.PackageSpec;
if (!(projectPinMetadata.Packages.Any() || projectPinMetadata.CLIToolReferences.Any()))
if (!(projectPinMetadata.Packages.Any() || solutionPinMetadata.CLIToolReferences.Any()))
{
Console.WriteLine($"No package or tool references to pin for {specProject.FilePath}.");
continue;
@ -59,7 +64,11 @@ namespace PinVersions
Directory.CreateDirectory(Path.GetDirectoryName(pinnedReferencesFile));
Console.WriteLine($"Pinning package versions for {specProject.FilePath}.");
if (projectPinMetadata.Packages.Any())
{
Console.WriteLine($"Pinning package versions for {specProject.FilePath}.");
}
var pinnedReferences = new XElement("ItemGroup");
foreach (var packageReference in projectPinMetadata.Packages)
{
@ -79,10 +88,10 @@ namespace PinVersions
pinnedReferences.Add(new XElement("PackageReference", metadata));
}
foreach (var toolReference in projectPinMetadata.CLIToolReferences)
// CLI Tool references are specified at solution level.
foreach (var toolReference in solutionPinMetadata.CLIToolReferences)
{
(var libraryRange, var exactVersion) = toolReference;
Console.WriteLine($"Pinning CLI Tool {libraryRange.Name}({libraryRange.VersionRange} to {exactVersion}.");
var metadata = new List<XAttribute>
{
new XAttribute("Update", libraryRange.Name),
@ -97,10 +106,11 @@ namespace PinVersions
}
}
private IDictionary<string, PinVersionMetadata> GetPinVersionMetadata()
private SolutionPinVersionMetadata GetProjectPinVersionMetadata()
{
var repositoryDirectoryInfo = new DirectoryInfo(_repositoryRoot);
var projects = new Dictionary<string, PinVersionMetadata>(StringComparer.OrdinalIgnoreCase);
var projects = new Dictionary<string, ProjectPinVersionMetadata>(StringComparer.OrdinalIgnoreCase);
var cliToolReferences = new List<(LibraryRange, NuGetVersion)>();
foreach (var slnFile in repositoryDirectoryInfo.EnumerateFiles("*.sln"))
{
@ -109,7 +119,7 @@ namespace PinVersions
{
if (!projects.TryGetValue(specProject.FilePath, out var pinMetadata))
{
pinMetadata = new PinVersionMetadata(specProject);
pinMetadata = new ProjectPinVersionMetadata(specProject);
projects[specProject.FilePath] = pinMetadata;
}
@ -139,7 +149,7 @@ namespace PinVersions
}
else if (projectStyle == ProjectStyle.DotnetCliTool)
{
pinMetadata.CLIToolReferences.Add((reference.LibraryRange, exactVersion));
cliToolReferences.Add((reference.LibraryRange, exactVersion));
}
else
{
@ -149,7 +159,7 @@ namespace PinVersions
}
}
return projects;
return new SolutionPinVersionMetadata(projects, cliToolReferences);
}
private NuGetVersion GetExactVersion(string name, VersionRange range)
@ -188,20 +198,32 @@ namespace PinVersions
return null;
}
private struct PinVersionMetadata
private struct SolutionPinVersionMetadata
{
public PinVersionMetadata(PackageSpec packageSpec)
public SolutionPinVersionMetadata(
IDictionary<string, ProjectPinVersionMetadata> pinVersionLookup,
List<(LibraryRange, NuGetVersion)> cliToolReferences)
{
PinVersionLookup = pinVersionLookup;
CLIToolReferences = cliToolReferences;
}
public IDictionary<string, ProjectPinVersionMetadata> PinVersionLookup { get; }
public List<(LibraryRange, NuGetVersion)> CLIToolReferences { get; }
}
private struct ProjectPinVersionMetadata
{
public ProjectPinVersionMetadata(PackageSpec packageSpec)
{
PackageSpec = packageSpec;
Packages = new List<(NuGetFramework, LibraryRange, NuGetVersion)>();
CLIToolReferences = new List<(LibraryRange, NuGetVersion)>();
}
public PackageSpec PackageSpec { get; }
public List<(NuGetFramework, LibraryRange, NuGetVersion)> Packages { get; }
public List<(LibraryRange, NuGetVersion)> CLIToolReferences { get; }
}
}
}