mirror of https://github.com/nmasse-itix/liche.git
4 changed files with 138 additions and 4 deletions
@ -0,0 +1,3 @@ |
|||||
|
package main |
||||
|
|
||||
|
const maxOpenFiles = 1024 // on Linux
|
||||
@ -0,0 +1,74 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"os" |
||||
|
"path/filepath" |
||||
|
"regexp" |
||||
|
) |
||||
|
|
||||
|
type markupFileFinder struct { |
||||
|
filenames chan string |
||||
|
errors chan error |
||||
|
} |
||||
|
|
||||
|
func newMarkupFileFinder() markupFileFinder { |
||||
|
return markupFileFinder{ |
||||
|
make(chan string, maxOpenFiles), |
||||
|
make(chan error, 64), |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func (m markupFileFinder) Filenames() chan string { |
||||
|
return m.filenames |
||||
|
} |
||||
|
|
||||
|
func (m markupFileFinder) Errors() chan error { |
||||
|
return m.errors |
||||
|
} |
||||
|
|
||||
|
func (m markupFileFinder) Find(fs []string, recursive bool) { |
||||
|
for _, f := range fs { |
||||
|
i, err := os.Stat(f) |
||||
|
|
||||
|
if err != nil { |
||||
|
m.errors <- err |
||||
|
continue |
||||
|
} |
||||
|
|
||||
|
if i.IsDir() && recursive { |
||||
|
m.listDirectory(f) |
||||
|
} else if i.IsDir() { |
||||
|
m.errors <- fmt.Errorf("%v is not a file", f) |
||||
|
} else { |
||||
|
m.filenames <- f |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
close(m.filenames) |
||||
|
close(m.errors) |
||||
|
} |
||||
|
|
||||
|
func (m markupFileFinder) listDirectory(d string) { |
||||
|
err := filepath.Walk(d, func(f string, i os.FileInfo, err error) error { |
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
b, err := regexp.MatchString("(^\\.)|(/\\.)", f) |
||||
|
|
||||
|
if err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
if !i.IsDir() && !b && isMarkupFile(f) { |
||||
|
m.filenames <- f |
||||
|
} |
||||
|
|
||||
|
return nil |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
m.errors <- err |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,59 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"os" |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/stretchr/testify/assert" |
||||
|
) |
||||
|
|
||||
|
func TestNewMarkupFileFinder(t *testing.T) { |
||||
|
newMarkupFileFinder() |
||||
|
} |
||||
|
|
||||
|
func TestMarkupFileFinderFindWithRecursiveOption(t *testing.T) { |
||||
|
for _, fs := range [][]string{{"README.md"}, {"test"}, {"README.md", "test"}} { |
||||
|
m := newMarkupFileFinder() |
||||
|
m.Find(fs, true) |
||||
|
|
||||
|
assert.Equal(t, 0, len(m.Errors())) |
||||
|
assert.NotEqual(t, 0, len(m.Filenames())) |
||||
|
|
||||
|
for f := range m.Filenames() { |
||||
|
i, err := os.Stat(f) |
||||
|
|
||||
|
assert.True(t, isMarkupFile(f)) |
||||
|
assert.Equal(t, nil, err) |
||||
|
assert.False(t, i.IsDir()) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
func TestMarkupFileFinderFindWithDirectory(t *testing.T) { |
||||
|
m := newMarkupFileFinder() |
||||
|
m.Find([]string{"test"}, false) |
||||
|
|
||||
|
assert.Equal(t, 1, len(m.Errors())) |
||||
|
assert.Equal(t, 0, len(m.Filenames())) |
||||
|
|
||||
|
err := <-m.Errors() |
||||
|
|
||||
|
assert.NotEqual(t, nil, err) |
||||
|
} |
||||
|
|
||||
|
func TestMarkupFileFinderListDirectory(t *testing.T) { |
||||
|
m := newMarkupFileFinder() |
||||
|
m.listDirectory("test") |
||||
|
close(m.Filenames()) |
||||
|
|
||||
|
assert.Equal(t, 0, len(m.Errors())) |
||||
|
assert.NotEqual(t, 0, len(m.Filenames())) |
||||
|
|
||||
|
for f := range m.Filenames() { |
||||
|
i, err := os.Stat(f) |
||||
|
|
||||
|
assert.True(t, isMarkupFile(f)) |
||||
|
assert.Equal(t, nil, err) |
||||
|
assert.False(t, i.IsDir()) |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue