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