Skip to content

Commit 445bb42

Browse files
authored
Merge pull request #16 from arduino/add_filters
Add filters `FilterName` and `FilterOutName` / Fixed linter warnings
2 parents 6ca2230 + 2c829c5 commit 445bb42

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

list.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,7 @@ func (p *PathList) Add(path *Path) {
140140

141141
// AddAll adds all Paths in the list passed as argument
142142
func (p *PathList) AddAll(paths PathList) {
143-
for _, path := range paths {
144-
*p = append(*p, path)
145-
}
143+
*p = append(*p, paths...)
146144
}
147145

148146
// AddIfMissing adds a Path to the PathList if the path is not already

readdir.go

+29-5
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ func (p *Path) ReadDirRecursive() (PathList, error) {
9595
// ReadDirRecursiveFiltered returns a PathList containing the content of the directory
9696
// and its subdirectories pointed by the current Path, filtered by the given skipFilter
9797
// and filters:
98-
// - `recursionFilter` is a filter that is checked to determine if the subdirectory must
99-
// by visited recursively (if the filter rejects the entry, the entry is not visited
100-
// but can still be added to the result)
101-
// - `filters` are the filters that are checked to determine if the entry should be
102-
// added to the resulting PathList
98+
// - `recursionFilter` is a filter that is checked to determine if the subdirectory must
99+
// by visited recursively (if the filter rejects the entry, the entry is not visited
100+
// but can still be added to the result)
101+
// - `filters` are the filters that are checked to determine if the entry should be
102+
// added to the resulting PathList
103103
func (p *Path) ReadDirRecursiveFiltered(recursionFilter ReadDirFilter, filters ...ReadDirFilter) (PathList, error) {
104104
infos, err := ioutil.ReadDir(p.path)
105105
if err != nil {
@@ -152,6 +152,30 @@ func FilterOutDirectories() ReadDirFilter {
152152
}
153153
}
154154

155+
// FilterNames is a ReadDirFilter that accepts only the given filenames
156+
func FilterNames(allowedNames ...string) ReadDirFilter {
157+
return func(file *Path) bool {
158+
for _, name := range allowedNames {
159+
if file.Base() == name {
160+
return true
161+
}
162+
}
163+
return false
164+
}
165+
}
166+
167+
// FilterOutNames is a ReadDirFilter that rejects the given filenames
168+
func FilterOutNames(rejectedNames ...string) ReadDirFilter {
169+
return func(file *Path) bool {
170+
for _, name := range rejectedNames {
171+
if file.Base() == name {
172+
return false
173+
}
174+
}
175+
return true
176+
}
177+
}
178+
155179
// FilterSuffixes creates a ReadDirFilter that accepts only the given
156180
// filename suffixes
157181
func FilterSuffixes(allowedSuffixes ...string) ReadDirFilter {

readdir_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
110110
l, err := testdata.ReadDirRecursiveFiltered(nil)
111111
require.NoError(t, err)
112112
l.Sort()
113+
require.Len(t, l, 16)
113114
pathEqualsTo(t, "_testdata/anotherFile", l[0])
114115
pathEqualsTo(t, "_testdata/file", l[1])
115116
pathEqualsTo(t, "_testdata/folder", l[2])
@@ -130,6 +131,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
130131
l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories())
131132
require.NoError(t, err)
132133
l.Sort()
134+
require.Len(t, l, 6)
133135
pathEqualsTo(t, "_testdata/anotherFile", l[0])
134136
pathEqualsTo(t, "_testdata/file", l[1])
135137
pathEqualsTo(t, "_testdata/folder", l[2]) // <- this is listed but not traversed
@@ -140,6 +142,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
140142
l, err = testdata.ReadDirRecursiveFiltered(nil, FilterOutDirectories())
141143
require.NoError(t, err)
142144
l.Sort()
145+
require.Len(t, l, 12)
143146
pathEqualsTo(t, "_testdata/anotherFile", l[0])
144147
pathEqualsTo(t, "_testdata/file", l[1])
145148
pathEqualsTo(t, "_testdata/folder/.hidden", l[2])
@@ -156,6 +159,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
156159
l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories(), FilterOutDirectories())
157160
require.NoError(t, err)
158161
l.Sort()
162+
require.Len(t, l, 4)
159163
pathEqualsTo(t, "_testdata/anotherFile", l[0])
160164
pathEqualsTo(t, "_testdata/file", l[1])
161165
pathEqualsTo(t, "_testdata/test.txt", l[2])
@@ -164,6 +168,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
164168
l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), FilterOutSuffixes("3"))
165169
require.NoError(t, err)
166170
l.Sort()
171+
require.Len(t, l, 12)
167172
pathEqualsTo(t, "_testdata/anotherFile", l[0])
168173
pathEqualsTo(t, "_testdata/file", l[1])
169174
pathEqualsTo(t, "_testdata/folder", l[2])
@@ -180,6 +185,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
180185
l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil")))
181186
require.NoError(t, err)
182187
l.Sort()
188+
require.Len(t, l, 9)
183189
pathEqualsTo(t, "_testdata/anotherFile", l[0])
184190
pathEqualsTo(t, "_testdata/folder", l[1])
185191
pathEqualsTo(t, "_testdata/folder/.hidden", l[2])
@@ -193,6 +199,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
193199
l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"), FilterOutSuffixes(".gz")))
194200
require.NoError(t, err)
195201
l.Sort()
202+
require.Len(t, l, 8)
196203
pathEqualsTo(t, "_testdata/anotherFile", l[0])
197204
pathEqualsTo(t, "_testdata/folder", l[1])
198205
pathEqualsTo(t, "_testdata/folder/.hidden", l[2])
@@ -205,6 +212,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
205212
l, err = testdata.ReadDirRecursiveFiltered(OrFilter(FilterPrefixes("sub"), FilterSuffixes("tofolder")))
206213
require.NoError(t, err)
207214
l.Sort()
215+
require.Len(t, l, 11)
208216
pathEqualsTo(t, "_testdata/anotherFile", l[0])
209217
pathEqualsTo(t, "_testdata/file", l[1])
210218
pathEqualsTo(t, "_testdata/folder", l[2])
@@ -216,4 +224,24 @@ func TestReadDirRecursiveFiltered(t *testing.T) {
216224
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[8])
217225
pathEqualsTo(t, "_testdata/test.txt", l[9])
218226
pathEqualsTo(t, "_testdata/test.txt.gz", l[10])
227+
228+
l, err = testdata.ReadDirRecursiveFiltered(nil, FilterNames("folder"))
229+
require.NoError(t, err)
230+
l.Sort()
231+
require.Len(t, l, 1)
232+
pathEqualsTo(t, "_testdata/folder", l[0])
233+
234+
l, err = testdata.ReadDirRecursiveFiltered(FilterNames("symlinktofolder"), FilterOutNames(".hidden"))
235+
require.NoError(t, err)
236+
require.Len(t, l, 9)
237+
l.Sort()
238+
pathEqualsTo(t, "_testdata/anotherFile", l[0])
239+
pathEqualsTo(t, "_testdata/file", l[1])
240+
pathEqualsTo(t, "_testdata/folder", l[2])
241+
pathEqualsTo(t, "_testdata/symlinktofolder", l[3])
242+
pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[4])
243+
pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[5])
244+
pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6])
245+
pathEqualsTo(t, "_testdata/test.txt", l[7])
246+
pathEqualsTo(t, "_testdata/test.txt.gz", l[8])
219247
}

0 commit comments

Comments
 (0)