@@ -10,31 +10,27 @@ namespace ConfigCat.Cli.Services.FileSystem;
10
10
11
11
public interface IFileCollector
12
12
{
13
- Task < IEnumerable < FileInfo > > CollectAsync ( DirectoryInfo rootDirectory , CancellationToken token ) ;
13
+ Task < IEnumerable < FileInfo > > CollectAsync ( DirectoryInfo searchDirectory , DirectoryInfo gitRepoDir ,
14
+ CancellationToken token ) ;
14
15
}
15
16
16
17
public class FileCollector ( IOutput output ) : IFileCollector
17
18
{
18
- public async Task < IEnumerable < FileInfo > > CollectAsync ( DirectoryInfo rootDirectory , CancellationToken token )
19
+ public async Task < IEnumerable < FileInfo > > CollectAsync ( DirectoryInfo searchDirectory , DirectoryInfo gitRepoDir ,
20
+ CancellationToken token )
19
21
{
20
22
using var spinner = output . CreateSpinner ( token ) ;
21
23
22
- var files = rootDirectory . GetFiles ( "*" , new EnumerationOptions
23
- {
24
- RecurseSubdirectories = true ,
25
- IgnoreInaccessible = true ,
26
- AttributesToSkip = FileAttributes . System
27
- } ) ;
28
- var ignoreFiles = files . Where ( f => f . IsIgnoreFile ( ) ) . ToArray ( ) ;
29
- var filesToReturn = files . Except ( ignoreFiles ) ;
30
- var ignores = ignoreFiles
31
- . Select ( ignoreFile => new IgnoreFile ( ignoreFile , rootDirectory ) )
32
- . Cast < IgnorePolicy > ( )
33
- . ToList ( ) ;
34
-
35
- ignores . Add ( new GlobalIgnorePolicy ( rootDirectory , "**/.git/**" , "*.lock" , "*lock.json" , "*.graphql" , "*.md" , ".dockerignore" ) ) ;
24
+ var ( ignoreFiles , filesToReturn ) = GetFilesFromWorkSpace ( searchDirectory , gitRepoDir ) ;
25
+ List < IgnorePolicy > policies =
26
+ [
27
+ new GlobalIgnorePolicy ( gitRepoDir ?? searchDirectory , ".git" , "*.lock" , "*lock.json" , "*.graphql" , "*.md" ,
28
+ ".dockerignore" )
29
+ ] ;
30
+ policies . AddRange ( ignoreFiles
31
+ . Select ( ignoreFile => new IgnoreFile ( ignoreFile , gitRepoDir ?? searchDirectory ) ) ) ;
36
32
37
- foreach ( var ignore in ignores )
33
+ foreach ( var ignore in policies )
38
34
{
39
35
if ( ignore is not IgnoreFile ignoreFile ) continue ;
40
36
output . Verbose ( $ "Using ignore file { ignoreFile . File . FullName } ") ;
@@ -43,7 +39,7 @@ public async Task<IEnumerable<FileInfo>> CollectAsync(DirectoryInfo rootDirector
43
39
44
40
return filesToReturn . Where ( f =>
45
41
{
46
- foreach ( var ignore in ignores . Where ( i => i . Handles ( f ) ) . OrderByDescending ( i => i . Rank ) )
42
+ foreach ( var ignore in policies . Where ( i => i . Handles ( f ) ) . OrderByDescending ( i => i . Rank ) )
47
43
{
48
44
if ( ignore . IsAccepting ( f ) )
49
45
return true ;
@@ -55,4 +51,35 @@ public async Task<IEnumerable<FileInfo>> CollectAsync(DirectoryInfo rootDirector
55
51
return true ;
56
52
} ) ;
57
53
}
54
+
55
+ internal static ( IEnumerable < FileInfo > ignoreFiles , IEnumerable < FileInfo > files ) GetFilesFromWorkSpace (
56
+ DirectoryInfo searchDirectory , DirectoryInfo gitRepoDir )
57
+ {
58
+ var allFiles = EnumerateFiles ( searchDirectory , true ) . ToArray ( ) ;
59
+ var ignoreFiles = allFiles . Where ( f => f . IsIgnoreFile ( ) ) . ToArray ( ) ;
60
+ var otherFiles = allFiles . Except ( ignoreFiles ) ;
61
+ if ( gitRepoDir == null || searchDirectory . SameDirectory ( gitRepoDir ) )
62
+ return ( ignoreFiles , otherFiles ) ;
63
+
64
+ // We are in a git repository's subdirectory, so we walk up to
65
+ // the root folder and collect all .ignore files along the way.
66
+ var currentDir = searchDirectory ;
67
+ do
68
+ {
69
+ currentDir = currentDir . Parent ;
70
+ ignoreFiles = ignoreFiles . Concat ( EnumerateFiles ( currentDir , false ) . Where ( f => f . IsIgnoreFile ( ) ) ) . ToArray ( ) ;
71
+ } while ( currentDir != null && ! currentDir . SameDirectory ( gitRepoDir ) ) ;
72
+
73
+ return ( ignoreFiles , otherFiles ) ;
74
+ }
75
+
76
+ private static IEnumerable < FileInfo > EnumerateFiles ( DirectoryInfo directory , bool recurse ) =>
77
+ directory == null
78
+ ? [ ]
79
+ : directory . EnumerateFiles ( "*" , new EnumerationOptions
80
+ {
81
+ RecurseSubdirectories = recurse ,
82
+ IgnoreInaccessible = true ,
83
+ AttributesToSkip = FileAttributes . System
84
+ } ) ;
58
85
}
0 commit comments