shithub: furgit

Download patch

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) {
--