diff --git a/Directory.Build.props b/Directory.Build.props index d768c80..ffae974 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -15,7 +15,7 @@ - + diff --git a/src/UpdatR/Domain/Csproj.cs b/src/UpdatR/Domain/Csproj.cs index ad7b9ac..f5b3a05 100644 --- a/src/UpdatR/Domain/Csproj.cs +++ b/src/UpdatR/Domain/Csproj.cs @@ -62,7 +62,7 @@ public static Csproj Create(string path) ); } - var doc = new XmlDocument { PreserveWhitespace = true, }; + var doc = new XmlDocument { PreserveWhitespace = true }; doc.Load(file.FullName); diff --git a/src/UpdatR/Domain/DotnetTools.cs b/src/UpdatR/Domain/DotnetTools.cs index 714d44f..a50bda2 100644 --- a/src/UpdatR/Domain/DotnetTools.cs +++ b/src/UpdatR/Domain/DotnetTools.cs @@ -12,7 +12,7 @@ internal sealed partial class DotnetTools private readonly FileInfo _path; private readonly IEnumerable _affectedCsprojs; private static readonly JsonSerializerOptions s_jsonSerializerOptions = - new(JsonSerializerDefaults.Web) { WriteIndented = true, }; + new(JsonSerializerDefaults.Web) { WriteIndented = true }; private DotnetTools(FileInfo path, IEnumerable affectedCsprojs) { diff --git a/src/UpdatR/Domain/RootDir.cs b/src/UpdatR/Domain/RootDir.cs index 4b7490d..77c620a 100644 --- a/src/UpdatR/Domain/RootDir.cs +++ b/src/UpdatR/Domain/RootDir.cs @@ -63,7 +63,7 @@ var projectFile in Directory.EnumerateFiles( new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive, - RecurseSubdirectories = true + RecurseSubdirectories = true, } ) ) @@ -81,7 +81,7 @@ var configFile in Directory.EnumerateFiles( { MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = true, - AttributesToSkip = FileAttributes.System + AttributesToSkip = FileAttributes.System, } ) ) @@ -143,12 +143,7 @@ private static RootDir CreateFromFile(FileInfo path) var dir = new RootDir(path.Directory!); - dir.AddDotnetTools( - Domain.DotnetTools.Create( - path.FullName, - projects - ) - ); + dir.AddDotnetTools(Domain.DotnetTools.Create(path.FullName, projects)); return dir; } @@ -170,12 +165,7 @@ static void AddDotnetToolsFromCsproj(RootDir dir) continue; } - dir.AddDotnetTools( - Domain.DotnetTools.Create( - configPath, - dir.Csprojs ?? [] - ) - ); + dir.AddDotnetTools(Domain.DotnetTools.Create(configPath, dir.Csprojs ?? [])); } } } @@ -189,16 +179,18 @@ private static HashSet GetProjectsRecursiveFromParent(DirectoryInfo path if (isInConfigFolder) { projects.AddRange( - Directory.EnumerateFiles( - path.Parent!.FullName, - "*.csproj", - new EnumerationOptions - { - MatchCasing = MatchCasing.CaseInsensitive, - RecurseSubdirectories = true - } - ) - .Select(Csproj.Create)); + Directory + .EnumerateFiles( + path.Parent!.FullName, + "*.csproj", + new EnumerationOptions + { + MatchCasing = MatchCasing.CaseInsensitive, + RecurseSubdirectories = true, + } + ) + .Select(Csproj.Create) + ); } return projects; @@ -217,7 +209,10 @@ private static IEnumerable GetProjectsFromSolution(FileInfo solution) => .Where(x => x.Exists) .Select(x => Csproj.Create(x.FullName)); - private static IEnumerable GetDotnetToolsConfigFromSolution(FileInfo solution, IEnumerable csprojs) => + private static IEnumerable GetDotnetToolsConfigFromSolution( + FileInfo solution, + IEnumerable csprojs + ) => Regex .Matches( File.ReadAllText(solution.FullName), diff --git a/src/UpdatR/Internals/Result.cs b/src/UpdatR/Internals/Result.cs index 4fe29e6..344c7d7 100644 --- a/src/UpdatR/Internals/Result.cs +++ b/src/UpdatR/Internals/Result.cs @@ -40,7 +40,7 @@ internal bool TryAddProject(ProjectWithPackages project) project = project with { Path = Path.GetRelativePath(_rootPath, project.Path) - .Replace(Path.DirectorySeparatorChar, '\\') + .Replace(Path.DirectorySeparatorChar, '\\'), }; foreach (var unknown in project.UnknownPackages) @@ -143,7 +143,7 @@ internal sealed class DeprecatedPackage( string packageId, NuGetVersion version, PackageDeprecationMetadata deprecationMetadata - ) +) { public string PackageId { get; } = packageId; public NuGetVersion Version { get; } = version; @@ -154,7 +154,7 @@ internal sealed class VulnerablePackage( string packageId, NuGetVersion version, IEnumerable vulnerabilities - ) +) { public string PackageId { get; } = packageId; public NuGetVersion Version { get; } = version; diff --git a/src/UpdatR/Summary.cs b/src/UpdatR/Summary.cs index acfda07..d9e8936 100644 --- a/src/UpdatR/Summary.cs +++ b/src/UpdatR/Summary.cs @@ -9,7 +9,7 @@ public sealed class Summary( IEnumerable updatedPackages, IEnumerable deprecatedPackages, IEnumerable vulnerablePackages - ) +) { private int? _updatedPackagesCount; @@ -26,77 +26,69 @@ IEnumerable vulnerablePackages /// /// Sources that failed to use due to 401. /// - public IEnumerable<(string Name, string Source)> UnauthorizedSources { get; } = unauthorizedSources; + public IEnumerable<(string Name, string Source)> UnauthorizedSources { get; } = + unauthorizedSources; internal static Summary Create(Result result) { - var updatedPackages = result.Projects - .SelectMany(x => x.UpdatedPackages.Select(y => (Package: y, Project: x.Path))) + var updatedPackages = result + .Projects.SelectMany(x => x.UpdatedPackages.Select(y => (Package: y, Project: x.Path))) .GroupBy(x => x.Package.PackageId) - .Select( - x => - new UpdatedPackage( - PackageId: x.Key, - Updates: x.Select(y => (y.Package.From, y.Package.To, y.Project)) - .OrderBy(x => x.Project) - ) - ); - - var deprecatedPackages = result.Projects - .SelectMany(x => x.DeprecatedPackages.Select(y => (Package: y, Project: x.Path))) + .Select(x => new UpdatedPackage( + PackageId: x.Key, + Updates: x.Select(y => (y.Package.From, y.Package.To, y.Project)) + .OrderBy(x => x.Project) + )); + + var deprecatedPackages = result + .Projects.SelectMany(x => + x.DeprecatedPackages.Select(y => (Package: y, Project: x.Path)) + ) .GroupBy(x => x.Package.PackageId) .Select(x => (PackageId: x.Key, Versions: x.GroupBy(y => y.Package.Version))) - .Select( - x => - ( - x.PackageId, - Versions: x.Versions.Select( - y => - ( - y.Key, - y.First().Package.DeprecationMetadata, - Projects: y.Select(z => z.Project) - ) + .Select(x => + ( + x.PackageId, + Versions: x.Versions.Select(y => + ( + y.Key, + y.First().Package.DeprecationMetadata, + Projects: y.Select(z => z.Project) ) ) + ) + ) + .Select(x => new DeprecatedPackage( + x.PackageId, + x.Versions.Select(y => + (new DeprecatedVersion(y.Key, y.DeprecationMetadata), y.Projects) + ) + )); + + var vulnerablePackages = result + .Projects.SelectMany(x => + x.VulnerablePackages.Select(y => (Package: y, Project: x.Path)) ) - .Select( - x => - new DeprecatedPackage( - x.PackageId, - x.Versions.Select( - y => (new DeprecatedVersion(y.Key, y.DeprecationMetadata), y.Projects) - ) - ) - ); - - var vulnerablePackages = result.Projects - .SelectMany(x => x.VulnerablePackages.Select(y => (Package: y, Project: x.Path))) .GroupBy(x => x.Package.PackageId) .Select(x => (PackageId: x.Key, Versions: x.GroupBy(y => y.Package.Version))) - .Select( - x => - ( - x.PackageId, - Versions: x.Versions.Select( - y => - ( - y.Key, - y.First().Package.Vulnerabilities, - Projects: y.Select(z => z.Project) - ) + .Select(x => + ( + x.PackageId, + Versions: x.Versions.Select(y => + ( + y.Key, + y.First().Package.Vulnerabilities, + Projects: y.Select(z => z.Project) ) ) + ) ) - .Select( - x => - new VulnerablePackage( - x.PackageId, - x.Versions.Select( - y => (new VulnerableVersion(y.Key, y.Vulnerabilities), y.Projects) - ) - ) - ); + .Select(x => new VulnerablePackage( + x.PackageId, + x.Versions.Select(y => + (new VulnerableVersion(y.Key, y.Vulnerabilities), y.Projects) + ) + )); return new Summary( result.UnknownPackages, diff --git a/src/UpdatR/Updater.cs b/src/UpdatR/Updater.cs index a881921..fb5bacd 100644 --- a/src/UpdatR/Updater.cs +++ b/src/UpdatR/Updater.cs @@ -13,7 +13,8 @@ namespace UpdatR; public sealed partial class Updater(ILogger? logger = null) { - private readonly ILogger _logger = logger ?? new Microsoft.Extensions.Logging.Abstractions.NullLogger(); + private readonly ILogger _logger = + logger ?? new Microsoft.Extensions.Logging.Abstractions.NullLogger(); /// /// Update all packages in solution or project(s). @@ -86,8 +87,8 @@ public async Task UpdateAsync( private static NuGetFramework? ParseTFM(string? targetFrameworkMoniker) { var tfm = string.IsNullOrWhiteSpace(targetFrameworkMoniker) - ? null - : NuGetFramework.Parse(targetFrameworkMoniker); + ? null + : NuGetFramework.Parse(targetFrameworkMoniker); if (tfm == NuGetFramework.UnsupportedFramework) { @@ -122,10 +123,10 @@ static Regex ConvertSearchPatternToRegex(string matchAgainst) } } - private async Task<(IDictionary Packages, IDictionary< - string, - string - > UnauthorizedSources)> GetPackageVersions( + private async Task<( + IDictionary Packages, + IDictionary UnauthorizedSources + )> GetPackageVersions( IEnumerable projects, IEnumerable dotnetTools, Func shouldIncludePackage, @@ -189,35 +190,26 @@ var repo in sourceRepositoryProvider var metadata = searchMetadata .OfType() .Where(x => x.Identity.HasVersion) - .Select( - x => - new PackageMetadata( - x.Identity.Version, - x.DependencySets.Select(x => x.TargetFramework), - x is PackageSearchMetadata y - && y.DeprecationMetadata is not null - ? new( - y.DeprecationMetadata.Message, - y.DeprecationMetadata.Reasons, - y.DeprecationMetadata.AlternatePackage is null - ? null - : new( - y.DeprecationMetadata - .AlternatePackage - .PackageId, - y.DeprecationMetadata.AlternatePackage.Range - ) + .Select(x => new PackageMetadata( + x.Identity.Version, + x.DependencySets.Select(x => x.TargetFramework), + x is PackageSearchMetadata y && y.DeprecationMetadata is not null + ? new( + y.DeprecationMetadata.Message, + y.DeprecationMetadata.Reasons, + y.DeprecationMetadata.AlternatePackage is null + ? null + : new( + y.DeprecationMetadata.AlternatePackage.PackageId, + y.DeprecationMetadata.AlternatePackage.Range ) - : null, - x.Vulnerabilities?.Select( - y => - new PackageVulnerabilityMetadata( - y.AdvisoryUrl, - y.Severity - ) - ) ) - ); + : null, + x.Vulnerabilities?.Select(y => new PackageVulnerabilityMetadata( + y.AdvisoryUrl, + y.Severity + )) + )); if (!metadata.Any()) { @@ -231,8 +223,8 @@ y.DeprecationMetadata.AlternatePackage is null { packageSearchMetadata[packageId] = package with { - PackageMetadatas = package.PackageMetadatas - .Union(metadata) + PackageMetadatas = package + .PackageMetadatas.Union(metadata) .DistinctBy(x => x.Version) .OrderByDescending(x => x.Version), }; diff --git a/tests/UpdatR.IntegrationTests/UpdaterTests.cs b/tests/UpdatR.IntegrationTests/UpdaterTests.cs index 0bbe290..0bb7e32 100644 --- a/tests/UpdatR.IntegrationTests/UpdaterTests.cs +++ b/tests/UpdatR.IntegrationTests/UpdaterTests.cs @@ -352,8 +352,7 @@ params string[]? packages var summary = await update.UpdateAsync(temp, null, packages); // Assert - await Verify(GetVerifyObjects()) - .UseParameters(string.Join('/', packages ?? [])); + await Verify(GetVerifyObjects()).UseParameters(string.Join('/', packages ?? [])); async IAsyncEnumerable GetVerifyObjects() { @@ -399,8 +398,7 @@ params string[]? excludedPackages var summary = await update.UpdateAsync(temp, excludedPackages); // Assert - await Verify(GetVerifyObjects()) - .UseParameters(string.Join('/', excludedPackages ?? [])); + await Verify(GetVerifyObjects()).UseParameters(string.Join('/', excludedPackages ?? [])); async IAsyncEnumerable GetVerifyObjects() { diff --git a/tests/UpdatR.UnitTests/Formatters/MarkdownFormatterTests.cs b/tests/UpdatR.UnitTests/Formatters/MarkdownFormatterTests.cs index df68efd..ed34beb 100644 --- a/tests/UpdatR.UnitTests/Formatters/MarkdownFormatterTests.cs +++ b/tests/UpdatR.UnitTests/Formatters/MarkdownFormatterTests.cs @@ -432,11 +432,7 @@ params PackageVulnerabilityMetadata[] vulnerabilities ) { _project.AddVulnerablePackage( - new( - packageId, - NuGetVersion.Parse(version), - vulnerabilities ?? [] - ) + new(packageId, NuGetVersion.Parse(version), vulnerabilities ?? []) ); return this; diff --git a/tools/Build/Build.cs b/tools/Build/Build.cs index 015cb0f..942e7ef 100644 --- a/tools/Build/Build.cs +++ b/tools/Build/Build.cs @@ -17,13 +17,11 @@ using static SimpleExec.Command; var services = new ServiceCollection() - .AddLogging( - builder => - { - builder.SetMinimumLevel(LogLevel.Information); - builder.AddConsole(); - } - ) + .AddLogging(builder => + { + builder.SetMinimumLevel(LogLevel.Information); + builder.AddConsole(); + }) .BuildServiceProvider(); var runsOnGitHubActions = !string.IsNullOrWhiteSpace( @@ -127,7 +125,7 @@ { Base = "main", Head = "update", - State = ItemStateFilter.Open + State = ItemStateFilter.Open, } ); @@ -241,27 +239,25 @@ static async Task AdjustReadmeForNuGet( } var newReadmeContent = originalReadmeContent - .Select( - x => x.StartsWith("##", StringComparison.OrdinalIgnoreCase) ? x[1..] : x + .Select(x => + x.StartsWith("##", StringComparison.OrdinalIgnoreCase) ? x[1..] : x ) - .Select( - line => + .Select(line => + { + foreach (var (_, id) in packagesToBe) { - foreach (var (_, id) in packagesToBe) + var relativeLink = + $"(#{id.Replace(".", string.Empty).ToLowerInvariant()})"; + var nugetLink = $"(https://www.nuget.org/packages/{id}/)"; + + if (line.Contains(relativeLink)) { - var relativeLink = - $"(#{id.Replace(".", string.Empty).ToLowerInvariant()})"; - var nugetLink = $"(https://www.nuget.org/packages/{id}/)"; - - if (line.Contains(relativeLink)) - { - line = line.Replace(relativeLink, nugetLink); - } + line = line.Replace(relativeLink, nugetLink); } - - return line; } - ); + + return line; + }); await File.WriteAllLinesAsync( Path.Combine(projectRoot, "docs", "README.md"), @@ -412,7 +408,7 @@ await packageUpdateResource.Push( await client.Repository.Release.Create( repositoryId, - new(tagRef) { Name = "UpdatR v" + version.ToString(), Prerelease = prerelease, } + new(tagRef) { Name = "UpdatR v" + version.ToString(), Prerelease = prerelease } ); } ); @@ -521,14 +517,12 @@ async Task GetLatestTagAsync() } } - return tags.Select( - tagRef => - { - _ = NuGetVersion.TryParse(tagRef[1..], out var version); + return tags.Select(tagRef => + { + _ = NuGetVersion.TryParse(tagRef[1..], out var version); - return (version: version ?? NuGetVersion.Parse("0.0.0"), tagRef); - } - ) + return (version: version ?? NuGetVersion.Parse("0.0.0"), tagRef); + }) .OrderByDescending(x => x.version) .First(); } @@ -545,8 +539,8 @@ string GetToken() var githubToken = runsOnGitHubActions ? Environment.GetEnvironmentVariable("GITHUB_TOKEN") : ((ConfigurationManager)new ConfigurationManager().AddUserSecrets()) - .GetSection("GitHub") - .GetValue("PAT"); + .GetSection("GitHub") + .GetValue("PAT"); if (string.IsNullOrWhiteSpace(githubToken)) { @@ -564,7 +558,7 @@ string GetToken() var project in Directory.EnumerateFiles(srcDir, "*.csproj", SearchOption.AllDirectories) ) { - var doc = new XmlDocument { PreserveWhitespace = true, }; + var doc = new XmlDocument { PreserveWhitespace = true }; doc.Load(project);