Browse Source

Create markup file finder object

renovate/configure
Yota Toyama 8 years ago
parent
commit
f50aed96d4
  1. 3
      consts.go
  2. 6
      main.go
  3. 74
      markup_file_finder.go
  4. 59
      markup_file_finder_test.go

3
consts.go

@ -0,0 +1,3 @@
package main
const maxOpenFiles = 1024 // on Linux

6
main.go

@ -5,8 +5,6 @@ import (
"sync" "sync"
) )
const filesCapacity = 1024
func main() { func main() {
args, err := getArguments(nil) args, err := getArguments(nil)
@ -14,7 +12,7 @@ func main() {
fail(err) fail(err)
} }
fc := make(chan string, filesCapacity) fc := make(chan string, maxOpenFiles)
ec := make(chan error, 64) ec := make(chan error, 64)
wg := sync.WaitGroup{} wg := sync.WaitGroup{}
@ -29,7 +27,7 @@ func main() {
wg.Done() wg.Done()
}() }()
rc := make(chan fileResult, filesCapacity) rc := make(chan fileResult, maxOpenFiles)
s := newSemaphore(args.concurrency) s := newSemaphore(args.concurrency)
c := newFileChecker(args.timeout, args.documentRoot, s) c := newFileChecker(args.timeout, args.documentRoot, s)

74
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
}
}

59
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())
}
}
Loading…
Cancel
Save