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  }