10 // The RegexpFs filters files (not directories) by regular expression. Only
11 // files matching the given regexp will be allowed, all others get a ENOENT error (
12 // "No such file or directory").
14 type RegexpFs struct {
19 func NewRegexpFs(source Fs, re *regexp.Regexp) Fs {
20 return &RegexpFs{source: source, re: re}
23 type RegexpFile struct {
28 func (r *RegexpFs) matchesName(name string) error {
32 if r.re.MatchString(name) {
38 func (r *RegexpFs) dirOrMatches(name string) error {
39 dir, err := IsDir(r.source, name)
46 return r.matchesName(name)
49 func (r *RegexpFs) Chtimes(name string, a, m time.Time) error {
50 if err := r.dirOrMatches(name); err != nil {
53 return r.source.Chtimes(name, a, m)
56 func (r *RegexpFs) Chmod(name string, mode os.FileMode) error {
57 if err := r.dirOrMatches(name); err != nil {
60 return r.source.Chmod(name, mode)
63 func (r *RegexpFs) Name() string {
67 func (r *RegexpFs) Stat(name string) (os.FileInfo, error) {
68 if err := r.dirOrMatches(name); err != nil {
71 return r.source.Stat(name)
74 func (r *RegexpFs) Rename(oldname, newname string) error {
75 dir, err := IsDir(r.source, oldname)
82 if err := r.matchesName(oldname); err != nil {
85 if err := r.matchesName(newname); err != nil {
88 return r.source.Rename(oldname, newname)
91 func (r *RegexpFs) RemoveAll(p string) error {
92 dir, err := IsDir(r.source, p)
97 if err := r.matchesName(p); err != nil {
101 return r.source.RemoveAll(p)
104 func (r *RegexpFs) Remove(name string) error {
105 if err := r.dirOrMatches(name); err != nil {
108 return r.source.Remove(name)
111 func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
112 if err := r.dirOrMatches(name); err != nil {
115 return r.source.OpenFile(name, flag, perm)
118 func (r *RegexpFs) Open(name string) (File, error) {
119 dir, err := IsDir(r.source, name)
124 if err := r.matchesName(name); err != nil {
128 f, err := r.source.Open(name)
129 return &RegexpFile{f: f, re: r.re}, nil
132 func (r *RegexpFs) Mkdir(n string, p os.FileMode) error {
133 return r.source.Mkdir(n, p)
136 func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error {
137 return r.source.MkdirAll(n, p)
140 func (r *RegexpFs) Create(name string) (File, error) {
141 if err := r.matchesName(name); err != nil {
144 return r.source.Create(name)
147 func (f *RegexpFile) Close() error {
151 func (f *RegexpFile) Read(s []byte) (int, error) {
155 func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) {
156 return f.f.ReadAt(s, o)
159 func (f *RegexpFile) Seek(o int64, w int) (int64, error) {
160 return f.f.Seek(o, w)
163 func (f *RegexpFile) Write(s []byte) (int, error) {
167 func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) {
168 return f.f.WriteAt(s, o)
171 func (f *RegexpFile) Name() string {
175 func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) {
176 var rfi []os.FileInfo
177 rfi, err = f.f.Readdir(c)
181 for _, i := range rfi {
182 if i.IsDir() || f.re.MatchString(i.Name()) {
189 func (f *RegexpFile) Readdirnames(c int) (n []string, err error) {
190 fi, err := f.Readdir(c)
194 for _, s := range fi {
195 n = append(n, s.Name())
200 func (f *RegexpFile) Stat() (os.FileInfo, error) {
204 func (f *RegexpFile) Sync() error {
208 func (f *RegexpFile) Truncate(s int64) error {
209 return f.f.Truncate(s)
212 func (f *RegexpFile) WriteString(s string) (int, error) {
213 return f.f.WriteString(s)