aboutsummaryrefslogtreecommitdiff
path: root/object/fetch
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-28 16:46:30 +0000
committerGravatar Runxi Yu2026-03-28 16:46:30 +0000
commitf87db5f65f61709a44e111fc47bfbb0865b2067b (patch)
treed2da282f2df4596784692bf47b1f1efd8c4e2714 /object/fetch
parentobject/{blob,commit,tag}: Update docs (diff)
signatureNo signature
object/fetch: Update docs and rename resolver->fetcher
Diffstat (limited to 'object/fetch')
-rw-r--r--object/fetch/doc.go2
-rw-r--r--object/fetch/exact_blob.go2
-rw-r--r--object/fetch/exact_blob_reader.go2
-rw-r--r--object/fetch/exact_commit.go2
-rw-r--r--object/fetch/exact_commit_reader.go2
-rw-r--r--object/fetch/exact_object.go2
-rw-r--r--object/fetch/exact_tag.go2
-rw-r--r--object/fetch/exact_tag_reader.go2
-rw-r--r--object/fetch/exact_tree.go2
-rw-r--r--object/fetch/exact_tree_reader.go2
-rw-r--r--object/fetch/fetcher.go4
-rw-r--r--object/fetch/path.go2
-rw-r--r--object/fetch/peel_to_blob.go2
-rw-r--r--object/fetch/peel_to_blob_reader.go2
-rw-r--r--object/fetch/peel_to_commit.go2
-rw-r--r--object/fetch/peel_to_commit_reader.go2
-rw-r--r--object/fetch/peel_to_tag.go2
-rw-r--r--object/fetch/peel_to_tag_reader.go2
-rw-r--r--object/fetch/peel_to_tree.go2
-rw-r--r--object/fetch/peel_to_tree_reader.go2
-rw-r--r--object/fetch/treefs.go6
-rw-r--r--object/fetch/treefs_entry.go6
-rw-r--r--object/fetch/treefs_info.go2
-rw-r--r--object/fetch/treefs_new.go4
-rw-r--r--object/fetch/treefs_open.go4
-rw-r--r--object/fetch/treefs_readfile.go2
-rw-r--r--object/fetch/treefs_sub.go2
-rw-r--r--object/fetch/treefs_test.go6
28 files changed, 55 insertions, 19 deletions
diff --git a/object/fetch/doc.go b/object/fetch/doc.go
index 17657dbe..8b51ac10 100644
--- a/object/fetch/doc.go
+++ b/object/fetch/doc.go
@@ -1,5 +1,3 @@
// Package fetch resolves stored Git objects by exact type, by peeling
// tree-ish or commit-ish references, and by path within trees.
-//
-// A Fetcher does not take ownership of the underlying object store.
package fetch
diff --git a/object/fetch/exact_blob.go b/object/fetch/exact_blob.go
index 96ededdc..8b0378ea 100644
--- a/object/fetch/exact_blob.go
+++ b/object/fetch/exact_blob.go
@@ -9,6 +9,8 @@ import (
)
// ExactBlob reads, parses, and wraps the blob at id.
+//
+// Labels: Life-Parent.
func (r *Fetcher) ExactBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], error) {
parsed, err := r.parseObject(id)
if err != nil {
diff --git a/object/fetch/exact_blob_reader.go b/object/fetch/exact_blob_reader.go
index 95f5e1aa..ee0fc21a 100644
--- a/object/fetch/exact_blob_reader.go
+++ b/object/fetch/exact_blob_reader.go
@@ -9,6 +9,8 @@ import (
// ExactBlobReader returns a reader for the content of the blob at id,
// together with its content size in bytes.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) ExactBlobReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
return r.exactReader(id, objecttype.TypeBlob, "blob")
}
diff --git a/object/fetch/exact_commit.go b/object/fetch/exact_commit.go
index d3f9dee1..1b330e7d 100644
--- a/object/fetch/exact_commit.go
+++ b/object/fetch/exact_commit.go
@@ -9,6 +9,8 @@ import (
)
// ExactCommit reads, parses, and wraps the commit at id.
+//
+// Labels: Life-Parent.
func (r *Fetcher) ExactCommit(id objectid.ObjectID) (*stored.Stored[*commit.Commit], error) {
parsed, err := r.parseObject(id)
if err != nil {
diff --git a/object/fetch/exact_commit_reader.go b/object/fetch/exact_commit_reader.go
index 5ccae4b1..484fd89f 100644
--- a/object/fetch/exact_commit_reader.go
+++ b/object/fetch/exact_commit_reader.go
@@ -11,6 +11,8 @@ import (
// together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) ExactCommitReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
return r.exactReader(id, objecttype.TypeCommit, "commit")
}
diff --git a/object/fetch/exact_object.go b/object/fetch/exact_object.go
index 869d811f..2e4a8217 100644
--- a/object/fetch/exact_object.go
+++ b/object/fetch/exact_object.go
@@ -8,6 +8,8 @@ import (
// ExactObject reads, parses, and wraps the object at id without constraining
// its concrete object kind.
+//
+// Labels: Life-Parent.
func (r *Fetcher) ExactObject(id objectid.ObjectID) (*stored.Stored[object.Object], error) {
parsed, err := r.parseObject(id)
if err != nil {
diff --git a/object/fetch/exact_tag.go b/object/fetch/exact_tag.go
index 03c66019..e50cc565 100644
--- a/object/fetch/exact_tag.go
+++ b/object/fetch/exact_tag.go
@@ -9,6 +9,8 @@ import (
)
// ExactTag reads, parses, and wraps the tag at id.
+//
+// Labels: Life-Parent.
func (r *Fetcher) ExactTag(id objectid.ObjectID) (*stored.Stored[*tag.Tag], error) {
parsed, err := r.parseObject(id)
if err != nil {
diff --git a/object/fetch/exact_tag_reader.go b/object/fetch/exact_tag_reader.go
index 79a31a4c..d5e4f2c4 100644
--- a/object/fetch/exact_tag_reader.go
+++ b/object/fetch/exact_tag_reader.go
@@ -11,6 +11,8 @@ import (
// together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) ExactTagReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
return r.exactReader(id, objecttype.TypeTag, "tag")
}
diff --git a/object/fetch/exact_tree.go b/object/fetch/exact_tree.go
index cab10ba2..71d4c2b9 100644
--- a/object/fetch/exact_tree.go
+++ b/object/fetch/exact_tree.go
@@ -9,6 +9,8 @@ import (
)
// ExactTree reads, parses, and wraps the tree at id.
+//
+// Labels: Life-Parent.
func (r *Fetcher) ExactTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], error) {
parsed, err := r.parseObject(id)
if err != nil {
diff --git a/object/fetch/exact_tree_reader.go b/object/fetch/exact_tree_reader.go
index 4660bd34..d8fca5dc 100644
--- a/object/fetch/exact_tree_reader.go
+++ b/object/fetch/exact_tree_reader.go
@@ -11,6 +11,8 @@ import (
// together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) ExactTreeReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
return r.exactReader(id, objecttype.TypeTree, "tree")
}
diff --git a/object/fetch/fetcher.go b/object/fetch/fetcher.go
index b3787480..895b32f7 100644
--- a/object/fetch/fetcher.go
+++ b/object/fetch/fetcher.go
@@ -4,14 +4,14 @@ import objectstore "codeberg.org/lindenii/furgit/object/store"
// Fetcher resolves parsed and streamed objects from an object store.
//
-// A Fetcher does not take ownership of the store and does not close it.
+// Labels: MT-Safe.
type Fetcher struct {
store objectstore.ReadingStore
}
// New returns a Fetcher that reads objects from store.
//
-// The returned Fetcher does not take ownership of store.
+// Labels: Deps-Borrowed.
func New(store objectstore.ReadingStore) *Fetcher {
return &Fetcher{store: store}
}
diff --git a/object/fetch/path.go b/object/fetch/path.go
index f26379c3..e3c468db 100644
--- a/object/fetch/path.go
+++ b/object/fetch/path.go
@@ -59,6 +59,8 @@ func (err *PathNotTreeError) Error() string {
//
// If your entry names are valid UTF-8 and uses / solely as segment separators,
// it may be convenient to use TreeFS for an io/fs.FS-like interface.
+//
+// Labels: Life-Parent.
func (r *Fetcher) Path(root objectid.ObjectID, parts [][]byte) (tree.TreeEntry, error) {
if len(parts) == 0 {
return tree.TreeEntry{}, &PathEmptyError{}
diff --git a/object/fetch/peel_to_blob.go b/object/fetch/peel_to_blob.go
index b0a1ad1c..eea1487c 100644
--- a/object/fetch/peel_to_blob.go
+++ b/object/fetch/peel_to_blob.go
@@ -10,6 +10,8 @@ import (
)
// PeelToBlob peels tags until it reaches a blob.
+//
+// Labels: Life-Parent.
func (r *Fetcher) PeelToBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], error) {
for {
obj, err := r.ExactObject(id)
diff --git a/object/fetch/peel_to_blob_reader.go b/object/fetch/peel_to_blob_reader.go
index d7072531..dedffd01 100644
--- a/object/fetch/peel_to_blob_reader.go
+++ b/object/fetch/peel_to_blob_reader.go
@@ -8,6 +8,8 @@ import (
// PeelToBlobReader returns a reader for the content of the peeled blob at id,
// together with its content size in bytes.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) PeelToBlobReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
blobID, err := r.PeelToBlobID(id)
if err != nil {
diff --git a/object/fetch/peel_to_commit.go b/object/fetch/peel_to_commit.go
index 5ec66411..4a88f6f4 100644
--- a/object/fetch/peel_to_commit.go
+++ b/object/fetch/peel_to_commit.go
@@ -10,6 +10,8 @@ import (
)
// PeelToCommit peels tags until it reaches a commit.
+//
+// Labels: Life-Parent.
func (r *Fetcher) PeelToCommit(id objectid.ObjectID) (*stored.Stored[*commit.Commit], error) {
for {
obj, err := r.ExactObject(id)
diff --git a/object/fetch/peel_to_commit_reader.go b/object/fetch/peel_to_commit_reader.go
index 02bf9f6f..3b4cf824 100644
--- a/object/fetch/peel_to_commit_reader.go
+++ b/object/fetch/peel_to_commit_reader.go
@@ -10,6 +10,8 @@ import (
// id, together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) PeelToCommitReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
commitID, err := r.PeelToCommitID(id)
if err != nil {
diff --git a/object/fetch/peel_to_tag.go b/object/fetch/peel_to_tag.go
index 60693069..bd75182b 100644
--- a/object/fetch/peel_to_tag.go
+++ b/object/fetch/peel_to_tag.go
@@ -7,6 +7,8 @@ import (
)
// PeelToTag returns the tag at id without further peeling.
+//
+// Labels: Life-Parent.
func (r *Fetcher) PeelToTag(id objectid.ObjectID) (*stored.Stored[*tag.Tag], error) {
return r.ExactTag(id)
}
diff --git a/object/fetch/peel_to_tag_reader.go b/object/fetch/peel_to_tag_reader.go
index 562ef9e8..26de4e24 100644
--- a/object/fetch/peel_to_tag_reader.go
+++ b/object/fetch/peel_to_tag_reader.go
@@ -10,6 +10,8 @@ import (
// together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) PeelToTagReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
tagID, err := r.PeelToTagID(id)
if err != nil {
diff --git a/object/fetch/peel_to_tree.go b/object/fetch/peel_to_tree.go
index 119e76ac..5446eac0 100644
--- a/object/fetch/peel_to_tree.go
+++ b/object/fetch/peel_to_tree.go
@@ -12,6 +12,8 @@ import (
// PeelToTree peels tags until it reaches a tree or commit. If it reaches a
// commit, it returns the commit's root tree.
+//
+// Labels: Life-Parent.
func (r *Fetcher) PeelToTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], error) {
for {
obj, err := r.ExactObject(id)
diff --git a/object/fetch/peel_to_tree_reader.go b/object/fetch/peel_to_tree_reader.go
index fe1c5b93..260ba0da 100644
--- a/object/fetch/peel_to_tree_reader.go
+++ b/object/fetch/peel_to_tree_reader.go
@@ -10,6 +10,8 @@ import (
// together with its content size in bytes.
//
// Usage of this method is unusual.
+//
+// Labels: Life-Parent, Close-Caller.
func (r *Fetcher) PeelToTreeReader(id objectid.ObjectID) (io.ReadCloser, int64, error) {
treeID, err := r.PeelToTreeID(id)
if err != nil {
diff --git a/object/fetch/treefs.go b/object/fetch/treefs.go
index 06b6ad25..39ea7ad5 100644
--- a/object/fetch/treefs.go
+++ b/object/fetch/treefs.go
@@ -7,16 +7,16 @@ import (
"codeberg.org/lindenii/furgit/object/tree"
)
-// TreeFS exposes one Git tree as an fs.FS.
+// TreeFS exposes one Git tree as an fs.FS view backed by a Fetcher.
//
// TreeFS interprets names using io/fs path rules. Those rules do not match raw
// Git tree entry naming exactly: names are UTF-8, slash-separated, and must be
// valid fs.FS paths. Tree entries that cannot be represented under those rules
// are not addressable through this API.
//
-// TreeFS does not take ownership of its Fetcher.
+// Labels: MT-Safe.
type TreeFS struct {
- resolver *Fetcher
+ fetcher *Fetcher
rootTree objectid.ObjectID
rootEntry *tree.TreeEntry
}
diff --git a/object/fetch/treefs_entry.go b/object/fetch/treefs_entry.go
index 4aa7730a..885e5afe 100644
--- a/object/fetch/treefs_entry.go
+++ b/object/fetch/treefs_entry.go
@@ -23,7 +23,7 @@ func (treeFS *TreeFS) resolvePath(op treeFSOp, name string) (treeEntryValue, err
}, nil
}
- entry, err := treeFS.resolver.Path(treeFS.rootTree, treeFSSplitPath(name))
+ entry, err := treeFS.fetcher.Path(treeFS.rootTree, treeFSSplitPath(name))
if err != nil {
return treeEntryValue{}, treeFS.pathResolveError(op, name, err)
}
@@ -68,8 +68,8 @@ func (entry treeEntryValue) isDir() bool {
return entry.mode == tree.FileModeDir
}
-func (entry treeEntryValue) blobSize(resolve *Fetcher) (int64, error) {
- _, size, err := resolve.store.ReadHeader(entry.objectID)
+func (entry treeEntryValue) blobSize(fetcher *Fetcher) (int64, error) {
+ _, size, err := fetcher.store.ReadHeader(entry.objectID)
if err != nil {
return 0, err
}
diff --git a/object/fetch/treefs_info.go b/object/fetch/treefs_info.go
index eecf183d..f1db7e9a 100644
--- a/object/fetch/treefs_info.go
+++ b/object/fetch/treefs_info.go
@@ -54,7 +54,7 @@ func (treeFS *TreeFS) statEntry(entry treeEntryValue) (*treeFSInfo, error) {
if entry.mode == tree.FileModeRegular || entry.mode == tree.FileModeExecutable || entry.mode == tree.FileModeSymlink {
var err error
- size, err = entry.blobSize(treeFS.resolver)
+ size, err = entry.blobSize(treeFS.fetcher)
if err != nil {
return nil, err
}
diff --git a/object/fetch/treefs_new.go b/object/fetch/treefs_new.go
index d2224fcf..e8a25dc9 100644
--- a/object/fetch/treefs_new.go
+++ b/object/fetch/treefs_new.go
@@ -4,6 +4,8 @@ import objectid "codeberg.org/lindenii/furgit/object/id"
// TreeFS returns a new filesystem view rooted at root, which may be any
// tree-ish object accepted by PeelToTreeID.
+//
+// Labels: Deps-Borrowed, Life-Parent, Close-No.
func (r *Fetcher) TreeFS(root objectid.ObjectID) (*TreeFS, error) {
rootTree, err := r.PeelToTreeID(root)
if err != nil {
@@ -11,7 +13,7 @@ func (r *Fetcher) TreeFS(root objectid.ObjectID) (*TreeFS, error) {
}
return &TreeFS{
- resolver: r,
+ fetcher: r,
rootTree: rootTree,
}, nil
}
diff --git a/object/fetch/treefs_open.go b/object/fetch/treefs_open.go
index 59c6ec5d..fc0f7635 100644
--- a/object/fetch/treefs_open.go
+++ b/object/fetch/treefs_open.go
@@ -29,7 +29,7 @@ func (treeFS *TreeFS) Open(name string) (fs.File, error) {
return nil, treeFSPathError(treeFSOpOpen, name, err)
}
- tree, err := treeFS.resolver.ExactTree(treeID)
+ tree, err := treeFS.fetcher.ExactTree(treeID)
if err != nil {
return nil, treeFSPathError(treeFSOpOpen, name, err)
}
@@ -61,7 +61,7 @@ func (treeFS *TreeFS) Open(name string) (fs.File, error) {
return nil, treeFSPathError(treeFSOpOpen, name, fmt.Errorf("object/fetch: gitlink entries are not readable as files"))
}
- reader, _, err := treeFS.resolver.ExactBlobReader(entry.objectID)
+ reader, _, err := treeFS.fetcher.ExactBlobReader(entry.objectID)
if err != nil {
return nil, treeFSPathError(treeFSOpOpen, name, err)
}
diff --git a/object/fetch/treefs_readfile.go b/object/fetch/treefs_readfile.go
index d3671f07..b248135f 100644
--- a/object/fetch/treefs_readfile.go
+++ b/object/fetch/treefs_readfile.go
@@ -24,7 +24,7 @@ func (treeFS *TreeFS) ReadFile(name string) ([]byte, error) {
return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("object/fetch: gitlink entries are not readable as files"))
}
- reader, _, err := treeFS.resolver.ExactBlobReader(entry.objectID)
+ reader, _, err := treeFS.fetcher.ExactBlobReader(entry.objectID)
if err != nil {
return nil, treeFSPathError(treeFSOpReadFile, name, err)
}
diff --git a/object/fetch/treefs_sub.go b/object/fetch/treefs_sub.go
index faf47092..c303d16d 100644
--- a/object/fetch/treefs_sub.go
+++ b/object/fetch/treefs_sub.go
@@ -15,7 +15,7 @@ func (treeFS *TreeFS) Sub(dir string) (fs.FS, error) {
}
return &TreeFS{
- resolver: treeFS.resolver,
+ fetcher: treeFS.fetcher,
rootTree: treeID,
rootEntry: entry.treeEntry,
}, nil
diff --git a/object/fetch/treefs_test.go b/object/fetch/treefs_test.go
index c8414967..ba5d4127 100644
--- a/object/fetch/treefs_test.go
+++ b/object/fetch/treefs_test.go
@@ -41,11 +41,11 @@ func TestTreeFS(t *testing.T) {
defer func() { _ = repo.Close() }()
- resolver := fetch.New(repo.Objects())
+ fetcher := fetch.New(repo.Objects())
- treeFS, err := resolver.TreeFS(commitID)
+ treeFS, err := fetcher.TreeFS(commitID)
if err != nil {
- t.Fatalf("resolver.TreeFS: %v", err)
+ t.Fatalf("fetcher.TreeFS: %v", err)
}
content, err := treeFS.ReadFile("plain.txt")