diff --git a/Src/CSharpier.Cli/IgnoreFile.cs b/Src/CSharpier.Cli/IgnoreFile.cs index 89d2320bf..a64738e0c 100644 --- a/Src/CSharpier.Cli/IgnoreFile.cs +++ b/Src/CSharpier.Cli/IgnoreFile.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using System.IO.Abstractions; using CSharpier.Cli.DotIgnore; using CSharpier.Core; @@ -35,17 +36,27 @@ public bool IsIgnored(string filePath) string baseDirectoryPath, IFileSystem fileSystem, string? ignorePath, + ConcurrentDictionary? ignoreCache, CancellationToken cancellationToken ) { - Task CreateIgnore(string ignoreFilePath, string? overrideBasePath) + async Task CreateIgnore(string ignoreFilePath, string? overrideBasePath) { - return IgnoreList.CreateAsync( + if (ignoreCache is not null && ignoreCache.TryGetValue(ignoreFilePath, out var ignore)) + { + return ignore; + } + + ignore = await IgnoreList.CreateAsync( fileSystem, overrideBasePath ?? Path.GetDirectoryName(ignoreFilePath)!, ignoreFilePath, cancellationToken ); + + ignoreCache?[ignoreFilePath] = ignore; + + return ignore; } return await SharedFunc diff --git a/Src/CSharpier.Cli/Options/OptionsProvider.cs b/Src/CSharpier.Cli/Options/OptionsProvider.cs index 0eb094614..153e1d20b 100644 --- a/Src/CSharpier.Cli/Options/OptionsProvider.cs +++ b/Src/CSharpier.Cli/Options/OptionsProvider.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; using System.IO.Abstractions; using System.Text.Json; +using CSharpier.Cli.DotIgnore; using CSharpier.Cli.EditorConfig; using CSharpier.Core; using Microsoft.Extensions.Logging; @@ -15,6 +16,7 @@ private readonly ConcurrentDictionary< string, CSharpierConfigData? > csharpierConfigsByDirectory = new(); + private readonly ConcurrentDictionary ignoreWithPathCache = new(); private readonly ConcurrentDictionary ignoreFilesByDirectory = new(); private readonly ConfigurationFileOptions? specifiedConfigFile; private readonly EditorConfigSections? specifiedEditorConfig; @@ -60,6 +62,7 @@ CancellationToken cancellationToken directoryName, fileSystem, ignorePath, + null, cancellationToken ); @@ -204,7 +207,13 @@ CancellationToken cancellationToken Path.Combine(searchingDirectory, ".csharpierignore") ), (searchingDirectory) => - IgnoreFile.CreateAsync(searchingDirectory, this.fileSystem, null, cancellationToken) + IgnoreFile.CreateAsync( + searchingDirectory, + this.fileSystem, + null, + ignoreWithPathCache, + cancellationToken + ) ); #pragma warning disable IDE0270 diff --git a/Src/CSharpier.Tests/Cli/IgnoreFileTests.cs b/Src/CSharpier.Tests/Cli/IgnoreFileTests.cs index 75e3de8f3..7398711fe 100644 --- a/Src/CSharpier.Tests/Cli/IgnoreFileTests.cs +++ b/Src/CSharpier.Tests/Cli/IgnoreFileTests.cs @@ -621,7 +621,13 @@ private void GitBasedTest(string gitignore, string[] files) var gitIgnoredFiles = files.Where(o => !gitUntrackedFiles.Contains(o)); var ignoreFile = IgnoreFile - .CreateAsync(this.gitRepository.RepoPath, this.fileSystem, null, CancellationToken.None) + .CreateAsync( + this.gitRepository.RepoPath, + this.fileSystem, + null, + null, + CancellationToken.None + ) .GetAwaiter() .GetResult();