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