diff options
author | Bjørn Erik Pedersen <[email protected]> | 2021-10-16 16:24:49 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2021-10-20 05:00:17 +0200 |
commit | 471ed91c60cd36645794925cb4892cc820eae626 (patch) | |
tree | b78ae6d931e7dd39ccd35a1ed3ff8440f9ef7900 /hugofs/rootmapping_fs.go | |
parent | 94a5bac5b29bbba1ca4809752fe3fd04a58547b6 (diff) | |
download | hugo-471ed91c60cd36645794925cb4892cc820eae626.tar.gz hugo-471ed91c60cd36645794925cb4892cc820eae626.zip |
hugofs: Add includeFiles and excludeFiles to mount configuration
Fixes #9042
Diffstat (limited to 'hugofs/rootmapping_fs.go')
-rw-r--r-- | hugofs/rootmapping_fs.go | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/hugofs/rootmapping_fs.go b/hugofs/rootmapping_fs.go index 6441693ad..bd10144ff 100644 --- a/hugofs/rootmapping_fs.go +++ b/hugofs/rootmapping_fs.go @@ -142,6 +142,13 @@ func (r RootMapping) filename(name string) string { return filepath.Join(r.To, strings.TrimPrefix(name, r.From)) } +func (r RootMapping) trimFrom(name string) string { + if name == "" { + return "" + } + return strings.TrimPrefix(name, r.From) +} + // A RootMappingFs maps several roots into one. Note that the root of this filesystem // is directories only, and they will be returned in Readdir and Readdirnames // in the order given. @@ -170,7 +177,12 @@ func (fs *RootMappingFs) Dirs(base string) ([]FileMetaInfo, error) { p = strings.TrimLeft(p, filepathSeparator) return p }) - fs := decorateDirs(bfs, r.Meta) + + fs := bfs + if r.Meta.InclusionFilter != nil { + fs = newFilenameFilterFs(fs, r.To, r.Meta.InclusionFilter) + } + fs = decorateDirs(fs, r.Meta) fi, err := fs.Stat("") if err != nil { return nil, errors.Wrap(err, "RootMappingFs.Dirs") @@ -368,6 +380,10 @@ func (fs *RootMappingFs) collectDirEntries(prefix string) ([]os.FileInfo, error) for _, fi := range direntries { meta := fi.(FileMetaInfo).Meta() meta.Merge(rm.Meta) + if !rm.Meta.InclusionFilter.Match(strings.TrimPrefix(meta.Filename, meta.SourceRoot), fi.IsDir()) { + continue + } + if fi.IsDir() { name := fi.Name() if seen[name] { @@ -508,7 +524,14 @@ func (fs *RootMappingFs) doLstat(name string) ([]FileMetaInfo, error) { } fileCount := 0 + var wasFiltered bool for _, root := range roots { + meta := root.fi.Meta() + if !meta.InclusionFilter.Match(strings.TrimPrefix(meta.Filename, meta.SourceRoot), root.fi.IsDir()) { + wasFiltered = true + continue + } + if !root.fi.IsDir() { fileCount++ } @@ -518,6 +541,9 @@ func (fs *RootMappingFs) doLstat(name string) ([]FileMetaInfo, error) { } if fileCount == 0 { + if wasFiltered { + return nil, os.ErrNotExist + } // Dir only. return []FileMetaInfo{newDirNameOnlyFileInfo(name, roots[0].Meta, fs.virtualDirOpener(name))}, nil } @@ -531,6 +557,9 @@ func (fs *RootMappingFs) doLstat(name string) ([]FileMetaInfo, error) { } func (fs *RootMappingFs) statRoot(root RootMapping, name string) (FileMetaInfo, bool, error) { + if !root.Meta.InclusionFilter.Match(root.trimFrom(name), root.fi.IsDir()) { + return nil, false, os.ErrNotExist + } filename := root.filename(name) fi, b, err := lstatIfPossible(fs.Fs, filename) @@ -586,16 +615,23 @@ func (f *rootMappingFile) Name() string { func (f *rootMappingFile) Readdir(count int) ([]os.FileInfo, error) { if f.File != nil { + fis, err := f.File.Readdir(count) if err != nil { return nil, err } - for i, fi := range fis { - fis[i] = decorateFileInfo(fi, f.fs, nil, "", "", f.meta) + var result []os.FileInfo + for _, fi := range fis { + fim := decorateFileInfo(fi, f.fs, nil, "", "", f.meta) + meta := fim.Meta() + if f.meta.InclusionFilter.Match(strings.TrimPrefix(meta.Filename, meta.SourceRoot), fim.IsDir()) { + result = append(result, fim) + } } - return fis, nil + return result, nil } + return f.fs.collectDirEntries(f.name) } |