From e612dec99e8c9312afbc9b727e6fb61945983fa7 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 1 Dec 2022 14:09:28 +0100 Subject: [PATCH 1/4] Added FilterName and FilterOutName filters --- readdir.go | 24 ++++++++++++++++++++++++ readdir_test.go | 20 ++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/readdir.go b/readdir.go index 08ac11e..99603c6 100644 --- a/readdir.go +++ b/readdir.go @@ -152,6 +152,30 @@ func FilterOutDirectories() ReadDirFilter { } } +// FilterNames is a ReadDirFilter that accepts only the given filenames +func FilterNames(allowedNames ...string) ReadDirFilter { + return func(file *Path) bool { + for _, name := range allowedNames { + if file.Base() == name { + return true + } + } + return false + } +} + +// FilterOutNames is a ReadDirFilter that rejects the given filenames +func FilterOutNames(rejectedNames ...string) ReadDirFilter { + return func(file *Path) bool { + for _, name := range rejectedNames { + if file.Base() == name { + return false + } + } + return true + } +} + // FilterSuffixes creates a ReadDirFilter that accepts only the given // filename suffixes func FilterSuffixes(allowedSuffixes ...string) ReadDirFilter { diff --git a/readdir_test.go b/readdir_test.go index ede9a1a..ca3c970 100644 --- a/readdir_test.go +++ b/readdir_test.go @@ -216,4 +216,24 @@ func TestReadDirRecursiveFiltered(t *testing.T) { pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[8]) pathEqualsTo(t, "_testdata/test.txt", l[9]) pathEqualsTo(t, "_testdata/test.txt.gz", l[10]) + + l, err = testdata.ReadDirRecursiveFiltered(nil, FilterNames("folder")) + require.NoError(t, err) + l.Sort() + require.Len(t, l, 1) + pathEqualsTo(t, "_testdata/folder", l[0]) + + l, err = testdata.ReadDirRecursiveFiltered(FilterNames("symlinktofolder"), FilterOutNames(".hidden")) + require.NoError(t, err) + require.Len(t, l, 9) + l.Sort() + pathEqualsTo(t, "_testdata/anotherFile", l[0]) + pathEqualsTo(t, "_testdata/file", l[1]) + pathEqualsTo(t, "_testdata/folder", l[2]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) + pathEqualsTo(t, "_testdata/test.txt", l[7]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[8]) } From 33906a51f984eff5f2406a6f7c009e1574199bb8 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 1 Dec 2022 14:09:37 +0100 Subject: [PATCH 2/4] Fixed linter warning --- list.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/list.go b/list.go index 6f79bb4..8d8d6d2 100644 --- a/list.go +++ b/list.go @@ -140,9 +140,7 @@ func (p *PathList) Add(path *Path) { // AddAll adds all Paths in the list passed as argument func (p *PathList) AddAll(paths PathList) { - for _, path := range paths { - *p = append(*p, path) - } + *p = append(*p, paths...) } // AddIfMissing adds a Path to the PathList if the path is not already From f55e719863cfead3f2e6a20fae005c890c89ace9 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 1 Dec 2022 14:09:53 +0100 Subject: [PATCH 3/4] Run of go-fmt --- readdir.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readdir.go b/readdir.go index 99603c6..53341b9 100644 --- a/readdir.go +++ b/readdir.go @@ -95,11 +95,11 @@ func (p *Path) ReadDirRecursive() (PathList, error) { // ReadDirRecursiveFiltered returns a PathList containing the content of the directory // and its subdirectories pointed by the current Path, filtered by the given skipFilter // and filters: -// - `recursionFilter` is a filter that is checked to determine if the subdirectory must -// by visited recursively (if the filter rejects the entry, the entry is not visited -// but can still be added to the result) -// - `filters` are the filters that are checked to determine if the entry should be -// added to the resulting PathList +// - `recursionFilter` is a filter that is checked to determine if the subdirectory must +// by visited recursively (if the filter rejects the entry, the entry is not visited +// but can still be added to the result) +// - `filters` are the filters that are checked to determine if the entry should be +// added to the resulting PathList func (p *Path) ReadDirRecursiveFiltered(recursionFilter ReadDirFilter, filters ...ReadDirFilter) (PathList, error) { infos, err := ioutil.ReadDir(p.path) if err != nil { From 2c829c52e4c33cf24c451f7648660c4e34daf589 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 1 Dec 2022 14:10:07 +0100 Subject: [PATCH 4/4] Improved tests on filters --- readdir_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/readdir_test.go b/readdir_test.go index ca3c970..aeee7e2 100644 --- a/readdir_test.go +++ b/readdir_test.go @@ -110,6 +110,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err := testdata.ReadDirRecursiveFiltered(nil) require.NoError(t, err) l.Sort() + require.Len(t, l, 16) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) @@ -130,6 +131,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories()) require.NoError(t, err) l.Sort() + require.Len(t, l, 6) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) // <- this is listed but not traversed @@ -140,6 +142,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(nil, FilterOutDirectories()) require.NoError(t, err) l.Sort() + require.Len(t, l, 12) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) @@ -156,6 +159,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories(), FilterOutDirectories()) require.NoError(t, err) l.Sort() + require.Len(t, l, 4) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/test.txt", l[2]) @@ -164,6 +168,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), FilterOutSuffixes("3")) require.NoError(t, err) l.Sort() + require.Len(t, l, 12) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) @@ -180,6 +185,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"))) require.NoError(t, err) l.Sort() + require.Len(t, l, 9) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/folder", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) @@ -193,6 +199,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"), FilterOutSuffixes(".gz"))) require.NoError(t, err) l.Sort() + require.Len(t, l, 8) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/folder", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) @@ -205,6 +212,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(OrFilter(FilterPrefixes("sub"), FilterSuffixes("tofolder"))) require.NoError(t, err) l.Sort() + require.Len(t, l, 11) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2])