60 lines
1.4 KiB
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)
|
|
}
|