Skip to content

Commit 8ad3dca

Browse files
committed
2 parents ba83ab5 + 4c3fdfb commit 8ad3dca

2 files changed

Lines changed: 75 additions & 61 deletions

File tree

src/DiffEngine.Tests/WildcardFileFinderTests.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,32 @@ public class WildcardFileFinderTests :
99
[Fact]
1010
public void MultiMatchDir_order1()
1111
{
12-
var dir1 = Path.Combine(SourceDirectory, @"DirForSearch\dir1");
13-
var dir2 = Path.Combine(SourceDirectory, @"DirForSearch\dir2");
12+
var dir1 = Path.Combine(SourceDirectory, "DirForSearch", "dir1");
13+
var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2");
1414
Directory.SetLastWriteTime(dir2, DateTime.Now.AddDays(-1));
1515
Directory.SetLastWriteTime(dir1, DateTime.Now);
16-
var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt");
16+
var path = Path.Combine(SourceDirectory, "DirForSearch", "*", "TextFile1.txt");
1717
Assert.True(WildcardFileFinder.TryFind(path, out var result));
18-
Assert.True(File.Exists(result));
18+
Assert.True(File.Exists(result), result);
1919
}
2020

2121
[Fact]
2222
public void MultiMatchDir_order2()
2323
{
24-
var dir1 = Path.Combine(SourceDirectory, @"DirForSearch\dir1");
25-
var dir2 = Path.Combine(SourceDirectory, @"DirForSearch\dir2");
24+
var dir1 = Path.Combine(SourceDirectory, "DirForSearch", "dir1");
25+
var dir2 = Path.Combine(SourceDirectory, "DirForSearch", "dir2");
2626
Directory.SetLastWriteTime(dir1, DateTime.Now.AddDays(-1));
2727
Directory.SetLastWriteTime(dir2, DateTime.Now);
28-
var path = Path.Combine(SourceDirectory, @"DirForSearch\*\TextFile1.txt");
28+
var path = Path.Combine(SourceDirectory, "DirForSearch", "*", "TextFile1.txt");
2929
Assert.True(WildcardFileFinder.TryFind(path, out var result));
30-
Assert.True(File.Exists(result));
30+
Assert.True(File.Exists(result), result);
3131
}
3232

3333
[Fact]
3434
public void FullFilePath()
3535
{
3636
Assert.True(WildcardFileFinder.TryFind(SourceFile, out var result));
37-
Assert.True(File.Exists(result));
37+
Assert.True(File.Exists(result), result);
3838
}
3939

4040
[Fact]
@@ -44,29 +44,29 @@ public void FullFilePath_missing()
4444
Assert.Null(result);
4545
}
4646

47-
[Fact]
48-
public void WildCardInFile()
49-
{
50-
var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.cs");
51-
Assert.True(WildcardFileFinder.TryFind(path, out var result));
52-
Assert.True(File.Exists(result));
53-
}
47+
//[Fact]
48+
//public void WildCardInFile()
49+
//{
50+
// var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.cs");
51+
// Assert.True(WildcardFileFinder.TryFind(path, out var result));
52+
// Assert.True(File.Exists(result));
53+
//}
5454

55-
[Fact]
56-
public void WildCardInFile_missing()
57-
{
58-
var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.foo");
59-
Assert.False(WildcardFileFinder.TryFind(path, out var result));
60-
Assert.Null(result);
61-
}
55+
//[Fact]
56+
//public void WildCardInFile_missing()
57+
//{
58+
// var path = Path.Combine(SourceDirectory, "WildcardFileFinder*.foo");
59+
// Assert.False(WildcardFileFinder.TryFind(path, out var result));
60+
// Assert.Null(result);
61+
//}
6262

6363
[Fact]
6464
public void WildCardInDir()
6565
{
6666
var directory = SourceDirectory.Replace("DiffEngine.Tests", "Diff*.Tests");
6767
var path = Path.Combine(directory, "WildcardFileFinderTests.cs");
6868
Assert.True(WildcardFileFinder.TryFind(path, out var result));
69-
//Assert.True(File.Exists(result));
69+
Assert.True(File.Exists(result), result);
7070
}
7171

7272
[Fact]

src/DiffEngine/WildcardFileFinder.cs

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics.CodeAnalysis;
34
using System.IO;
45
using System.Linq;
@@ -11,66 +12,79 @@ static class WildcardFileFinder
1112
Path.AltDirectorySeparatorChar
1213
};
1314

14-
public static bool TryFind(string path, [NotNullWhen(true)] out string? result)
15+
static IEnumerable<string> EnumerateDirectories(string directory)
1516
{
16-
var expanded = Environment.ExpandEnvironmentVariables(path);
17-
if (path.Contains('*'))
17+
var expanded = Environment.ExpandEnvironmentVariables(directory);
18+
if (!directory.Contains('*'))
19+
{
20+
if (Directory.Exists(directory))
21+
{
22+
return new List<string> {directory};
23+
}
24+
}
25+
26+
var segments = expanded.Split(separators);
27+
var currentSearchRoots = new List<string>{segments[0] + Path.DirectorySeparatorChar};
28+
foreach (var segment in segments.Skip(1))
1829
{
19-
var directoryPart = Path.GetDirectoryName(expanded);
20-
var filePart = Path.GetFileName(expanded);
21-
var segments = directoryPart.Split(separators);
22-
var currentPath = segments[0] + Path.DirectorySeparatorChar;
23-
foreach (var segment in segments.Skip(1))
30+
var newSearchRoots = new List<string>();
31+
foreach (var searchRoot in currentSearchRoots)
2432
{
2533
if (segment.Contains('*'))
2634
{
27-
currentPath = Directory.EnumerateDirectories(currentPath, segment)
28-
.OrderByDescending(Directory.GetLastWriteTime)
29-
.FirstOrDefault();
30-
if (currentPath == null)
31-
{
32-
result = null;
33-
return false;
34-
}
35+
newSearchRoots.AddRange(Directory.EnumerateDirectories(searchRoot, segment)
36+
.OrderByDescending(Directory.GetLastWriteTime));
3537
}
3638
else
3739
{
38-
currentPath = Path.Combine(currentPath, segment);
39-
if (!Directory.Exists(currentPath))
40+
var newSearchRoot = Path.Combine(searchRoot, segment);
41+
if (Directory.Exists(newSearchRoot))
4042
{
41-
result = null;
42-
return false;
43+
newSearchRoots.Add(newSearchRoot);
4344
}
4445
}
4546
}
4647

47-
if (filePart.Contains('*'))
48+
if (!newSearchRoots.Any())
4849
{
49-
currentPath = Directory.EnumerateFiles(currentPath, filePart).FirstOrDefault();
50-
if (currentPath != null)
51-
{
52-
result = currentPath;
53-
return true;
54-
}
50+
return Enumerable.Empty<string>();
5551
}
56-
else
52+
currentSearchRoots = newSearchRoots;
53+
}
54+
55+
return currentSearchRoots;
56+
}
57+
58+
public static bool TryFind(string path, [NotNullWhen(true)] out string? result)
59+
{
60+
var expanded = Environment.ExpandEnvironmentVariables(path);
61+
if (!path.Contains('*'))
62+
{
63+
if (File.Exists(expanded))
5764
{
58-
currentPath = Path.Combine(currentPath, filePart);
59-
if (File.Exists(currentPath))
60-
{
61-
result = currentPath;
62-
return true;
63-
}
65+
result = expanded;
66+
return true;
6467
}
6568

6669
result = null;
6770
return false;
6871
}
6972

70-
if (File.Exists(expanded))
73+
var filePart = Path.GetFileName(expanded);
74+
var directoryPart = Path.GetDirectoryName(expanded);
75+
foreach (var directory in EnumerateDirectories(directoryPart))
7176
{
72-
result = expanded;
73-
return true;
77+
if (filePart.Contains('*'))
78+
{
79+
throw new Exception("Wildcard in file part currently not supported.");
80+
}
81+
82+
var filePath = Path.Combine(directory, filePart);
83+
if (File.Exists(filePath))
84+
{
85+
result = filePath;
86+
return true;
87+
}
7488
}
7589

7690
result = null;

0 commit comments

Comments
 (0)