aboutsummaryrefslogtreecommitdiff
path: root/object/resolve/treefs_readfile.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/resolve/treefs_readfile.go')
-rw-r--r--object/resolve/treefs_readfile.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/object/resolve/treefs_readfile.go b/object/resolve/treefs_readfile.go
new file mode 100644
index 00000000..72af931c
--- /dev/null
+++ b/object/resolve/treefs_readfile.go
@@ -0,0 +1,37 @@
+package resolve
+
+import (
+ "fmt"
+ "io"
+
+ "codeberg.org/lindenii/furgit/object"
+)
+
+func (treeFS *TreeFS) ReadFile(name string) ([]byte, error) {
+ entry, err := treeFS.resolvePath(treeFSOpReadFile, name)
+ if err != nil {
+ return nil, err
+ }
+
+ if entry.isDir() {
+ return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("is a directory"))
+ }
+
+ if entry.mode == object.FileModeGitlink {
+ return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("object/resolve: gitlink entries are not readable as files"))
+ }
+
+ reader, _, err := treeFS.resolver.ExactBlobReader(entry.objectID)
+ if err != nil {
+ return nil, treeFSPathError(treeFSOpReadFile, name, err)
+ }
+
+ defer func() { _ = reader.Close() }()
+
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ return nil, treeFSPathError(treeFSOpReadFile, name, err)
+ }
+
+ return data, nil
+}