From f50aed96d4dfd3258a59d8e6c40da37db732187c Mon Sep 17 00:00:00 2001 From: Yota Toyama Date: Tue, 21 Nov 2017 21:30:22 +0900 Subject: [PATCH] Create markup file finder object --- consts.go | 3 ++ main.go | 6 ++-- markup_file_finder.go | 74 ++++++++++++++++++++++++++++++++++++++ markup_file_finder_test.go | 59 ++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 consts.go create mode 100644 markup_file_finder.go create mode 100644 markup_file_finder_test.go diff --git a/consts.go b/consts.go new file mode 100644 index 0000000..7b220cd --- /dev/null +++ b/consts.go @@ -0,0 +1,3 @@ +package main + +const maxOpenFiles = 1024 // on Linux diff --git a/main.go b/main.go index d16a1d2..fd8bff9 100644 --- a/main.go +++ b/main.go @@ -5,8 +5,6 @@ import ( "sync" ) -const filesCapacity = 1024 - func main() { args, err := getArguments(nil) @@ -14,7 +12,7 @@ func main() { fail(err) } - fc := make(chan string, filesCapacity) + fc := make(chan string, maxOpenFiles) ec := make(chan error, 64) wg := sync.WaitGroup{} @@ -29,7 +27,7 @@ func main() { wg.Done() }() - rc := make(chan fileResult, filesCapacity) + rc := make(chan fileResult, maxOpenFiles) s := newSemaphore(args.concurrency) c := newFileChecker(args.timeout, args.documentRoot, s) diff --git a/markup_file_finder.go b/markup_file_finder.go new file mode 100644 index 0000000..ae454aa --- /dev/null +++ b/markup_file_finder.go @@ -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 + } +} diff --git a/markup_file_finder_test.go b/markup_file_finder_test.go new file mode 100644 index 0000000..b57295c --- /dev/null +++ b/markup_file_finder_test.go @@ -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()) + } +}