diff --git a/src/Cake.Common.Tests/Unit/Security/DirectoryHashCalculatorTests.cs b/src/Cake.Common.Tests/Unit/Security/DirectoryHashCalculatorTests.cs index f50cf719c0..c60f1d6077 100644 --- a/src/Cake.Common.Tests/Unit/Security/DirectoryHashCalculatorTests.cs +++ b/src/Cake.Common.Tests/Unit/Security/DirectoryHashCalculatorTests.cs @@ -24,7 +24,7 @@ public void Should_Throw_If_Directory_Path_Is_Null() var calculator = new DirectoryHashCalculator(cakeContext, hashAlgorithmBuilder); // When - var result = Record.Exception(() => calculator.Calculate(null, null, HashAlgorithm.MD5)); + var result = Record.Exception(() => calculator.Calculate(null, null as string[], HashAlgorithm.MD5)); // Then AssertEx.IsArgumentNullException(result, "directoryPath"); diff --git a/src/Cake.Common/IO/DirectoryAliases.cs b/src/Cake.Common/IO/DirectoryAliases.cs index 53305bb22e..ff638c4b1b 100644 --- a/src/Cake.Common/IO/DirectoryAliases.cs +++ b/src/Cake.Common/IO/DirectoryAliases.cs @@ -151,7 +151,7 @@ public static void DeleteDirectory(this ICakeContext context, DirectoryPath path /// The pattern to match. [CakeMethodAlias] [CakeAliasCategory("Clean")] - public static void CleanDirectories(this ICakeContext context, string pattern) + public static void CleanDirectories(this ICakeContext context, GlobPattern pattern) { var directories = context.GetDirectories(pattern); if (directories.Count == 0) @@ -180,7 +180,7 @@ public static void CleanDirectories(this ICakeContext context, string pattern) /// The predicate used to filter directories based on file system information. [CakeMethodAlias] [CakeAliasCategory("Clean")] - public static void CleanDirectories(this ICakeContext context, string pattern, Func predicate) + public static void CleanDirectories(this ICakeContext context, GlobPattern pattern, Func predicate) { var directories = context.GetDirectories(pattern, new GlobberSettings { Predicate = predicate }); if (directories.Count == 0) diff --git a/src/Cake.Common/IO/FileAliases.cs b/src/Cake.Common/IO/FileAliases.cs index 7ca10ee925..eac90d6ca5 100644 --- a/src/Cake.Common/IO/FileAliases.cs +++ b/src/Cake.Common/IO/FileAliases.cs @@ -100,7 +100,7 @@ public static void CopyFile(this ICakeContext context, FilePath filePath, FilePa /// [CakeMethodAlias] [CakeAliasCategory("Copy")] - public static void CopyFiles(this ICakeContext context, string pattern, DirectoryPath targetDirectoryPath) + public static void CopyFiles(this ICakeContext context, GlobPattern pattern, DirectoryPath targetDirectoryPath) { FileCopier.CopyFiles(context, pattern, targetDirectoryPath, false); } @@ -166,7 +166,7 @@ public static void CopyFiles(this ICakeContext context, IEnumerable file /// [CakeMethodAlias] [CakeAliasCategory("Copy")] - public static void CopyFiles(this ICakeContext context, string pattern, DirectoryPath targetDirectoryPath, bool preserveFolderStructure) + public static void CopyFiles(this ICakeContext context, GlobPattern pattern, DirectoryPath targetDirectoryPath, bool preserveFolderStructure) { FileCopier.CopyFiles(context, pattern, targetDirectoryPath, preserveFolderStructure); } @@ -251,7 +251,7 @@ public static void MoveFileToDirectory(this ICakeContext context, FilePath fileP /// [CakeMethodAlias] [CakeAliasCategory("Move")] - public static void MoveFiles(this ICakeContext context, string pattern, DirectoryPath targetDirectoryPath) + public static void MoveFiles(this ICakeContext context, GlobPattern pattern, DirectoryPath targetDirectoryPath) { FileMover.MoveFiles(context, pattern, targetDirectoryPath); } @@ -305,7 +305,7 @@ public static void MoveFile(this ICakeContext context, FilePath filePath, FilePa /// [CakeMethodAlias] [CakeAliasCategory("Delete")] - public static void DeleteFiles(this ICakeContext context, string pattern) + public static void DeleteFiles(this ICakeContext context, GlobPattern pattern) { FileDeleter.DeleteFiles(context, pattern); } diff --git a/src/Cake.Common/IO/FileCopier.cs b/src/Cake.Common/IO/FileCopier.cs index bb59bcfb48..26ed8ea937 100644 --- a/src/Cake.Common/IO/FileCopier.cs +++ b/src/Cake.Common/IO/FileCopier.cs @@ -60,7 +60,7 @@ public static void CopyFile(ICakeContext context, FilePath filePath, FilePath ta CopyFileCore(context, filePath, targetFilePath, null); } - public static void CopyFiles(ICakeContext context, string pattern, DirectoryPath targetDirectoryPath, bool preserverFolderStructure) + public static void CopyFiles(ICakeContext context, GlobPattern pattern, DirectoryPath targetDirectoryPath, bool preserverFolderStructure) { if (context == null) { diff --git a/src/Cake.Common/IO/FileDeleter.cs b/src/Cake.Common/IO/FileDeleter.cs index 252e3f80b4..b1b884a3b0 100644 --- a/src/Cake.Common/IO/FileDeleter.cs +++ b/src/Cake.Common/IO/FileDeleter.cs @@ -14,7 +14,7 @@ namespace Cake.Common.IO { internal static class FileDeleter { - public static void DeleteFiles(ICakeContext context, string pattern) + public static void DeleteFiles(ICakeContext context, GlobPattern pattern) { if (context == null) { diff --git a/src/Cake.Common/IO/FileMover.cs b/src/Cake.Common/IO/FileMover.cs index 1e7dde1cf0..b41c48e687 100644 --- a/src/Cake.Common/IO/FileMover.cs +++ b/src/Cake.Common/IO/FileMover.cs @@ -31,7 +31,7 @@ public static void MoveFileToDirectory(ICakeContext context, FilePath filePath, MoveFile(context, filePath, targetDirectoryPath.GetFilePath(filePath)); } - public static void MoveFiles(ICakeContext context, string pattern, DirectoryPath targetDirectoryPath) + public static void MoveFiles(ICakeContext context, GlobPattern pattern, DirectoryPath targetDirectoryPath) { if (context == null) { diff --git a/src/Cake.Common/IO/GlobbingAliases.cs b/src/Cake.Common/IO/GlobbingAliases.cs index d43ed5d9d2..20ba938dd1 100644 --- a/src/Cake.Common/IO/GlobbingAliases.cs +++ b/src/Cake.Common/IO/GlobbingAliases.cs @@ -33,7 +33,7 @@ public static class GlobbingAliases /// A . [CakeMethodAlias] [CakeAliasCategory("Files")] - public static FilePathCollection GetFiles(this ICakeContext context, string pattern) + public static FilePathCollection GetFiles(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -65,7 +65,7 @@ public static FilePathCollection GetFiles(this ICakeContext context, string patt /// A . [CakeMethodAlias] [CakeAliasCategory("Files")] - public static FilePathCollection GetFiles(this ICakeContext context, string pattern, GlobberSettings settings) + public static FilePathCollection GetFiles(this ICakeContext context, GlobPattern pattern, GlobberSettings settings) { if (context == null) { @@ -92,7 +92,7 @@ public static FilePathCollection GetFiles(this ICakeContext context, string patt /// A . [CakeMethodAlias] [CakeAliasCategory("Directories")] - public static DirectoryPathCollection GetDirectories(this ICakeContext context, string pattern) + public static DirectoryPathCollection GetDirectories(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -124,7 +124,7 @@ public static DirectoryPathCollection GetDirectories(this ICakeContext context, /// A . [CakeMethodAlias] [CakeAliasCategory("Directories")] - public static DirectoryPathCollection GetDirectories(this ICakeContext context, string pattern, GlobberSettings settings) + public static DirectoryPathCollection GetDirectories(this ICakeContext context, GlobPattern pattern, GlobberSettings settings) { if (context == null) { @@ -151,7 +151,7 @@ public static DirectoryPathCollection GetDirectories(this ICakeContext context, /// A . [CakeMethodAlias] [CakeAliasCategory("Paths")] - public static PathCollection GetPaths(this ICakeContext context, string pattern) + public static PathCollection GetPaths(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -183,7 +183,7 @@ public static PathCollection GetPaths(this ICakeContext context, string pattern) /// A . [CakeMethodAlias] [CakeAliasCategory("Paths")] - public static PathCollection GetPaths(this ICakeContext context, string pattern, GlobberSettings settings) + public static PathCollection GetPaths(this ICakeContext context, GlobPattern pattern, GlobberSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Security/DirectoryHashCalculator.cs b/src/Cake.Common/Security/DirectoryHashCalculator.cs index 7ba64c7b7e..c226c08be6 100644 --- a/src/Cake.Common/Security/DirectoryHashCalculator.cs +++ b/src/Cake.Common/Security/DirectoryHashCalculator.cs @@ -56,7 +56,7 @@ public DirectoryHashCalculator(ICakeContext context, IHashAlgorithmBuilder hashA /// public DirectoryHash Calculate( DirectoryPath directoryPath, - IEnumerable pattern, + IEnumerable pattern, HashAlgorithm hashAlgorithm) { if (directoryPath == null) @@ -104,9 +104,44 @@ public DirectoryHash Calculate( } } + /// + /// Calculates the hash for a given directory. + /// + /// The directory path. + /// The glob pattern to match. + /// The hash algorithm to use. + /// A instance representing the calculated hash. + /// + /// + /// Information( + /// "Cake It calculates the hashes from all cs files in all subdirectories using a MD5 hash: {0}", + /// CalculateDirectoryHash("C:\directoryToHash", "./**/*.cs", HashAlgorithm.MD5).ToHex()); + /// + /// + public DirectoryHash Calculate( + DirectoryPath directoryPath, + IEnumerable pattern, + HashAlgorithm hashAlgorithm) + { + if (directoryPath == null) + { + throw new ArgumentNullException(nameof(directoryPath)); + } + + if (pattern == null) + { + throw new ArgumentNullException(nameof(pattern)); + } + + return Calculate( + directoryPath, + pattern.Select(GlobPattern.FromString), + hashAlgorithm); + } + private FilePathCollection GetDirectoryFiles( DirectoryPath directoryPath, - IEnumerable pattern) + IEnumerable pattern) { var directory = new Directory(directoryPath); @@ -118,7 +153,7 @@ private FilePathCollection GetDirectoryFiles( } var filePathCollection = new FilePathCollection(); - var fullGlobs = pattern.Select(x => directoryPath + x).ToArray(); + var fullGlobs = pattern.Select(x => directoryPath + x.Pattern).ToArray(); foreach (var glob in fullGlobs) { diff --git a/src/Cake.Common/Security/SecurityAliases.cs b/src/Cake.Common/Security/SecurityAliases.cs index 31c73e5b7a..33611b7efe 100644 --- a/src/Cake.Common/Security/SecurityAliases.cs +++ b/src/Cake.Common/Security/SecurityAliases.cs @@ -62,6 +62,55 @@ public static FileHash CalculateFileHash(this ICakeContext context, FilePath fil return fileHashCalculator.Calculate(filePath, hashAlgorithm); } + /// + /// Calculates the hash for a given directory using the default (SHA256) algorithm. + /// + /// The context. + /// The file path. + /// The glob pattern to match. + /// A instance representing the calculated hash. + /// + /// + /// Information( + /// "Cake It calculates the hashes from all cs files in all subdirectories using a SHA256 hash: {0}", + /// CalculateDirectoryHash("C:\directoryToHash", "./**/*.cs").ToHex()); + /// + /// + [CakeMethodAlias] + public static DirectoryHash CalculateDirectoryHash(this ICakeContext context, + IEnumerable globs, DirectoryPath directoryPath) + { + return CalculateDirectoryHash(context, directoryPath, globs, HashAlgorithm.SHA256); + } + + /// + /// Calculates the hash for a given directory. + /// + /// The context. + /// The file path. + /// The glob pattern to match. + /// The hash algorithm to use. + /// A instance representing the calculated hash. + /// + /// + /// Information( + /// "Cake It calculates the hashes from all cs files in all subdirectories using a MD5 hash: {0}", + /// CalculateDirectoryHash("C:\directoryToHash", "./**/*.cs", HashAlgorithm.MD5).ToHex()); + /// + /// + [CakeMethodAlias] + public static DirectoryHash CalculateDirectoryHash(this ICakeContext context, + DirectoryPath directoryPath, IEnumerable globs, HashAlgorithm hashAlgorithm) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + var directoryHashCalculator = new DirectoryHashCalculator(context, new HashAlgorithmBuilder()); + return directoryHashCalculator.Calculate(directoryPath, globs, hashAlgorithm); + } + /// /// Calculates the hash for a given directory using the default (SHA256) algorithm. /// diff --git a/src/Cake.Common/Solution/Project/XmlDoc/XmlDocAliases.cs b/src/Cake.Common/Solution/Project/XmlDoc/XmlDocAliases.cs index e81cdf62bb..2d6c988bb2 100644 --- a/src/Cake.Common/Solution/Project/XmlDoc/XmlDocAliases.cs +++ b/src/Cake.Common/Solution/Project/XmlDoc/XmlDocAliases.cs @@ -72,14 +72,14 @@ public static IEnumerable ParseXmlDocExampleCode(this ICakeCo /// /// [CakeMethodAlias] - public static IEnumerable ParseXmlDocFilesExampleCode(this ICakeContext context, string pattern) + public static IEnumerable ParseXmlDocFilesExampleCode(this ICakeContext context, GlobPattern pattern) { if (context == null) { throw new ArgumentNullException(nameof(context)); } - if (string.IsNullOrWhiteSpace(pattern)) + if (string.IsNullOrWhiteSpace(pattern?.Pattern)) { throw new ArgumentNullException(nameof(pattern)); } diff --git a/src/Cake.Common/Solution/Project/XmlDoc/XmlDocExampleCodeParser.cs b/src/Cake.Common/Solution/Project/XmlDoc/XmlDocExampleCodeParser.cs index b8e1d9eb36..f162b2e5f8 100644 --- a/src/Cake.Common/Solution/Project/XmlDoc/XmlDocExampleCodeParser.cs +++ b/src/Cake.Common/Solution/Project/XmlDoc/XmlDocExampleCodeParser.cs @@ -90,9 +90,9 @@ from code in example.Elements("code") /// /// The globber file pattern. /// Parsed Example Code. - public IEnumerable ParseFiles(string pattern) + public IEnumerable ParseFiles(GlobPattern pattern) { - if (string.IsNullOrWhiteSpace(pattern)) + if (string.IsNullOrWhiteSpace(pattern?.Pattern)) { throw new ArgumentNullException(nameof(pattern), "Invalid pattern supplied."); } diff --git a/src/Cake.Common/Tools/DotNetCore/DotNetCoreAliases.cs b/src/Cake.Common/Tools/DotNetCore/DotNetCoreAliases.cs index 49b5ce3348..77ddf6b4bb 100644 --- a/src/Cake.Common/Tools/DotNetCore/DotNetCoreAliases.cs +++ b/src/Cake.Common/Tools/DotNetCore/DotNetCoreAliases.cs @@ -1276,7 +1276,7 @@ public static void DotNetCoreMSBuild(this ICakeContext context, string projectOr [CakeMethodAlias] [CakeAliasCategory("Test")] [CakeNamespaceImport("Cake.Common.Tools.DotNetCore.VSTest")] - public static void DotNetCoreVSTest(this ICakeContext context, string testFile) => context.DotNetCoreVSTest(testFile, null); + public static void DotNetCoreVSTest(this ICakeContext context, GlobPattern testFile) => context.DotNetCoreVSTest(testFile, null); /// /// Test one or more projects specified by a path or glob pattern with settings using the VS Test host runner. @@ -1310,7 +1310,7 @@ public static void DotNetCoreMSBuild(this ICakeContext context, string projectOr [CakeMethodAlias] [CakeAliasCategory("Test")] [CakeNamespaceImport("Cake.Common.Tools.DotNetCore.VSTest")] - public static void DotNetCoreVSTest(this ICakeContext context, string testFile, DotNetCoreVSTestSettings settings) + public static void DotNetCoreVSTest(this ICakeContext context, GlobPattern testFile, DotNetCoreVSTestSettings settings) { var testFiles = context.GetFiles(testFile); diff --git a/src/Cake.Common/Tools/DupFinder/DupFinderAliases.cs b/src/Cake.Common/Tools/DupFinder/DupFinderAliases.cs index b3a53511d4..20303b890f 100644 --- a/src/Cake.Common/Tools/DupFinder/DupFinderAliases.cs +++ b/src/Cake.Common/Tools/DupFinder/DupFinderAliases.cs @@ -145,7 +145,7 @@ public static void DupFinder(this ICakeContext context, IEnumerable fi /// [CakeMethodAlias] [CakeAliasCategory("DupFinder")] - public static void DupFinder(this ICakeContext context, string pattern) + public static void DupFinder(this ICakeContext context, GlobPattern pattern) { DupFinder(context, pattern, new DupFinderSettings()); } @@ -169,7 +169,7 @@ public static void DupFinder(this ICakeContext context, string pattern) /// [CakeMethodAlias] [CakeAliasCategory("DupFinder")] - public static void DupFinder(this ICakeContext context, string pattern, DupFinderSettings settings) + public static void DupFinder(this ICakeContext context, GlobPattern pattern, DupFinderSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/Fixie/FixieAliases.cs b/src/Cake.Common/Tools/Fixie/FixieAliases.cs index 1c2b4b5356..ad377208ac 100644 --- a/src/Cake.Common/Tools/Fixie/FixieAliases.cs +++ b/src/Cake.Common/Tools/Fixie/FixieAliases.cs @@ -36,7 +36,7 @@ public static class FixieAliases /// The context. /// The pattern. [CakeMethodAlias] - public static void Fixie(this ICakeContext context, string pattern) + public static void Fixie(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -68,7 +68,7 @@ public static void Fixie(this ICakeContext context, string pattern) /// The pattern. /// The settings. [CakeMethodAlias] - public static void Fixie(this ICakeContext context, string pattern, FixieSettings settings) + public static void Fixie(this ICakeContext context, GlobPattern pattern, FixieSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/MSTest/MSTestAliases.cs b/src/Cake.Common/Tools/MSTest/MSTestAliases.cs index 74f48c9c25..58b3385e32 100644 --- a/src/Cake.Common/Tools/MSTest/MSTestAliases.cs +++ b/src/Cake.Common/Tools/MSTest/MSTestAliases.cs @@ -34,7 +34,7 @@ public static class MSTestAliases /// The context. /// The pattern. [CakeMethodAlias] - public static void MSTest(this ICakeContext context, string pattern) + public static void MSTest(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -63,7 +63,7 @@ public static void MSTest(this ICakeContext context, string pattern) /// The pattern. /// The settings. [CakeMethodAlias] - public static void MSTest(this ICakeContext context, string pattern, MSTestSettings settings) + public static void MSTest(this ICakeContext context, GlobPattern pattern, MSTestSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/MSpec/MSpecAliases.cs b/src/Cake.Common/Tools/MSpec/MSpecAliases.cs index fae4fcdccb..f3542cc99c 100644 --- a/src/Cake.Common/Tools/MSpec/MSpecAliases.cs +++ b/src/Cake.Common/Tools/MSpec/MSpecAliases.cs @@ -36,7 +36,7 @@ public static class MSpecAliases /// /// [CakeMethodAlias] - public static void MSpec(this ICakeContext context, string pattern) + public static void MSpec(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -71,7 +71,7 @@ public static void MSpec(this ICakeContext context, string pattern) /// /// [CakeMethodAlias] - public static void MSpec(this ICakeContext context, string pattern, MSpecSettings settings) + public static void MSpec(this ICakeContext context, GlobPattern pattern, MSpecSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/NUnit/NUnit3Aliases.cs b/src/Cake.Common/Tools/NUnit/NUnit3Aliases.cs index a2cf0e8ec2..d9da0bbe1b 100644 --- a/src/Cake.Common/Tools/NUnit/NUnit3Aliases.cs +++ b/src/Cake.Common/Tools/NUnit/NUnit3Aliases.cs @@ -36,7 +36,7 @@ public static class NUnit3Aliases /// /// [CakeMethodAlias] - public static void NUnit3(this ICakeContext context, string pattern) + public static void NUnit3(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -68,7 +68,7 @@ public static void NUnit3(this ICakeContext context, string pattern) /// /// [CakeMethodAlias] - public static void NUnit3(this ICakeContext context, string pattern, NUnit3Settings settings) + public static void NUnit3(this ICakeContext context, GlobPattern pattern, NUnit3Settings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/NUnit/NUnitAliases.cs b/src/Cake.Common/Tools/NUnit/NUnitAliases.cs index d87e029123..f8f2a8eb51 100644 --- a/src/Cake.Common/Tools/NUnit/NUnitAliases.cs +++ b/src/Cake.Common/Tools/NUnit/NUnitAliases.cs @@ -36,7 +36,7 @@ public static class NUnitAliases /// The context. /// The pattern. [CakeMethodAlias] - public static void NUnit(this ICakeContext context, string pattern) + public static void NUnit(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -69,7 +69,7 @@ public static void NUnit(this ICakeContext context, string pattern) /// The pattern. /// The settings. [CakeMethodAlias] - public static void NUnit(this ICakeContext context, string pattern, NUnitSettings settings) + public static void NUnit(this ICakeContext context, GlobPattern pattern, NUnitSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/ReportGenerator/ReportGeneratorAliases.cs b/src/Cake.Common/Tools/ReportGenerator/ReportGeneratorAliases.cs index 6160afb301..0f41f9b60b 100644 --- a/src/Cake.Common/Tools/ReportGenerator/ReportGeneratorAliases.cs +++ b/src/Cake.Common/Tools/ReportGenerator/ReportGeneratorAliases.cs @@ -35,7 +35,7 @@ public static class ReportGeneratorAliases /// /// [CakeMethodAlias] - public static void ReportGenerator(this ICakeContext context, string pattern, DirectoryPath targetDir) + public static void ReportGenerator(this ICakeContext context, GlobPattern pattern, DirectoryPath targetDir) { if (context == null) { @@ -60,7 +60,7 @@ public static void ReportGenerator(this ICakeContext context, string pattern, Di /// /// [CakeMethodAlias] - public static void ReportGenerator(this ICakeContext context, string pattern, DirectoryPath targetDir, ReportGeneratorSettings settings) + public static void ReportGenerator(this ICakeContext context, GlobPattern pattern, DirectoryPath targetDir, ReportGeneratorSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/VSTest/VSTestAliases.cs b/src/Cake.Common/Tools/VSTest/VSTestAliases.cs index ea240e0125..1987e764a3 100644 --- a/src/Cake.Common/Tools/VSTest/VSTestAliases.cs +++ b/src/Cake.Common/Tools/VSTest/VSTestAliases.cs @@ -29,7 +29,7 @@ public static class VSTestAliases /// The context. /// The pattern. [CakeMethodAlias] - public static void VSTest(this ICakeContext context, string pattern) + public static void VSTest(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -58,7 +58,7 @@ public static void VSTest(this ICakeContext context, string pattern) /// The pattern. /// The settings. [CakeMethodAlias] - public static void VSTest(this ICakeContext context, string pattern, VSTestSettings settings) + public static void VSTest(this ICakeContext context, GlobPattern pattern, VSTestSettings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/WiX/WiXAliases.cs b/src/Cake.Common/Tools/WiX/WiXAliases.cs index 4b7ed0109c..9940f548b5 100644 --- a/src/Cake.Common/Tools/WiX/WiXAliases.cs +++ b/src/Cake.Common/Tools/WiX/WiXAliases.cs @@ -43,7 +43,7 @@ public static class WiXAliases /// The settings. [CakeMethodAlias] [CakeAliasCategory("Candle")] - public static void WiXCandle(this ICakeContext context, string pattern, CandleSettings settings = null) + public static void WiXCandle(this ICakeContext context, GlobPattern pattern, CandleSettings settings = null) { if (context == null) { @@ -105,7 +105,7 @@ public static void WiXCandle(this ICakeContext context, IEnumerable so /// The settings. [CakeMethodAlias] [CakeAliasCategory("Light")] - public static void WiXLight(this ICakeContext context, string pattern, LightSettings settings = null) + public static void WiXLight(this ICakeContext context, GlobPattern pattern, LightSettings settings = null) { if (context == null) { diff --git a/src/Cake.Common/Tools/XUnit/XUnit2Aliases.cs b/src/Cake.Common/Tools/XUnit/XUnit2Aliases.cs index ff4764c234..65c540939e 100644 --- a/src/Cake.Common/Tools/XUnit/XUnit2Aliases.cs +++ b/src/Cake.Common/Tools/XUnit/XUnit2Aliases.cs @@ -36,7 +36,7 @@ public static class XUnit2Aliases /// /// [CakeMethodAlias] - public static void XUnit2(this ICakeContext context, string pattern) + public static void XUnit2(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -71,7 +71,7 @@ public static void XUnit2(this ICakeContext context, string pattern) /// /// [CakeMethodAlias] - public static void XUnit2(this ICakeContext context, string pattern, XUnit2Settings settings) + public static void XUnit2(this ICakeContext context, GlobPattern pattern, XUnit2Settings settings) { if (context == null) { diff --git a/src/Cake.Common/Tools/XUnit/XUnitAliases.cs b/src/Cake.Common/Tools/XUnit/XUnitAliases.cs index ff992ced8e..64422b84cc 100644 --- a/src/Cake.Common/Tools/XUnit/XUnitAliases.cs +++ b/src/Cake.Common/Tools/XUnit/XUnitAliases.cs @@ -35,7 +35,7 @@ public static class XUnitAliases /// /// [CakeMethodAlias] - public static void XUnit(this ICakeContext context, string pattern) + public static void XUnit(this ICakeContext context, GlobPattern pattern) { if (context == null) { @@ -62,7 +62,7 @@ public static void XUnit(this ICakeContext context, string pattern) /// /// [CakeMethodAlias] - public static void XUnit(this ICakeContext context, string pattern, XUnitSettings settings) + public static void XUnit(this ICakeContext context, GlobPattern pattern, XUnitSettings settings) { if (context == null) { diff --git a/src/Cake.Core/IO/GlobPattern.cs b/src/Cake.Core/IO/GlobPattern.cs new file mode 100644 index 0000000000..eb632c77cc --- /dev/null +++ b/src/Cake.Core/IO/GlobPattern.cs @@ -0,0 +1,90 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; + +namespace Cake.Core.IO +{ + /// + /// The file system globber pattern. + /// + public sealed class GlobPattern + { + /// + /// Gets the the globber pattern. + /// + public string Pattern { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The globber pattern. + public GlobPattern(string pattern) + { + Pattern = pattern; + } + + /// + /// Performs an implicit conversion from to . + /// + /// The string pattern. + /// A . + public static implicit operator GlobPattern(string pattern) + { + return pattern is null ? null : FromString(pattern); + } + + /// + /// Performs an implicit conversion from to . + /// + /// The glob pattern. + /// A . + public static implicit operator string(GlobPattern pattern) + { + return pattern?.Pattern; + } + + /// + /// Performs a conversion from to . + /// + /// The pattern. + /// A . + public static GlobPattern FromString(string pattern) + { + return new GlobPattern(pattern); + } + + /// + /// Determines whether two . instances are equal. + /// + /// The object to compare with the current object. + /// + /// true if the specified object is equal to the current object; otherwise, false. + /// + public override bool Equals(object obj) + { + return obj is GlobPattern pattern && + Pattern == pattern.Pattern; + } + + /// + /// Returns the hash code for the . + /// + /// + /// A 32-bit signed integer hash code. + /// + public override int GetHashCode() + { + return -891421391 + EqualityComparer.Default.GetHashCode(Pattern); + } + + /// + /// Returns a that represents this instance. + /// + /// + /// A that represents this instance. + /// + public override string ToString() => Pattern; + } +} \ No newline at end of file diff --git a/src/Cake.Core/IO/Globber.cs b/src/Cake.Core/IO/Globber.cs index aeda643b3f..4ede141907 100644 --- a/src/Cake.Core/IO/Globber.cs +++ b/src/Cake.Core/IO/Globber.cs @@ -49,13 +49,13 @@ public Globber(IFileSystem fileSystem, ICakeEnvironment environment) /// /// instances matching the specified pattern. /// - public IEnumerable Match(string pattern, GlobberSettings settings) + public IEnumerable Match(GlobPattern pattern, GlobberSettings settings) { if (pattern == null) { throw new ArgumentNullException(nameof(pattern)); } - if (string.IsNullOrWhiteSpace(pattern)) + if (string.IsNullOrWhiteSpace(pattern?.Pattern)) { return Enumerable.Empty(); } diff --git a/src/Cake.Core/IO/GlobberExtensions.cs b/src/Cake.Core/IO/GlobberExtensions.cs index 7ccd7e954d..4c44144449 100644 --- a/src/Cake.Core/IO/GlobberExtensions.cs +++ b/src/Cake.Core/IO/GlobberExtensions.cs @@ -19,7 +19,7 @@ public static class GlobberExtensions /// The globber. /// The pattern. /// The files matching the specified pattern. - public static IEnumerable GetFiles(this IGlobber globber, string pattern) + public static IEnumerable GetFiles(this IGlobber globber, GlobPattern pattern) { if (globber == null) { @@ -34,7 +34,7 @@ public static IEnumerable GetFiles(this IGlobber globber, string patte /// The globber. /// The pattern. /// The directories matching the specified pattern. - public static IEnumerable GetDirectories(this IGlobber globber, string pattern) + public static IEnumerable GetDirectories(this IGlobber globber, GlobPattern pattern) { if (globber == null) { @@ -51,7 +51,7 @@ public static IEnumerable GetDirectories(this IGlobber globber, s /// /// instances matching the specified pattern. /// - public static IEnumerable Match(this IGlobber globber, string pattern) + public static IEnumerable Match(this IGlobber globber, GlobPattern pattern) { if (globber == null) { diff --git a/src/Cake.Core/IO/Globbing/GlobNodeRewriter.cs b/src/Cake.Core/IO/Globbing/GlobNodeRewriter.cs index 776ce0b084..495e66106f 100644 --- a/src/Cake.Core/IO/Globbing/GlobNodeRewriter.cs +++ b/src/Cake.Core/IO/Globbing/GlobNodeRewriter.cs @@ -10,13 +10,13 @@ namespace Cake.Core.IO.Globbing { internal static class GlobNodeRewriter { - public static GlobNode Rewrite(string pattern, IEnumerable nodes) + public static GlobNode Rewrite(GlobPattern pattern, IEnumerable nodes) { return RewriteUncRoot(pattern, CreateLinkedList( RewriteSingleWildcards(nodes))); } - private static GlobNode RewriteUncRoot(string pattern, GlobNode root) + private static GlobNode RewriteUncRoot(GlobPattern pattern, GlobNode root) { if (root is UncRootNode unc && unc.Server == null) { diff --git a/src/Cake.Core/IO/Globbing/GlobNodeValidator.cs b/src/Cake.Core/IO/Globbing/GlobNodeValidator.cs index 1dc1885264..fdab065af3 100644 --- a/src/Cake.Core/IO/Globbing/GlobNodeValidator.cs +++ b/src/Cake.Core/IO/Globbing/GlobNodeValidator.cs @@ -9,7 +9,7 @@ namespace Cake.Core.IO.Globbing { internal static class GlobNodeValidator { - public static void Validate(string pattern, GlobNode node) + public static void Validate(GlobPattern pattern, GlobNode node) { var previous = (GlobNode)null; var current = node; diff --git a/src/Cake.Core/IO/Globbing/GlobParser.cs b/src/Cake.Core/IO/Globbing/GlobParser.cs index bdccdff239..bec4114a7e 100644 --- a/src/Cake.Core/IO/Globbing/GlobParser.cs +++ b/src/Cake.Core/IO/Globbing/GlobParser.cs @@ -24,7 +24,7 @@ public GlobParser(ICakeEnvironment environment) _environment = environment; } - public GlobNode Parse(string pattern, GlobberSettings settings) + public GlobNode Parse(GlobPattern pattern, GlobberSettings settings) { var buffer = GlobTokenizer.Tokenize(pattern); var isCaseSensitive = settings.IsCaseSensitive ?? _environment.Platform.IsUnix(); diff --git a/src/Cake.Core/IO/Globbing/GlobParserContext.cs b/src/Cake.Core/IO/Globbing/GlobParserContext.cs index 95d910a955..e7aa2a6b5b 100644 --- a/src/Cake.Core/IO/Globbing/GlobParserContext.cs +++ b/src/Cake.Core/IO/Globbing/GlobParserContext.cs @@ -12,12 +12,12 @@ internal sealed class GlobParserContext { private readonly GlobTokenBuffer _buffer; - public string Pattern { get; } + public GlobPattern Pattern { get; } public int TokenCount => _buffer.Count; public GlobToken CurrentToken { get; private set; } public RegexOptions Options { get; } - public GlobParserContext(string pattern, GlobTokenBuffer buffer, bool caseSensitive) + public GlobParserContext(GlobPattern pattern, GlobTokenBuffer buffer, bool caseSensitive) { _buffer = buffer; diff --git a/src/Cake.Core/IO/Globbing/GlobTokenizer.cs b/src/Cake.Core/IO/Globbing/GlobTokenizer.cs index ed48a8c905..edbc106df6 100644 --- a/src/Cake.Core/IO/Globbing/GlobTokenizer.cs +++ b/src/Cake.Core/IO/Globbing/GlobTokenizer.cs @@ -13,9 +13,9 @@ namespace Cake.Core.IO.Globbing { internal static class GlobTokenizer { - public static GlobTokenBuffer Tokenize(string input) + public static GlobTokenBuffer Tokenize(GlobPattern input) { - return Tokenize(new StringReader(input)); + return Tokenize(new StringReader(input.Pattern)); } private static GlobTokenBuffer Tokenize(StringReader reader) diff --git a/src/Cake.Core/IO/IGlobber.cs b/src/Cake.Core/IO/IGlobber.cs index 3c75aa37a8..fff992db50 100644 --- a/src/Cake.Core/IO/IGlobber.cs +++ b/src/Cake.Core/IO/IGlobber.cs @@ -20,6 +20,6 @@ public interface IGlobber /// /// instances matching the specified pattern. /// - IEnumerable Match(string pattern, GlobberSettings settings); + IEnumerable Match(GlobPattern pattern, GlobberSettings settings); } } \ No newline at end of file