aboutsummaryrefslogtreecommitdiff
path: root/object/fetch/treefs_readfile.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/fetch/treefs_readfile.go')
-rw-r--r--object/fetch/treefs_readfile.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/object/fetch/treefs_readfile.go b/object/fetch/treefs_readfile.go
new file mode 100644
index 00000000..d3671f07
--- /dev/null
+++ b/object/fetch/treefs_readfile.go
@@ -0,0 +1,40 @@
+package fetch
+
+import (
+ "fmt"
+ "io"
+
+ "codeberg.org/lindenii/furgit/object/tree"
+)
+
+// ReadFile reads the blob contents at name.
+//
+// Directories and gitlink entries are not readable through TreeFS.
+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 == tree.FileModeGitlink {
+ return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("object/fetch: 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
+}