pkg/reporeader/readers/localfsreader.go (65 lines of code) (raw):
package readers
import (
"fmt"
"io/fs"
"os"
"path/filepath"
"strings"
"github.com/Azure/draft/pkg/reporeader"
)
type LocalFSReader struct {
}
// GetRepoName returns the name of the current directory, which is an approximation of the repo name
func (*LocalFSReader) GetRepoName() (string, error) {
wd, err := os.Getwd()
if err != nil {
return "", fmt.Errorf("unable to get working directory: %v", err)
}
dirName := filepath.Base(wd)
return dirName, nil
}
type LocalFileFinder struct {
Patterns []string
FoundFiles []string
MaxDepth int
}
func (l *LocalFileFinder) walkFunc(path string, info os.DirEntry, err error) error {
if err != nil {
return err
}
// Skip directories that are too deep
if info.IsDir() && strings.Count(path, string(os.PathSeparator)) > l.MaxDepth {
fmt.Println("skip", path)
return fs.SkipDir
}
if info.IsDir() {
return nil
}
for _, pattern := range l.Patterns {
if matched, err := filepath.Match(pattern, filepath.Base(path)); err != nil {
return err
} else if matched {
l.FoundFiles = append(l.FoundFiles, path)
}
}
return nil
}
func (r *LocalFSReader) FindFiles(path string, patterns []string, maxDepth int) ([]string, error) {
l := LocalFileFinder{
Patterns: patterns,
MaxDepth: maxDepth,
}
err := filepath.WalkDir(path, l.walkFunc)
if err != nil {
return nil, err
}
return l.FoundFiles, nil
}
var _ reporeader.RepoReader = &LocalFSReader{}
func (r *LocalFSReader) Exists(path string) bool {
if _, err := os.Stat(path); !os.IsNotExist(err) {
return true
}
return false
}
func (r *LocalFSReader) ReadFile(path string) ([]byte, error) {
return os.ReadFile(path)
}