github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/filesystem/fslist.go (about) 1 // Package filesystem - Content managed by Project Forge, see [projectforge.md] for details. 2 package filesystem 3 4 import ( 5 "io/fs" 6 "os" 7 "path/filepath" 8 "strings" 9 10 "github.com/samber/lo" 11 12 "github.com/kyleu/dbaudit/app/util" 13 ) 14 15 func (f *FileSystem) ListFiles(path string, ign []string, logger util.Logger) FileInfos { 16 ignore := buildIgnore(ign) 17 p := f.getPath(path) 18 dir, err := f.f.Open(p) 19 if err != nil { 20 if logger != nil { 21 logger.Warnf("unable to open path [%s]", p) 22 } 23 return nil 24 } 25 26 infos, err := dir.Readdir(0) 27 if err != nil && logger != nil { 28 logger.Warnf("cannot list files in path [%s]: %+v", path, err) 29 } 30 ret := FileInfosFromFS(infos) 31 ret = lo.Reject(ret, func(info *FileInfo, _ int) bool { 32 return checkIgnore(ignore, info.Name) 33 }) 34 return ret.Sorted() 35 } 36 37 func (f *FileSystem) ListJSON(path string, ign []string, trimExtension bool, logger util.Logger) []string { 38 return f.ListExtension(path, "json", ign, trimExtension, logger) 39 } 40 41 func (f *FileSystem) ListExtension(path string, ext string, ign []string, trimExtension bool, logger util.Logger) []string { 42 ret := lo.Filter(f.ListFiles(path, ign, logger), func(f *FileInfo, _ int) bool { 43 return strings.HasSuffix(f.Name, "."+ext) 44 }) 45 return lo.Map(ret, func(x *FileInfo, _ int) string { 46 if trimExtension { 47 return strings.TrimSuffix(x.Name, "."+ext) 48 } 49 return x.Name 50 }) 51 } 52 53 func (f *FileSystem) ListDirectories(path string, ign []string, logger util.Logger) []string { 54 ret := lo.Filter(f.ListFiles(path, ign, logger), func(f *FileInfo, _ int) bool { 55 return f.IsDir 56 }) 57 return lo.Map(ret, func(x *FileInfo, _ int) string { 58 return x.Name 59 }) 60 } 61 62 func (f *FileSystem) ListFilesRecursive(path string, ign []string, _ util.Logger) ([]string, error) { 63 ignore := buildIgnore(ign) 64 p := f.getPath(path) 65 ret := &util.StringSlice{} 66 err := filepath.Walk(p, func(fp string, info fs.FileInfo, err error) error { 67 if err != nil { 68 return err 69 } 70 m := strings.TrimPrefix(strings.TrimPrefix(fp, p+"\\"), p+"/") 71 if checkIgnore(ignore, m) { 72 return nil 73 } 74 if info != nil && (!info.IsDir()) && (info.Mode()&os.ModeSymlink != os.ModeSymlink) && (strings.Contains(fp, "/") || strings.Contains(fp, "\\")) { 75 ret.Push(m) 76 } 77 return nil 78 }) 79 if err != nil { 80 return nil, err 81 } 82 return util.ArraySorted(ret.Slice), nil 83 } 84 85 func (f *FileSystem) Walk(path string, ign []string, fn func(fp string, info *FileInfo, err error) error) error { 86 ignore := buildIgnore(ign) 87 p := f.getPath(path) 88 err := filepath.Walk(p, func(fp string, info fs.FileInfo, err error) error { 89 m := strings.TrimPrefix(strings.TrimPrefix(fp, p+"\\"), p+"/") 90 if checkIgnore(ignore, m) { 91 return nil 92 } 93 return fn(fp, FileInfoFromFS(info), err) 94 }) 95 return err 96 }