break down FromFiles for easier testing

This commit is contained in:
Yann Hamon 2021-01-02 12:52:58 +01:00
parent f7a9c86717
commit 92f8f4593d
2 changed files with 37 additions and 27 deletions

View file

@ -104,7 +104,7 @@ func realMain() int {
if isStdin { if isStdin {
resourcesChan, errors = resource.FromStream(ctx, "stdin", os.Stdin) resourcesChan, errors = resource.FromStream(ctx, "stdin", os.Stdin)
} else { } else {
resourcesChan, errors = resource.FromFiles(ctx, cfg.IgnoreFilenamePatterns, cfg.Files...) resourcesChan, errors = resource.FromFiles(ctx, cfg.Files, cfg.IgnoreFilenamePatterns)
} }
// Process discovered resources across multiple workers // Process discovered resources across multiple workers

View file

@ -40,8 +40,7 @@ func isIgnored(path string, ignoreFilePatterns []string) (bool, error) {
return false, nil return false, nil
} }
func FromFiles(ctx context.Context, ignoreFilePatterns []string, paths ...string) (<-chan Resource, <-chan error) { func findFilesInFolders(ctx context.Context, paths []string, ignoreFilePatterns []string) (chan string, chan error) {
resources := make(chan Resource)
files := make(chan string) files := make(chan string)
errors := make(chan error) errors := make(chan error)
@ -85,19 +84,19 @@ func FromFiles(ctx context.Context, ignoreFilePatterns []string, paths ...string
close(files) close(files)
}() }()
go func() { return files, errors
maxResourceSize := 4 * 1024 * 1024 }
buf := make([]byte, maxResourceSize)
for p := range files { func findResourcesInFile(p string, resources chan<- Resource, errors chan<- error, buf []byte) {
f, err := os.Open(p) f, err := os.Open(p)
defer f.Close()
if err != nil { if err != nil {
errors <- DiscoveryError{p, err} errors <- DiscoveryError{p, err}
continue return
} }
scanner := bufio.NewScanner(f) scanner := bufio.NewScanner(f)
scanner.Buffer(buf, maxResourceSize) scanner.Buffer(buf, len(buf))
scanner.Split(SplitYAMLDocument) scanner.Split(SplitYAMLDocument)
nRes := 0 nRes := 0
for res := scanner.Scan(); res != false; res = scanner.Scan() { for res := scanner.Scan(); res != false; res = scanner.Scan() {
@ -110,8 +109,19 @@ func FromFiles(ctx context.Context, ignoreFilePatterns []string, paths ...string
if nRes == 0 { if nRes == 0 {
resources <- Resource{Path: p, Bytes: []byte{}} resources <- Resource{Path: p, Bytes: []byte{}}
} }
}
f.Close() func FromFiles(ctx context.Context, paths []string, ignoreFilePatterns []string) (<-chan Resource, <-chan error) {
resources := make(chan Resource)
files, errors := findFilesInFolders(ctx, paths, ignoreFilePatterns)
go func() {
maxResourceSize := 4 * 1024 * 1024 // 4MB ought to be enough for everybody
buf := make([]byte, maxResourceSize) // We reuse this to avoid multiple large memory allocations
for p := range files {
findResourcesInFile(p, resources, errors, buf)
} }
close(errors) close(errors)