From dd84b9d64fb98746a230cd24233ff50a562c39c9 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Fri, 28 Apr 2023 01:36:44 +0800 Subject: --- cli/internal/fs/lstat.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 cli/internal/fs/lstat.go (limited to 'cli/internal/fs/lstat.go') 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 +} -- cgit v1.2.3-70-g09d2