1
2
3
4 package filesys
5
6 import (
7 "fmt"
8 "log"
9 "os"
10 "path/filepath"
11
12 "sigs.k8s.io/kustomize/kyaml/errors"
13 )
14
15 var _ FileSystem = fsOnDisk{}
16
17
18 type fsOnDisk struct{}
19
20
21 func MakeFsOnDisk() FileSystem {
22 return fsOnDisk{}
23 }
24
25
26 func (fsOnDisk) Create(name string) (File, error) { return os.Create(name) }
27
28
29 func (fsOnDisk) Mkdir(name string) error {
30 return os.Mkdir(name, 0777|os.ModeDir)
31 }
32
33
34 func (fsOnDisk) MkdirAll(name string) error {
35 return os.MkdirAll(name, 0777|os.ModeDir)
36 }
37
38
39 func (fsOnDisk) RemoveAll(name string) error {
40 return os.RemoveAll(name)
41 }
42
43
44 func (fsOnDisk) Open(name string) (File, error) { return os.Open(name) }
45
46
47
48
49
50
51 func (x fsOnDisk) CleanedAbs(
52 path string) (ConfirmedDir, string, error) {
53 absRoot, err := filepath.Abs(path)
54 if err != nil {
55 return "", "", fmt.Errorf(
56 "abs path error on '%s' : %v", path, err)
57 }
58 deLinked, err := filepath.EvalSymlinks(absRoot)
59 if err != nil {
60 return "", "", fmt.Errorf(
61 "evalsymlink failure on '%s' : %w", path, err)
62 }
63 if x.IsDir(deLinked) {
64 return ConfirmedDir(deLinked), "", nil
65 }
66 d := filepath.Dir(deLinked)
67 if !x.IsDir(d) {
68
69 log.Fatalf("first part of '%s' not a directory", deLinked)
70 }
71 if d == deLinked {
72
73 log.Fatalf("d '%s' should be a subset of deLinked", d)
74 }
75 f := filepath.Base(deLinked)
76 if filepath.Join(d, f) != deLinked {
77
78 log.Fatalf("these should be equal: '%s', '%s'",
79 filepath.Join(d, f), deLinked)
80 }
81 return ConfirmedDir(d), f, nil
82 }
83
84
85 func (fsOnDisk) Exists(name string) bool {
86 _, err := os.Stat(name)
87 return err == nil
88 }
89
90
91 func (fsOnDisk) Glob(pattern string) ([]string, error) {
92 var result []string
93 allFilePaths, err := filepath.Glob(pattern)
94 if err != nil {
95 return nil, err
96 }
97 if IsHiddenFilePath(pattern) {
98 result = allFilePaths
99 } else {
100 result = RemoveHiddenFiles(allFilePaths)
101 }
102 return result, nil
103 }
104
105
106 func (fsOnDisk) IsDir(name string) bool {
107 info, err := os.Stat(name)
108 if err != nil {
109 return false
110 }
111 return info.IsDir()
112 }
113
114
115 func (fsOnDisk) ReadDir(name string) ([]string, error) {
116 dirEntries, err := os.ReadDir(name)
117 if err != nil {
118 return nil, err
119 }
120 result := make([]string, len(dirEntries))
121 for i := range dirEntries {
122 result[i] = dirEntries[i].Name()
123 }
124 return result, nil
125 }
126
127
128 func (fsOnDisk) ReadFile(name string) ([]byte, error) {
129 content, err := os.ReadFile(name)
130 return content, errors.Wrap(err)
131 }
132
133
134 func (fsOnDisk) WriteFile(name string, c []byte) error {
135 return errors.Wrap(os.WriteFile(name, c, 0666))
136 }
137
138
139 func (fsOnDisk) Walk(path string, walkFn filepath.WalkFunc) error {
140 return filepath.Walk(path, walkFn)
141 }
142
View as plain text