summaryrefslogtreecommitdiffstats
path: root/hugofs/decorators.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugofs/decorators.go')
-rw-r--r--hugofs/decorators.go143
1 files changed, 28 insertions, 115 deletions
diff --git a/hugofs/decorators.go b/hugofs/decorators.go
index 47b4266df..405c81ce4 100644
--- a/hugofs/decorators.go
+++ b/hugofs/decorators.go
@@ -15,63 +15,25 @@ package hugofs
import (
"fmt"
+ "io/fs"
"os"
"path/filepath"
- "strings"
- "github.com/gohugoio/hugo/common/herrors"
"github.com/spf13/afero"
)
-var (
- _ FilesystemUnwrapper = (*baseFileDecoratorFs)(nil)
-)
+var _ FilesystemUnwrapper = (*baseFileDecoratorFs)(nil)
func decorateDirs(fs afero.Fs, meta *FileMeta) afero.Fs {
ffs := &baseFileDecoratorFs{Fs: fs}
- decorator := func(fi os.FileInfo, name string) (os.FileInfo, error) {
+ decorator := func(fi FileNameIsDir, name string) (FileNameIsDir, error) {
if !fi.IsDir() {
// Leave regular files as they are.
return fi, nil
}
- return decorateFileInfo(fi, fs, nil, "", "", meta), nil
- }
-
- ffs.decorate = decorator
-
- return ffs
-}
-
-func decoratePath(fs afero.Fs, createPath func(name string) string) afero.Fs {
- ffs := &baseFileDecoratorFs{Fs: fs}
-
- decorator := func(fi os.FileInfo, name string) (os.FileInfo, error) {
- path := createPath(name)
-
- return decorateFileInfo(fi, fs, nil, "", path, nil), nil
- }
-
- ffs.decorate = decorator
-
- return ffs
-}
-
-// DecorateBasePathFs adds Path info to files and directories in the
-// provided BasePathFs, using the base as base.
-func DecorateBasePathFs(base *afero.BasePathFs) afero.Fs {
- basePath, _ := base.RealPath("")
- if !strings.HasSuffix(basePath, filepathSeparator) {
- basePath += filepathSeparator
- }
-
- ffs := &baseFileDecoratorFs{Fs: base}
-
- decorator := func(fi os.FileInfo, name string) (os.FileInfo, error) {
- path := strings.TrimPrefix(name, basePath)
-
- return decorateFileInfo(fi, base, nil, "", path, nil), nil
+ return decorateFileInfo(fi, nil, "", meta), nil
}
ffs.decorate = decorator
@@ -84,7 +46,7 @@ func DecorateBasePathFs(base *afero.BasePathFs) afero.Fs {
func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero.Fs {
ffs := &baseFileDecoratorFs{Fs: fs}
- decorator := func(fi os.FileInfo, filename string) (os.FileInfo, error) {
+ decorator := func(fi FileNameIsDir, filename string) (FileNameIsDir, error) {
// Store away the original in case it's a symlink.
meta := NewFileMeta()
meta.Name = fi.Name()
@@ -92,38 +54,24 @@ func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero
if fi.IsDir() {
meta.JoinStatFunc = func(name string) (FileMetaInfo, error) {
joinedFilename := filepath.Join(filename, name)
- fi, _, err := lstatIfPossible(fs, joinedFilename)
+ fi, err := fs.Stat(joinedFilename)
if err != nil {
return nil, err
}
-
- fi, err = ffs.decorate(fi, joinedFilename)
+ fim, err := ffs.decorate(fi, joinedFilename)
if err != nil {
return nil, err
}
- return fi.(FileMetaInfo), nil
- }
- }
-
- isSymlink := isSymlink(fi)
- if isSymlink {
- meta.OriginalFilename = filename
- var link string
- var err error
- link, fi, err = evalSymlinks(fs, filename)
- if err != nil {
- return nil, err
+ return fim.(FileMetaInfo), nil
}
- filename = link
- meta.IsSymlink = true
}
opener := func() (afero.File, error) {
return ffs.open(filename)
}
- fim := decorateFileInfo(fi, ffs, opener, filename, "", meta)
+ fim := decorateFileInfo(fi, opener, filename, meta)
for _, cb := range callbacks {
cb(fim)
@@ -136,23 +84,9 @@ func NewBaseFileDecorator(fs afero.Fs, callbacks ...func(fi FileMetaInfo)) afero
return ffs
}
-func evalSymlinks(fs afero.Fs, filename string) (string, os.FileInfo, error) {
- link, err := filepath.EvalSymlinks(filename)
- if err != nil {
- return "", nil, err
- }
-
- fi, err := fs.Stat(link)
- if err != nil {
- return "", nil, err
- }
-
- return link, fi, nil
-}
-
type baseFileDecoratorFs struct {
afero.Fs
- decorate func(fi os.FileInfo, filename string) (os.FileInfo, error)
+ decorate func(fi FileNameIsDir, name string) (FileNameIsDir, error)
}
func (fs *baseFileDecoratorFs) UnwrapFilesystem() afero.Fs {
@@ -165,29 +99,11 @@ func (fs *baseFileDecoratorFs) Stat(name string) (os.FileInfo, error) {
return nil, err
}
- return fs.decorate(fi, name)
-}
-
-func (fs *baseFileDecoratorFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
- var (
- fi os.FileInfo
- err error
- ok bool
- )
-
- if lstater, isLstater := fs.Fs.(afero.Lstater); isLstater {
- fi, ok, err = lstater.LstatIfPossible(name)
- } else {
- fi, err = fs.Fs.Stat(name)
- }
-
+ fim, err := fs.decorate(fi, name)
if err != nil {
- return nil, false, err
+ return nil, err
}
-
- fi, err = fs.decorate(fi, name)
-
- return fi, ok, err
+ return fim.(os.FileInfo), nil
}
func (fs *baseFileDecoratorFs) Open(name string) (afero.File, error) {
@@ -207,35 +123,32 @@ type baseFileDecoratorFile struct {
fs *baseFileDecoratorFs
}
-func (l *baseFileDecoratorFile) Readdir(c int) (ofi []os.FileInfo, err error) {
- dirnames, err := l.File.Readdirnames(c)
+func (l *baseFileDecoratorFile) ReadDir(n int) ([]fs.DirEntry, error) {
+ fis, err := l.File.(fs.ReadDirFile).ReadDir(-1)
if err != nil {
return nil, err
}
- fisp := make([]os.FileInfo, 0, len(dirnames))
+ fisp := make([]fs.DirEntry, len(fis))
- for _, dirname := range dirnames {
- filename := dirname
-
- if l.Name() != "" && l.Name() != filepathSeparator {
- filename = filepath.Join(l.Name(), dirname)
+ for i, fi := range fis {
+ filename := fi.Name()
+ if l.Name() != "" {
+ filename = filepath.Join(l.Name(), fi.Name())
}
- // We need to resolve any symlink info.
- fi, _, err := lstatIfPossible(l.fs.Fs, filename)
- if err != nil {
- if herrors.IsNotExist(err) {
- continue
- }
- return nil, err
- }
- fi, err = l.fs.decorate(fi, filename)
+ fid, err := l.fs.decorate(fi, filename)
if err != nil {
return nil, fmt.Errorf("decorate: %w", err)
}
- fisp = append(fisp, fi)
+
+ fisp[i] = fid.(fs.DirEntry)
+
}
return fisp, err
}
+
+func (l *baseFileDecoratorFile) Readdir(c int) (ofi []os.FileInfo, err error) {
+ panic("not supported: Use ReadDir")
+}