SandpointsGitHook/vendor/github.com/bep/overlayfs/readops.go

60 lines
1.4 KiB
Go

package overlayfs
import (
"os"
"github.com/spf13/afero"
)
// Stat returns a FileInfo describing the named file, or an error, if any
// happens.
func (ofs *OverlayFs) Stat(name string) (os.FileInfo, error) {
_, fi, _, err := ofs.stat(name, false)
return fi, err
}
// LstatIfPossible will call Lstat if the filesystem iself is, or it delegates to, the os filesystem.
// Else it will call Stat.
func (ofs *OverlayFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
_, fi, ok, err := ofs.stat(name, false)
return fi, ok, err
}
// Open opens a file, returning it or an error, if any happens.
// If name is a directory, a *Dir is returned representing all directories matching name.
// Note that a *Dir must not be used after it's closed.
func (ofs *OverlayFs) Open(name string) (afero.File, error) {
fs, fi, _, err := ofs.stat(name, false)
if err != nil {
return nil, err
}
if fi.IsDir() {
dir := getDir()
dir.name = name
dir.merge = ofs.mergeDirs
if err := ofs.collectDirs(name, func(fs afero.Fs) {
dir.fss = append(dir.fss, fs)
}); err != nil {
dir.Close()
return nil, err
}
if len(dir.fss) == 0 {
// They mave been deleted.
dir.Close()
return nil, os.ErrNotExist
}
if len(dir.fss) == 1 {
// Optimize for the common case.
d, err := dir.fss[0].Open(name)
dir.Close()
return d, err
}
return dir, nil
}
return fs.Open(name)
}