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