aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cli/internal/fs/lstat.go
diff options
context:
space:
mode:
Diffstat (limited to 'cli/internal/fs/lstat.go')
-rw-r--r--cli/internal/fs/lstat.go74
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
+}