aboutsummaryrefslogtreecommitdiff
path: root/object/resolve/treefs_info.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/resolve/treefs_info.go')
-rw-r--r--object/resolve/treefs_info.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/object/resolve/treefs_info.go b/object/resolve/treefs_info.go
new file mode 100644
index 00000000..3d441e91
--- /dev/null
+++ b/object/resolve/treefs_info.go
@@ -0,0 +1,73 @@
+package resolve
+
+import (
+ "io/fs"
+ "time"
+
+ "codeberg.org/lindenii/furgit/object"
+)
+
+type treeFSInfo struct {
+ name string
+ mode fs.FileMode
+ size int64
+ sys any
+ isDir bool
+}
+
+var (
+ _ fs.FileInfo = (*treeFSInfo)(nil)
+ _ fs.DirEntry = (*treeFSInfo)(nil)
+)
+
+func (info *treeFSInfo) Name() string { return info.name }
+func (info *treeFSInfo) Size() int64 { return info.size }
+func (info *treeFSInfo) Mode() fs.FileMode { return info.mode }
+func (info *treeFSInfo) Type() fs.FileMode { return info.mode.Type() }
+func (info *treeFSInfo) IsDir() bool { return info.isDir }
+func (info *treeFSInfo) ModTime() time.Time { return time.Time{} }
+func (info *treeFSInfo) Sys() any { return info.sys }
+func (info *treeFSInfo) Info() (fs.FileInfo, error) {
+ return info, nil
+}
+
+func treeFSEntryMode(mode object.FileMode) fs.FileMode {
+ switch mode {
+ case object.FileModeDir:
+ return fs.ModeDir | 0o555
+ case object.FileModeRegular:
+ return 0o444
+ case object.FileModeExecutable:
+ return 0o555
+ case object.FileModeSymlink:
+ return fs.ModeSymlink | 0o444
+ case object.FileModeGitlink:
+ return fs.ModeIrregular
+ default:
+ return fs.ModeIrregular
+ }
+}
+
+func (treeFS *TreeFS) statEntry(entry treeEntryValue) (*treeFSInfo, error) {
+ size := int64(0)
+ if entry.mode == object.FileModeRegular || entry.mode == object.FileModeExecutable || entry.mode == object.FileModeSymlink {
+ var err error
+ size, err = entry.blobSize(treeFS.resolver)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var sys any
+ if entry.treeEntry != nil {
+ sys = *entry.treeEntry
+ }
+
+ return &treeFSInfo{
+ name: entry.name,
+ mode: treeFSEntryMode(entry.mode),
+ size: size,
+ sys: sys,
+ isDir: entry.isDir(),
+ }, nil
+}