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  }