Path: blob/main/vendor/github.com/spf13/afero/regexpfs.go
2875 views
package afero12import (3"os"4"regexp"5"syscall"6"time"7)89// The RegexpFs filters files (not directories) by regular expression. Only10// files matching the given regexp will be allowed, all others get a ENOENT error (11// "No such file or directory").12type RegexpFs struct {13re *regexp.Regexp14source Fs15}1617func NewRegexpFs(source Fs, re *regexp.Regexp) Fs {18return &RegexpFs{source: source, re: re}19}2021type RegexpFile struct {22f File23re *regexp.Regexp24}2526func (r *RegexpFs) matchesName(name string) error {27if r.re == nil {28return nil29}30if r.re.MatchString(name) {31return nil32}33return syscall.ENOENT34}3536func (r *RegexpFs) dirOrMatches(name string) error {37dir, err := IsDir(r.source, name)38if err != nil {39return err40}41if dir {42return nil43}44return r.matchesName(name)45}4647func (r *RegexpFs) Chtimes(name string, a, m time.Time) error {48if err := r.dirOrMatches(name); err != nil {49return err50}51return r.source.Chtimes(name, a, m)52}5354func (r *RegexpFs) Chmod(name string, mode os.FileMode) error {55if err := r.dirOrMatches(name); err != nil {56return err57}58return r.source.Chmod(name, mode)59}6061func (r *RegexpFs) Chown(name string, uid, gid int) error {62if err := r.dirOrMatches(name); err != nil {63return err64}65return r.source.Chown(name, uid, gid)66}6768func (r *RegexpFs) Name() string {69return "RegexpFs"70}7172func (r *RegexpFs) Stat(name string) (os.FileInfo, error) {73if err := r.dirOrMatches(name); err != nil {74return nil, err75}76return r.source.Stat(name)77}7879func (r *RegexpFs) Rename(oldname, newname string) error {80dir, err := IsDir(r.source, oldname)81if err != nil {82return err83}84if dir {85return nil86}87if err := r.matchesName(oldname); err != nil {88return err89}90if err := r.matchesName(newname); err != nil {91return err92}93return r.source.Rename(oldname, newname)94}9596func (r *RegexpFs) RemoveAll(p string) error {97dir, err := IsDir(r.source, p)98if err != nil {99return err100}101if !dir {102if err := r.matchesName(p); err != nil {103return err104}105}106return r.source.RemoveAll(p)107}108109func (r *RegexpFs) Remove(name string) error {110if err := r.dirOrMatches(name); err != nil {111return err112}113return r.source.Remove(name)114}115116func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {117if err := r.dirOrMatches(name); err != nil {118return nil, err119}120return r.source.OpenFile(name, flag, perm)121}122123func (r *RegexpFs) Open(name string) (File, error) {124dir, err := IsDir(r.source, name)125if err != nil {126return nil, err127}128if !dir {129if err := r.matchesName(name); err != nil {130return nil, err131}132}133f, err := r.source.Open(name)134if err != nil {135return nil, err136}137return &RegexpFile{f: f, re: r.re}, nil138}139140func (r *RegexpFs) Mkdir(n string, p os.FileMode) error {141return r.source.Mkdir(n, p)142}143144func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error {145return r.source.MkdirAll(n, p)146}147148func (r *RegexpFs) Create(name string) (File, error) {149if err := r.matchesName(name); err != nil {150return nil, err151}152return r.source.Create(name)153}154155func (f *RegexpFile) Close() error {156return f.f.Close()157}158159func (f *RegexpFile) Read(s []byte) (int, error) {160return f.f.Read(s)161}162163func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) {164return f.f.ReadAt(s, o)165}166167func (f *RegexpFile) Seek(o int64, w int) (int64, error) {168return f.f.Seek(o, w)169}170171func (f *RegexpFile) Write(s []byte) (int, error) {172return f.f.Write(s)173}174175func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) {176return f.f.WriteAt(s, o)177}178179func (f *RegexpFile) Name() string {180return f.f.Name()181}182183func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) {184var rfi []os.FileInfo185rfi, err = f.f.Readdir(c)186if err != nil {187return nil, err188}189for _, i := range rfi {190if i.IsDir() || f.re.MatchString(i.Name()) {191fi = append(fi, i)192}193}194return fi, nil195}196197func (f *RegexpFile) Readdirnames(c int) (n []string, err error) {198fi, err := f.Readdir(c)199if err != nil {200return nil, err201}202for _, s := range fi {203n = append(n, s.Name())204}205return n, nil206}207208func (f *RegexpFile) Stat() (os.FileInfo, error) {209return f.f.Stat()210}211212func (f *RegexpFile) Sync() error {213return f.f.Sync()214}215216func (f *RegexpFile) Truncate(s int64) error {217return f.f.Truncate(s)218}219220func (f *RegexpFile) WriteString(s string) (int, error) {221return f.f.WriteString(s)222}223224225