github.com/Cloud-Foundations/Dominator@v0.3.4/lib/filesystem/filter.go (about) 1 package filesystem 2 3 import ( 4 "path" 5 6 "github.com/Cloud-Foundations/Dominator/lib/filter" 7 ) 8 9 func (fs *FileSystem) filter(filter *filter.Filter) *FileSystem { 10 if filter == nil { 11 return fs 12 } 13 if err := fs.RebuildInodePointers(); err != nil { 14 panic(err) 15 } 16 newFS := new(FileSystem) 17 newFS.InodeTable = make(InodeTable) 18 newFS.DirectoryInode = *fs.DirectoryInode.filter(newFS, filter, "/") 19 newFS.ComputeTotalDataBytes() 20 return newFS 21 } 22 23 func (inode *DirectoryInode) filter(newFS *FileSystem, 24 filter *filter.Filter, name string) *DirectoryInode { 25 newInode := new(DirectoryInode) 26 newInode.Mode = inode.Mode 27 newInode.Uid = inode.Uid 28 newInode.Gid = inode.Gid 29 for _, entry := range inode.EntryList { 30 subName := path.Join(name, entry.Name) 31 if filter.Match(subName) { 32 continue 33 } 34 var newEntry *DirectoryEntry 35 if inode, ok := entry.inode.(*DirectoryInode); ok { 36 newEntry = new(DirectoryEntry) 37 newEntry.Name = entry.Name 38 newEntry.InodeNumber = entry.InodeNumber 39 newEntry.inode = inode.filter(newFS, filter, subName) 40 } else { 41 newEntry = entry 42 } 43 newInode.EntryList = append(newInode.EntryList, newEntry) 44 newFS.InodeTable[entry.InodeNumber] = newEntry.inode 45 } 46 newFS.DirectoryCount++ 47 return newInode 48 }