From a9aca5f1011ddbfa6d510de8d90987dcf2ef4478 Mon Sep 17 00:00:00 2001 From: Cyril Mulder Date: Thu, 22 Feb 2024 14:21:51 +0100 Subject: [PATCH] Added support for Directory.Packages.props --- .../FileTypes/DirectoryPackagesPropsFile.cs | 8 +++ src/LibYear.Core/ProjectFileManager.cs | 7 +- .../FileTypes/Directory.Packages.props | 13 ++++ .../FileTypes/DirectoryPackagesPropsTests.cs | 68 +++++++++++++++++++ .../LibYear.Core.Tests.csproj | 5 ++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/LibYear.Core/FileTypes/DirectoryPackagesPropsFile.cs create mode 100644 test/LibYear.Core.Tests/FileTypes/Directory.Packages.props create mode 100644 test/LibYear.Core.Tests/FileTypes/DirectoryPackagesPropsTests.cs diff --git a/src/LibYear.Core/FileTypes/DirectoryPackagesPropsFile.cs b/src/LibYear.Core/FileTypes/DirectoryPackagesPropsFile.cs new file mode 100644 index 0000000..6a8dd5c --- /dev/null +++ b/src/LibYear.Core/FileTypes/DirectoryPackagesPropsFile.cs @@ -0,0 +1,8 @@ +namespace LibYear.Core.FileTypes; + +public class DirectoryPackagesPropsFile : XmlProjectFile +{ + public DirectoryPackagesPropsFile(string filename, string contents) : base(filename, contents, "PackageVersion", new[] { "Include", "Update" }, "Version") + { + } +} \ No newline at end of file diff --git a/src/LibYear.Core/ProjectFileManager.cs b/src/LibYear.Core/ProjectFileManager.cs index 7aa09bb..ddc602f 100644 --- a/src/LibYear.Core/ProjectFileManager.cs +++ b/src/LibYear.Core/ProjectFileManager.cs @@ -1,6 +1,5 @@ -using System.IO.Abstractions; -using System.Text; using LibYear.Core.FileTypes; +using System.IO.Abstractions; namespace LibYear.Core; @@ -49,6 +48,7 @@ private IReadOnlyCollection> FindProjects(IDirectoryInfo dir, .Union(dir.EnumerateFiles("Directory.build.props", searchMode)) .Union(dir.EnumerateFiles("Directory.build.targets", searchMode)) .Union(dir.EnumerateFiles("packages.config", searchMode)) + .Union(dir.EnumerateFiles("Directory.packages.props", searchMode)) .Select(ReadFile) .ToArray(); @@ -56,6 +56,7 @@ private IReadOnlyCollection> FindProjects(IDirectoryInfo dir, private static bool IsDirectoryBuildPropsFile(IFileSystemInfo fileInfo) => fileInfo.Name == "Directory.Build.props"; private static bool IsDirectoryBuildTargetsFile(IFileSystemInfo fileInfo) => fileInfo.Name == "Directory.Build.targets"; private static bool IsNuGetFile(IFileSystemInfo fileInfo) => fileInfo.Name == "packages.config"; + private static bool IsDirectoryPackagesPropsFile(IFileSystemInfo fileInfo) => fileInfo.Name == "Directory.Packages.props"; private async Task ReadFile(IFileSystemInfo fileInfo) { @@ -72,6 +73,8 @@ private async Task ReadFile(IFileSystemInfo fileInfo) return new DirectoryBuildTargetsFile(path, contents); if (IsNuGetFile(fileInfo)) return new PackagesConfigFile(path, contents); + if (IsDirectoryPackagesPropsFile(fileInfo)) + return new DirectoryPackagesPropsFile(path, contents); throw new NotImplementedException("Unknown file type"); } diff --git a/test/LibYear.Core.Tests/FileTypes/Directory.Packages.props b/test/LibYear.Core.Tests/FileTypes/Directory.Packages.props new file mode 100644 index 0000000..7d987d7 --- /dev/null +++ b/test/LibYear.Core.Tests/FileTypes/Directory.Packages.props @@ -0,0 +1,13 @@ + + + true + + + + + + test3 + 0.3.0 + + + \ No newline at end of file diff --git a/test/LibYear.Core.Tests/FileTypes/DirectoryPackagesPropsTests.cs b/test/LibYear.Core.Tests/FileTypes/DirectoryPackagesPropsTests.cs new file mode 100644 index 0000000..e30be39 --- /dev/null +++ b/test/LibYear.Core.Tests/FileTypes/DirectoryPackagesPropsTests.cs @@ -0,0 +1,68 @@ +using LibYear.Core.FileTypes; +using Xunit; + +namespace LibYear.Core.Tests.FileTypes; + +public class DirectoryPackagesPropsTests +{ + [Fact] + public async Task CanLoadDirectoryPackagesPropsFile() + { + //arrange + var filename = Path.Combine("FileTypes", "Directory.Packages.props"); + + //act + var file = new DirectoryPackagesPropsFile(filename, await File.ReadAllTextAsync(filename)); + + //assert + Assert.Equal("test1", file.Packages.First().Key); + Assert.Equal("test2", file.Packages.Skip(1).First().Key); + Assert.Equal("test3", file.Packages.Skip(2).First().Key); + } + + [Fact] + public async Task CanUpdateDirectoryPackagesPropsFile() + { + //arrange + var filename = Path.Combine("FileTypes", "Directory.Packages.props"); + var file = new DirectoryPackagesPropsFile(filename, await File.ReadAllTextAsync(filename)); + var results = new[] + { + new Result("test1", new Release(new PackageVersion(0, 1, 0), DateTime.Today), new Release(new PackageVersion(1, 2, 3), DateTime.Today)), + new Result("test2", new Release(new PackageVersion(0, 2, 0), DateTime.Today), new Release(new PackageVersion(2, 3, 4), DateTime.Today)), + new Result("test3", new Release(new PackageVersion(0, 3, 0), DateTime.Today), new Release(new PackageVersion(3, 4, 5), DateTime.Today)) + }; + + //act + var updated = file.Update(results); + + //assert + var newFile = new DirectoryPackagesPropsFile(filename, updated); + Assert.Equal("1.2.3", newFile.Packages.First().Value!.ToString()); + Assert.Equal("2.3.4", newFile.Packages.Skip(1).First().Value!.ToString()); + Assert.Equal("3.4.5", newFile.Packages.Skip(2).First().Value!.ToString()); + } + + [Fact] + public async Task InvalidVersionShowsInfo() + { + //arrange + var filename = Path.Combine("FileTypes", "Directory.Packages.props"); + var contents = await File.ReadAllTextAsync(filename); + var newContents = contents.Replace("0.2.0", "0.2.x"); + + try + { + //act + _ = new DirectoryPackagesPropsFile(filename, newContents); + Assert.False(true); + } + catch (Exception e) + { + //assert + Assert.Contains("0.2.x", e.Message); + Assert.Contains("test2", e.Message); + Assert.Contains("Directory.Packages.props", e.Message); + } + } +} \ No newline at end of file diff --git a/test/LibYear.Core.Tests/LibYear.Core.Tests.csproj b/test/LibYear.Core.Tests/LibYear.Core.Tests.csproj index 27963c8..5c4f22d 100644 --- a/test/LibYear.Core.Tests/LibYear.Core.Tests.csproj +++ b/test/LibYear.Core.Tests/LibYear.Core.Tests.csproj @@ -18,4 +18,9 @@ + + + Always + + \ No newline at end of file