diff options
Diffstat (limited to 'cli/internal/fs/lstat.go')
| -rw-r--r-- | cli/internal/fs/lstat.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/cli/internal/fs/lstat.go b/cli/internal/fs/lstat.go new file mode 100644 index 0000000..eff0810 --- /dev/null +++ b/cli/internal/fs/lstat.go @@ -0,0 +1,74 @@ +package fs + +import ( + "io/fs" + "os" + + "github.com/vercel/turbo/cli/internal/turbopath" +) + +// LstatCachedFile maintains a cache of file info, mode and type for the given Path +type LstatCachedFile struct { + Path turbopath.AbsoluteSystemPath + fileInfo fs.FileInfo + fileMode *fs.FileMode + fileType *fs.FileMode +} + +// GetInfo returns, and caches the file info for the LstatCachedFile.Path +func (file *LstatCachedFile) GetInfo() (fs.FileInfo, error) { + if file.fileInfo != nil { + return file.fileInfo, nil + } + + err := file.lstat() + if err != nil { + return nil, err + } + + return file.fileInfo, nil +} + +// GetMode returns, and caches the file mode for the LstatCachedFile.Path +func (file *LstatCachedFile) GetMode() (fs.FileMode, error) { + if file.fileMode != nil { + return *file.fileMode, nil + } + + err := file.lstat() + if err != nil { + return 0, err + } + + return *file.fileMode, nil +} + +// GetType returns, and caches the type bits of (FileMode & os.ModeType) for the LstatCachedFile.Path +func (file *LstatCachedFile) GetType() (fs.FileMode, error) { + if file.fileType != nil { + return *file.fileType, nil + } + + err := file.lstat() + if err != nil { + return 0, err + } + + return *file.fileType, nil +} + +func (file *LstatCachedFile) lstat() error { + fileInfo, err := file.Path.Lstat() + if err != nil { + return err + } + + fileMode := fileInfo.Mode() + fileModeType := fileMode & os.ModeType + + file.fileInfo = fileInfo + file.fileMode = &fileMode + file.fileType = &fileModeType + + return nil +} |
