ref: 49f93cd54dfa46c488875139499dad13f4cf61db
parent: da6764565629b0376f8d505bdd9d5fdc9c567f93
author: Runxi Yu <runxiyu@umich.edu>
date: Mon Mar 30 23:02:16 EDT 2026
object/fetch: Cleanup and add header/size
--- a/object/fetch/doc.go
+++ b/object/fetch/doc.go
@@ -2,6 +2,7 @@
// higher-level object queries.
//
// Fetching is above [objectstore]: it parses stored objects into blobs, trees,
-// commits, and tags, peels tree-ish or commit-ish objects, resolves paths
-// within trees, and can expose one tree as an [io/fs] view.
+// commits, and tags, exposes object metadata, peels tree-ish or commit-ish
+// objects, resolves paths within trees, and can expose one tree as an [io/fs]
+// view.
package fetch
--- a/object/fetch/exact_commit_reader.go
+++ /dev/null
@@ -1,18 +1,0 @@
-package fetch
-
-import (
- "io"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
-
-// ExactCommitReader returns a reader for the content of the commit at id,
-// 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)
-}
--- a/object/fetch/exact_tag_reader.go
+++ /dev/null
@@ -1,18 +1,0 @@
-package fetch
-
-import (
- "io"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
-
-// ExactTagReader returns a reader for the content of the tag at id,
-// 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)
-}
--- a/object/fetch/exact_tree_reader.go
+++ /dev/null
@@ -1,18 +1,0 @@
-package fetch
-
-import (
- "io"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
- objecttype "codeberg.org/lindenii/furgit/object/type"
-)
-
-// ExactTreeReader returns a reader for the content of the tree at id,
-// 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)
-}
--- a/object/fetch/fetcher.go
+++ b/object/fetch/fetcher.go
@@ -2,7 +2,10 @@
import objectstore "codeberg.org/lindenii/furgit/object/store"
-// Fetcher resolves parsed and streamed objects from an object store.
+// Fetcher provides ordinary object access above an object store.
+//
+// It exposes object metadata, typed object loading, tree-ish and commit-ish
+// peeling, path resolution, one-tree fs views, and blob content streaming.
//
// Labels: MT-Safe.
type Fetcher struct {--- /dev/null
+++ b/object/fetch/header.go
@@ -1,0 +1,18 @@
+package fetch
+
+import (
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ objecttype "codeberg.org/lindenii/furgit/object/type"
+)
+
+// Header returns the object type and content size at id.
+//
+// Labels: Life-Parent.
+func (r *Fetcher) Header(id objectid.ObjectID) (objecttype.Type, int64, error) {+ ty, size, err := r.store.ReadHeader(id)
+ if err != nil {+ return objecttype.TypeInvalid, 0, wrapObjectReadError(id, err)
+ }
+
+ return ty, size, nil
+}
--- a/object/fetch/peel_to_blob_id.go
+++ b/object/fetch/peel_to_blob_id.go
@@ -9,9 +9,9 @@
// PeelToBlobID peels tags until it reaches a blob object ID.
func (r *Fetcher) PeelToBlobID(id objectid.ObjectID) (objectid.ObjectID, error) { for {- ty, _, err := r.store.ReadHeader(id)
+ ty, _, err := r.Header(id)
if err != nil {- return objectid.ObjectID{}, wrapObjectReadError(id, err)+ return objectid.ObjectID{}, err}
switch ty {--- a/object/fetch/peel_to_commit_id.go
+++ b/object/fetch/peel_to_commit_id.go
@@ -9,9 +9,9 @@
// PeelToCommitID peels tags until it reaches a commit object ID.
func (r *Fetcher) PeelToCommitID(id objectid.ObjectID) (objectid.ObjectID, error) { for {- ty, _, err := r.store.ReadHeader(id)
+ ty, _, err := r.Header(id)
if err != nil {- return objectid.ObjectID{}, wrapObjectReadError(id, err)+ return objectid.ObjectID{}, err}
switch ty {--- a/object/fetch/peel_to_commit_reader.go
+++ /dev/null
@@ -1,22 +1,0 @@
-package fetch
-
-import (
- "io"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
-)
-
-// PeelToCommitReader returns a reader for the content of the peeled commit at
-// 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 {- return nil, 0, err
- }
-
- return r.ExactCommitReader(commitID)
-}
--- a/object/fetch/peel_to_tree_id.go
+++ b/object/fetch/peel_to_tree_id.go
@@ -10,9 +10,9 @@
// root tree object ID is then returned.
func (r *Fetcher) PeelToTreeID(id objectid.ObjectID) (objectid.ObjectID, error) { for {- ty, _, err := r.store.ReadHeader(id)
+ ty, _, err := r.Header(id)
if err != nil {- return objectid.ObjectID{}, wrapObjectReadError(id, err)+ return objectid.ObjectID{}, err}
switch ty {--- a/object/fetch/peel_to_tree_reader.go
+++ /dev/null
@@ -1,22 +1,0 @@
-package fetch
-
-import (
- "io"
-
- objectid "codeberg.org/lindenii/furgit/object/id"
-)
-
-// PeelToTreeReader returns a reader for the content of the peeled tree at id,
-// 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 {- return nil, 0, err
- }
-
- return r.ExactTreeReader(treeID)
-}
--- /dev/null
+++ b/object/fetch/size.go
@@ -1,0 +1,10 @@
+package fetch
+
+import objectid "codeberg.org/lindenii/furgit/object/id"
+
+// Size returns the object content size at id.
+//
+// Labels: Life-Parent.
+func (r *Fetcher) Size(id objectid.ObjectID) (int64, error) {+ return r.store.ReadSize(id)
+}
--- a/object/fetch/treefs_entry.go
+++ b/object/fetch/treefs_entry.go
@@ -69,12 +69,7 @@
}
func (entry treeEntryValue) blobSize(fetcher *Fetcher) (int64, error) {- _, size, err := fetcher.store.ReadHeader(entry.objectID)
- if err != nil {- return 0, err
- }
-
- return size, nil
+ return fetcher.Size(entry.objectID)
}
func (entry treeEntryValue) subtreeID() (objectid.ObjectID, error) {--
⑨