1 package kustomize
2
3 import (
4 "errors"
5 "fmt"
6 "io/fs"
7 "path/filepath"
8
9 "sigs.k8s.io/kustomize/kyaml/filesys"
10 )
11
12
13 var ErrReadOnly = fmt.Errorf("read-only FS")
14
15
16
17
18 type File struct {
19 fs.File
20 }
21
22 var _ filesys.File = &File{}
23
24
25 func (f *File) Write(_ []byte) (n int, err error) {
26 return 0, fmt.Errorf("%w: cannot call file.Write", ErrReadOnly)
27 }
28
29
30
31
32 type FS struct {
33 fs.FS
34 }
35
36 var _ filesys.FileSystem = &FS{}
37
38
39 func (f *FS) Open(path string) (filesys.File, error) {
40 file, err := f.FS.Open(path)
41 return &File{file}, err
42 }
43
44
45
46 func (f *FS) IsDir(path string) bool {
47 stat, err := fs.Stat(f.FS, path)
48 if err != nil {
49 return false
50 }
51 return stat.IsDir()
52 }
53
54
55 func (f *FS) ReadDir(path string) ([]string, error) {
56 dirEntries, err := fs.ReadDir(f.FS, path)
57 if err != nil {
58 return nil, err
59 }
60 result := make([]string, 0, len(dirEntries))
61 for i, e := range dirEntries {
62 result[i] = e.Name()
63 }
64 return result, nil
65 }
66
67
68
69
70
71
72
73 func (f *FS) CleanedAbs(path string) (filesys.ConfirmedDir, string, error) {
74 if f.IsDir(path) {
75 return filesys.ConfirmedDir(path), "", nil
76 }
77
78 return filesys.ConfirmedDir(filepath.Dir(path)), filepath.Base(path), nil
79 }
80
81
82 func (f *FS) Exists(path string) bool {
83 var perr *fs.PathError
84 _, err := fs.Stat(f.FS, path)
85 return !errors.Is(err, fs.ErrNotExist) && !errors.As(err, &perr)
86 }
87
88
89
90 func (f *FS) Glob(pattern string) ([]string, error) {
91 return fs.Glob(f.FS, pattern)
92 }
93
94
95 func (f *FS) ReadFile(path string) ([]byte, error) {
96 return fs.ReadFile((f.FS), path)
97 }
98
99
100
101 func (f *FS) Walk(path string, walkFn filepath.WalkFunc) error {
102 return fs.WalkDir(f.FS, path, func(path string, d fs.DirEntry, err error) error {
103 if err != nil {
104 return err
105 }
106 info, err := d.Info()
107 if err != nil {
108 return err
109 }
110 return walkFn(path, info, err)
111 })
112 }
113
114
115 func (f *FS) WriteFile(_ string, _ []byte) error {
116 return fmt.Errorf("%w: cannot call WriteFile", ErrReadOnly)
117 }
118
119
120 func (f *FS) Mkdir(_ string) error {
121 return fmt.Errorf("%w: cannot call Mkdir", ErrReadOnly)
122 }
123
124
125 func (f *FS) MkdirAll(_ string) error {
126 return fmt.Errorf("%w: cannot create MkdirAll", ErrReadOnly)
127 }
128
129
130 func (f *FS) RemoveAll(_ string) error {
131 return fmt.Errorf("%w: cannot call RemoveAll", ErrReadOnly)
132 }
133
134
135 func (f *FS) Create(_ string) (filesys.File, error) {
136 return nil, fmt.Errorf("%w: cannot call Create", ErrReadOnly)
137 }
138
View as plain text