From e5474a7b42c0ceb20846a74b44f7718a6dc7e71e Mon Sep 17 00:00:00 2001 From: SimonCropp Date: Thu, 16 Apr 2020 21:24:49 +1000 Subject: [PATCH 1/4] . --- .../WildcardFileFinderTests.cs | 30 +++---- src/DiffEngine/WildcardFileFinder.cs | 88 +++++++++++-------- 2 files changed, 66 insertions(+), 52 deletions(-) diff --git a/src/DiffEngine.Tests/WildcardFileFinderTests.cs b/src/DiffEngine.Tests/WildcardFileFinderTests.cs index b006b351..9ff57077 100644 --- a/src/DiffEngine.Tests/WildcardFileFinderTests.cs +++ b/src/DiffEngine.Tests/WildcardFileFinderTests.cs @@ -19,21 +19,21 @@ public void FullFilePath_missing() Assert.Null(result); } - [Fact] - public void WildCardInFile() - { - var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.cs"); - Assert.True(WildcardFileFinder.TryFind(path, out var result)); - Assert.True(File.Exists(result)); - } + //[Fact] + //public void WildCardInFile() + //{ + // var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.cs"); + // Assert.True(WildcardFileFinder.TryFind(path, out var result)); + // Assert.True(File.Exists(result)); + //} - [Fact] - public void WildCardInFile_missing() - { - var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.foo"); - Assert.False(WildcardFileFinder.TryFind(path, out var result)); - Assert.Null(result); - } + //[Fact] + //public void WildCardInFile_missing() + //{ + // var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.foo"); + // Assert.False(WildcardFileFinder.TryFind(path, out var result)); + // Assert.Null(result); + //} [Fact] public void WildCardInDir() @@ -41,7 +41,7 @@ public void WildCardInDir() var directory = SourceDirectory.Replace("DiffEngine.Tests", "Diff*.Tests"); var path = Path.Combine(directory, "WildcardFileFinderTests.cs"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); - //Assert.True(File.Exists(result)); + Assert.True(File.Exists(result)); } [Fact] diff --git a/src/DiffEngine/WildcardFileFinder.cs b/src/DiffEngine/WildcardFileFinder.cs index 8619e9f2..60346d4c 100644 --- a/src/DiffEngine/WildcardFileFinder.cs +++ b/src/DiffEngine/WildcardFileFinder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; @@ -11,66 +12,79 @@ static class WildcardFileFinder Path.AltDirectorySeparatorChar }; - public static bool TryFind(string path, [NotNullWhen(true)] out string? result) + static IEnumerable EnumerateDirectories(string directory) { - var expanded = Environment.ExpandEnvironmentVariables(path); - if (path.Contains('*')) + var expanded = Environment.ExpandEnvironmentVariables(directory); + if (!directory.Contains('*')) + { + if (Directory.Exists(directory)) + { + return new List {directory}; + } + } + + var segments = expanded.Split(separators); + var currentSearchRoots = new List{segments[0] + Path.DirectorySeparatorChar}; + foreach (var segment in segments.Skip(1)) { - var directoryPart = Path.GetDirectoryName(expanded); - var filePart = Path.GetFileName(expanded); - var segments = directoryPart.Split(separators); - var currentPath = segments[0] + Path.DirectorySeparatorChar; - foreach (var segment in segments.Skip(1)) + var newSearchRoots = new List(); + foreach (var searchRoot in currentSearchRoots) { if (segment.Contains('*')) { - currentPath = Directory.EnumerateDirectories(currentPath, segment) - .OrderByDescending(Directory.GetLastWriteTime) - .FirstOrDefault(); - if (currentPath == null) - { - result = null; - return false; - } + newSearchRoots.AddRange(Directory.EnumerateDirectories(searchRoot, segment) + .OrderByDescending(Directory.GetLastWriteTime)); } else { - currentPath = Path.Combine(currentPath, segment); - if (!Directory.Exists(currentPath)) + var newSearchRoot = Path.Combine(searchRoot, segment); + if (Directory.Exists(newSearchRoot)) { - result = null; - return false; + newSearchRoots.Add(newSearchRoot); } } } - if (filePart.Contains('*')) + if (!newSearchRoots.Any()) { - currentPath = Directory.EnumerateFiles(currentPath, filePart).FirstOrDefault(); - if (currentPath != null) - { - result = currentPath; - return true; - } + return Enumerable.Empty(); } - else + currentSearchRoots = newSearchRoots; + } + + return currentSearchRoots; + } + + public static bool TryFind(string path, [NotNullWhen(true)] out string? result) + { + var expanded = Environment.ExpandEnvironmentVariables(path); + if (!path.Contains('*')) + { + if (File.Exists(expanded)) { - currentPath = Path.Combine(currentPath, filePart); - if (File.Exists(currentPath)) - { - result = currentPath; - return true; - } + result = expanded; + return true; } result = null; return false; } - if (File.Exists(expanded)) + var filePart = Path.GetFileName(expanded); + var directoryPart = Path.GetDirectoryName(expanded); + foreach (var directory in EnumerateDirectories(directoryPart)) { - result = expanded; - return true; + if (filePart.Contains('*')) + { + throw new Exception("Wildcard in file part currently not supported."); + } + + var filePath = Path.Combine(directory, filePart); + if (File.Exists(filePath)) + { + result = filePath; + return true; + } } result = null; From 3c829f033f5730e9472aa95b40d54b87c9551419 Mon Sep 17 00:00:00 2001 From: SimonCropp Date: Thu, 16 Apr 2020 21:48:05 +1000 Subject: [PATCH 2/4] . --- src/DiffEngine.Tests/DiffEngine.Tests.csproj | 3 --- src/DiffEngine.Tests/DirForSearch/dir1/TextFile2.txt | 1 + src/DiffEngine.Tests/WildcardFileFinderTests.cs | 8 ++++---- 3 files changed, 5 insertions(+), 7 deletions(-) create mode 100644 src/DiffEngine.Tests/DirForSearch/dir1/TextFile2.txt diff --git a/src/DiffEngine.Tests/DiffEngine.Tests.csproj b/src/DiffEngine.Tests/DiffEngine.Tests.csproj index e11cd797..f1ed559b 100644 --- a/src/DiffEngine.Tests/DiffEngine.Tests.csproj +++ b/src/DiffEngine.Tests/DiffEngine.Tests.csproj @@ -19,7 +19,4 @@ - - - \ No newline at end of file diff --git a/src/DiffEngine.Tests/DirForSearch/dir1/TextFile2.txt b/src/DiffEngine.Tests/DirForSearch/dir1/TextFile2.txt new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/src/DiffEngine.Tests/DirForSearch/dir1/TextFile2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/DiffEngine.Tests/WildcardFileFinderTests.cs b/src/DiffEngine.Tests/WildcardFileFinderTests.cs index 32a7b77d..df22594d 100644 --- a/src/DiffEngine.Tests/WildcardFileFinderTests.cs +++ b/src/DiffEngine.Tests/WildcardFileFinderTests.cs @@ -15,7 +15,7 @@ public void MultiMatchDir_order1() Directory.SetLastWriteTime(dir1, DateTime.Now); var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); - Assert.True(File.Exists(result)); + Assert.True(File.Exists(result), result); } [Fact] @@ -27,14 +27,14 @@ public void MultiMatchDir_order2() Directory.SetLastWriteTime(dir2, DateTime.Now); var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); - Assert.True(File.Exists(result)); + Assert.True(File.Exists(result), result); } [Fact] public void FullFilePath() { Assert.True(WildcardFileFinder.TryFind(SourceFile, out var result)); - Assert.True(File.Exists(result)); + Assert.True(File.Exists(result), result); } [Fact] @@ -66,7 +66,7 @@ public void WildCardInDir() var directory = SourceDirectory.Replace("DiffEngine.Tests", "Diff*.Tests"); var path = Path.Combine(directory, "WildcardFileFinderTests.cs"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); - Assert.True(File.Exists(result)); + Assert.True(File.Exists(result), result); } [Fact] From 75992faf475ac2ffd3e38311c765098ac6a14c1e Mon Sep 17 00:00:00 2001 From: SimonCropp Date: Thu, 16 Apr 2020 21:52:53 +1000 Subject: [PATCH 3/4] Update WildcardFileFinderTests.cs --- src/DiffEngine.Tests/WildcardFileFinderTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DiffEngine.Tests/WildcardFileFinderTests.cs b/src/DiffEngine.Tests/WildcardFileFinderTests.cs index df22594d..4258d149 100644 --- a/src/DiffEngine.Tests/WildcardFileFinderTests.cs +++ b/src/DiffEngine.Tests/WildcardFileFinderTests.cs @@ -9,8 +9,8 @@ public class WildcardFileFinderTests : [Fact] public void MultiMatchDir_order1() { - var dir1 = Path.Combine(SourceDirectory, @"DirForSearch\dir1"); - var dir2 = Path.Combine(SourceDirectory, @"DirForSearch\dir2"); + var dir1 = Path.Combine(SourceDirectory, "DirForSearch", "dir1"); + var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2"); Directory.SetLastWriteTime(dir2, DateTime.Now.AddDays(-1)); Directory.SetLastWriteTime(dir1, DateTime.Now); var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); @@ -21,8 +21,8 @@ public void MultiMatchDir_order1() [Fact] public void MultiMatchDir_order2() { - var dir1 = Path.Combine(SourceDirectory, @"DirForSearch\dir1"); - var dir2 = Path.Combine(SourceDirectory, @"DirForSearch\dir2"); + var dir1 = Path.Combine(SourceDirectory, "DirForSearch", "dir1"); + var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2"); Directory.SetLastWriteTime(dir1, DateTime.Now.AddDays(-1)); Directory.SetLastWriteTime(dir2, DateTime.Now); var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); From 2b1ae8950a08316af8eb689f91eef37772c3b50a Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Thu, 16 Apr 2020 22:01:40 +1000 Subject: [PATCH 4/4] Update WildcardFileFinderTests.cs --- src/DiffEngine.Tests/WildcardFileFinderTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DiffEngine.Tests/WildcardFileFinderTests.cs b/src/DiffEngine.Tests/WildcardFileFinderTests.cs index 4258d149..e2994b14 100644 --- a/src/DiffEngine.Tests/WildcardFileFinderTests.cs +++ b/src/DiffEngine.Tests/WildcardFileFinderTests.cs @@ -13,7 +13,7 @@ public void MultiMatchDir_order1() var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2"); Directory.SetLastWriteTime(dir2, DateTime.Now.AddDays(-1)); Directory.SetLastWriteTime(dir1, DateTime.Now); - var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); + var path = Path.Combine(SourceDirectory, "DirForSearch", "*", "TextFile1.txt"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); Assert.True(File.Exists(result), result); } @@ -25,7 +25,7 @@ public void MultiMatchDir_order2() var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2"); Directory.SetLastWriteTime(dir1, DateTime.Now.AddDays(-1)); Directory.SetLastWriteTime(dir2, DateTime.Now); - var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt"); + var path = Path.Combine(SourceDirectory, "DirForSearch", "*", "TextFile1.txt"); Assert.True(WildcardFileFinder.TryFind(path, out var result)); Assert.True(File.Exists(result), result); }