aboutsummaryrefslogtreecommitdiff
path: root/object/resolve
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-25 14:49:17 +0000
committerGravatar Runxi Yu2026-03-25 15:02:22 +0000
commit7847657e0820af98120031f719b8ede635ad8c07 (patch)
tree8c4439c78f72f1382edc809b49be33115847b6e7 /object/resolve
parentobject: Remove type.go (diff)
signatureNo signature
object: Split each object type into its own package v0.1.108
Diffstat (limited to 'object/resolve')
-rw-r--r--object/resolve/exact_blob.go6
-rw-r--r--object/resolve/exact_commit.go6
-rw-r--r--object/resolve/exact_tag.go6
-rw-r--r--object/resolve/exact_tree.go6
-rw-r--r--object/resolve/path.go20
-rw-r--r--object/resolve/peel_to_blob.go9
-rw-r--r--object/resolve/peel_to_commit.go9
-rw-r--r--object/resolve/peel_to_tag.go4
-rw-r--r--object/resolve/peel_to_tree.go12
-rw-r--r--object/resolve/resolver.go2
-rw-r--r--object/resolve/treefs.go4
-rw-r--r--object/resolve/treefs_entry.go12
-rw-r--r--object/resolve/treefs_info.go16
-rw-r--r--object/resolve/treefs_open.go4
-rw-r--r--object/resolve/treefs_readfile.go4
-rw-r--r--object/resolve/treefs_stat.go2
-rw-r--r--object/resolve/treefs_test.go10
17 files changed, 68 insertions, 64 deletions
diff --git a/object/resolve/exact_blob.go b/object/resolve/exact_blob.go
index 07501513..2cd8b298 100644
--- a/object/resolve/exact_blob.go
+++ b/object/resolve/exact_blob.go
@@ -3,19 +3,19 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/blob"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
)
// ExactBlob reads, parses, and wraps the blob at id.
-func (r *Resolver) ExactBlob(id objectid.ObjectID) (*stored.Stored[*object.Blob], error) {
+func (r *Resolver) ExactBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], error) {
parsed, err := r.parseObject(id)
if err != nil {
return nil, err
}
- blob, ok := parsed.(*object.Blob)
+ blob, ok := parsed.(*blob.Blob)
if !ok {
return nil, fmt.Errorf("object/resolve: expected blob object %s, got %v", id, parsed.ObjectType())
}
diff --git a/object/resolve/exact_commit.go b/object/resolve/exact_commit.go
index ba76baa2..e6b379aa 100644
--- a/object/resolve/exact_commit.go
+++ b/object/resolve/exact_commit.go
@@ -3,19 +3,19 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/commit"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
)
// ExactCommit reads, parses, and wraps the commit at id.
-func (r *Resolver) ExactCommit(id objectid.ObjectID) (*stored.Stored[*object.Commit], error) {
+func (r *Resolver) ExactCommit(id objectid.ObjectID) (*stored.Stored[*commit.Commit], error) {
parsed, err := r.parseObject(id)
if err != nil {
return nil, err
}
- commit, ok := parsed.(*object.Commit)
+ commit, ok := parsed.(*commit.Commit)
if !ok {
return nil, fmt.Errorf("object/resolve: expected commit object %s, got %v", id, parsed.ObjectType())
}
diff --git a/object/resolve/exact_tag.go b/object/resolve/exact_tag.go
index 26bf2b11..8c5d22c9 100644
--- a/object/resolve/exact_tag.go
+++ b/object/resolve/exact_tag.go
@@ -3,19 +3,19 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tag"
)
// ExactTag reads, parses, and wraps the tag at id.
-func (r *Resolver) ExactTag(id objectid.ObjectID) (*stored.Stored[*object.Tag], error) {
+func (r *Resolver) ExactTag(id objectid.ObjectID) (*stored.Stored[*tag.Tag], error) {
parsed, err := r.parseObject(id)
if err != nil {
return nil, err
}
- tag, ok := parsed.(*object.Tag)
+ tag, ok := parsed.(*tag.Tag)
if !ok {
return nil, fmt.Errorf("object/resolve: expected tag object %s, got %v", id, parsed.ObjectType())
}
diff --git a/object/resolve/exact_tree.go b/object/resolve/exact_tree.go
index aaf40236..de58ddb1 100644
--- a/object/resolve/exact_tree.go
+++ b/object/resolve/exact_tree.go
@@ -3,19 +3,19 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// ExactTree reads, parses, and wraps the tree at id.
-func (r *Resolver) ExactTree(id objectid.ObjectID) (*stored.Stored[*object.Tree], error) {
+func (r *Resolver) ExactTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], error) {
parsed, err := r.parseObject(id)
if err != nil {
return nil, err
}
- tree, ok := parsed.(*object.Tree)
+ tree, ok := parsed.(*tree.Tree)
if !ok {
return nil, fmt.Errorf("object/resolve: expected tree object %s, got %v", id, parsed.ObjectType())
}
diff --git a/object/resolve/path.go b/object/resolve/path.go
index 1f865403..d11f3b48 100644
--- a/object/resolve/path.go
+++ b/object/resolve/path.go
@@ -3,8 +3,8 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// PathEmptyError indicates that Path received no segments.
@@ -59,24 +59,24 @@ 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.
-func (r *Resolver) Path(root objectid.ObjectID, parts [][]byte) (object.TreeEntry, error) {
+func (r *Resolver) Path(root objectid.ObjectID, parts [][]byte) (tree.TreeEntry, error) {
if len(parts) == 0 {
- return object.TreeEntry{}, &PathEmptyError{}
+ return tree.TreeEntry{}, &PathEmptyError{}
}
current, err := r.PeelToTree(root)
if err != nil {
- return object.TreeEntry{}, err
+ return tree.TreeEntry{}, err
}
for i, part := range parts {
if len(part) == 0 {
- return object.TreeEntry{}, &PathSegmentEmptyError{Index: i}
+ return tree.TreeEntry{}, &PathSegmentEmptyError{Index: i}
}
entry := current.Object().Entry(part)
if entry == nil {
- return object.TreeEntry{}, &PathNotFoundError{
+ return tree.TreeEntry{}, &PathNotFoundError{
Index: i,
Name: append([]byte(nil), part...),
}
@@ -86,8 +86,8 @@ func (r *Resolver) Path(root objectid.ObjectID, parts [][]byte) (object.TreeEntr
return *entry, nil
}
- if entry.Mode != object.FileModeDir {
- return object.TreeEntry{}, &PathNotTreeError{
+ if entry.Mode != tree.FileModeDir {
+ return tree.TreeEntry{}, &PathNotTreeError{
Index: i,
Name: append([]byte(nil), part...),
}
@@ -95,9 +95,9 @@ func (r *Resolver) Path(root objectid.ObjectID, parts [][]byte) (object.TreeEntr
current, err = r.ExactTree(entry.ID)
if err != nil {
- return object.TreeEntry{}, err
+ return tree.TreeEntry{}, err
}
}
- return object.TreeEntry{}, &PathNotFoundError{Index: len(parts) - 1}
+ return tree.TreeEntry{}, &PathNotFoundError{Index: len(parts) - 1}
}
diff --git a/object/resolve/peel_to_blob.go b/object/resolve/peel_to_blob.go
index 424e309f..c8aec1ad 100644
--- a/object/resolve/peel_to_blob.go
+++ b/object/resolve/peel_to_blob.go
@@ -3,13 +3,14 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/blob"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tag"
)
// PeelToBlob peels tags until it reaches a blob.
-func (r *Resolver) PeelToBlob(id objectid.ObjectID) (*stored.Stored[*object.Blob], error) {
+func (r *Resolver) PeelToBlob(id objectid.ObjectID) (*stored.Stored[*blob.Blob], error) {
for {
obj, err := r.ExactObject(id)
if err != nil {
@@ -17,9 +18,9 @@ func (r *Resolver) PeelToBlob(id objectid.ObjectID) (*stored.Stored[*object.Blob
}
switch parsed := obj.Object().(type) {
- case *object.Blob:
+ case *blob.Blob:
return stored.New(id, parsed), nil
- case *object.Tag:
+ case *tag.Tag:
id = parsed.Target
default:
return nil, fmt.Errorf("object/resolve: expected blob-ish object %s, got %v", id, parsed.ObjectType())
diff --git a/object/resolve/peel_to_commit.go b/object/resolve/peel_to_commit.go
index 355a3055..0272dd83 100644
--- a/object/resolve/peel_to_commit.go
+++ b/object/resolve/peel_to_commit.go
@@ -3,13 +3,14 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/commit"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tag"
)
// PeelToCommit peels tags until it reaches a commit.
-func (r *Resolver) PeelToCommit(id objectid.ObjectID) (*stored.Stored[*object.Commit], error) {
+func (r *Resolver) PeelToCommit(id objectid.ObjectID) (*stored.Stored[*commit.Commit], error) {
for {
obj, err := r.ExactObject(id)
if err != nil {
@@ -17,9 +18,9 @@ func (r *Resolver) PeelToCommit(id objectid.ObjectID) (*stored.Stored[*object.Co
}
switch parsed := obj.Object().(type) {
- case *object.Commit:
+ case *commit.Commit:
return stored.New(id, parsed), nil
- case *object.Tag:
+ case *tag.Tag:
id = parsed.Target
default:
return nil, fmt.Errorf("object/resolve: expected commit-ish object %s, got %v", id, parsed.ObjectType())
diff --git a/object/resolve/peel_to_tag.go b/object/resolve/peel_to_tag.go
index 6f61d7e1..e131f4c1 100644
--- a/object/resolve/peel_to_tag.go
+++ b/object/resolve/peel_to_tag.go
@@ -1,12 +1,12 @@
package resolve
import (
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tag"
)
// PeelToTag returns the tag at id without further peeling.
-func (r *Resolver) PeelToTag(id objectid.ObjectID) (*stored.Stored[*object.Tag], error) {
+func (r *Resolver) PeelToTag(id objectid.ObjectID) (*stored.Stored[*tag.Tag], error) {
return r.ExactTag(id)
}
diff --git a/object/resolve/peel_to_tree.go b/object/resolve/peel_to_tree.go
index 3b12bdd8..2f2da4d7 100644
--- a/object/resolve/peel_to_tree.go
+++ b/object/resolve/peel_to_tree.go
@@ -3,14 +3,16 @@ package resolve
import (
"fmt"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/commit"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/stored"
+ "codeberg.org/lindenii/furgit/object/tag"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// PeelToTree peels tags until it reaches a tree or commit. If it reaches a
// commit, it returns the commit's root tree.
-func (r *Resolver) PeelToTree(id objectid.ObjectID) (*stored.Stored[*object.Tree], error) {
+func (r *Resolver) PeelToTree(id objectid.ObjectID) (*stored.Stored[*tree.Tree], error) {
for {
obj, err := r.ExactObject(id)
if err != nil {
@@ -18,11 +20,11 @@ func (r *Resolver) PeelToTree(id objectid.ObjectID) (*stored.Stored[*object.Tree
}
switch parsed := obj.Object().(type) {
- case *object.Tree:
+ case *tree.Tree:
return stored.New(id, parsed), nil
- case *object.Commit:
+ case *commit.Commit:
return r.ExactTree(parsed.Tree)
- case *object.Tag:
+ case *tag.Tag:
id = parsed.Target
default:
return nil, fmt.Errorf("object/resolve: expected tree-ish object %s, got %v", id, parsed.ObjectType())
diff --git a/object/resolve/resolver.go b/object/resolve/resolver.go
index 3e76e96a..f5e4e8c3 100644
--- a/object/resolve/resolver.go
+++ b/object/resolve/resolver.go
@@ -1,6 +1,6 @@
package resolve
-import "codeberg.org/lindenii/furgit/object/storer"
+import objectstorer "codeberg.org/lindenii/furgit/object/storer"
// Resolver resolves parsed and streamed objects from an object store.
//
diff --git a/object/resolve/treefs.go b/object/resolve/treefs.go
index de5d588a..a080d56d 100644
--- a/object/resolve/treefs.go
+++ b/object/resolve/treefs.go
@@ -3,8 +3,8 @@ package resolve
import (
"io/fs"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// TreeFS exposes one Git tree as an fs.FS.
@@ -18,7 +18,7 @@ import (
type TreeFS struct {
resolver *Resolver
rootTree objectid.ObjectID
- rootEntry *object.TreeEntry
+ rootEntry *tree.TreeEntry
}
var (
diff --git a/object/resolve/treefs_entry.go b/object/resolve/treefs_entry.go
index b37ac0a0..6d23e282 100644
--- a/object/resolve/treefs_entry.go
+++ b/object/resolve/treefs_entry.go
@@ -5,8 +5,8 @@ import (
"fmt"
"io/fs"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/object/tree"
)
func (treeFS *TreeFS) resolvePath(op treeFSOp, name string) (treeEntryValue, error) {
@@ -17,7 +17,7 @@ func (treeFS *TreeFS) resolvePath(op treeFSOp, name string) (treeEntryValue, err
if name == "." {
return treeEntryValue{
name: ".",
- mode: object.FileModeDir,
+ mode: tree.FileModeDir,
treeID: treeFS.rootTree,
treeEntry: treeFS.rootEntry,
}, nil
@@ -58,14 +58,14 @@ func (treeFS *TreeFS) pathResolveError(op treeFSOp, name string, err error) erro
type treeEntryValue struct {
name string
- mode object.FileMode
+ mode tree.FileMode
objectID objectid.ObjectID
treeID objectid.ObjectID
- treeEntry *object.TreeEntry
+ treeEntry *tree.TreeEntry
}
func (entry treeEntryValue) isDir() bool {
- return entry.mode == object.FileModeDir
+ return entry.mode == tree.FileModeDir
}
func (entry treeEntryValue) blobSize(resolve *Resolver) (int64, error) {
@@ -82,7 +82,7 @@ func (entry treeEntryValue) subtreeID() (objectid.ObjectID, error) {
return entry.treeID, nil
}
- if entry.mode != object.FileModeDir {
+ if entry.mode != tree.FileModeDir {
return objectid.ObjectID{}, fmt.Errorf("object/resolve: path %q is not a tree", entry.name)
}
diff --git a/object/resolve/treefs_info.go b/object/resolve/treefs_info.go
index f554973d..f8eb1e9e 100644
--- a/object/resolve/treefs_info.go
+++ b/object/resolve/treefs_info.go
@@ -4,7 +4,7 @@ import (
"io/fs"
"time"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/tree"
)
type treeFSInfo struct {
@@ -31,17 +31,17 @@ func (info *treeFSInfo) Info() (fs.FileInfo, error) {
return info, nil
}
-func treeFSEntryMode(mode object.FileMode) fs.FileMode {
+func treeFSEntryMode(mode tree.FileMode) fs.FileMode {
switch mode {
- case object.FileModeDir:
+ case tree.FileModeDir:
return fs.ModeDir | 0o555
- case object.FileModeRegular:
+ case tree.FileModeRegular:
return 0o444
- case object.FileModeExecutable:
+ case tree.FileModeExecutable:
return 0o555
- case object.FileModeSymlink:
+ case tree.FileModeSymlink:
return fs.ModeSymlink | 0o444
- case object.FileModeGitlink:
+ case tree.FileModeGitlink:
return fs.ModeIrregular
default:
return fs.ModeIrregular
@@ -51,7 +51,7 @@ func treeFSEntryMode(mode object.FileMode) fs.FileMode {
func (treeFS *TreeFS) statEntry(entry treeEntryValue) (*treeFSInfo, error) {
size := int64(0)
- if entry.mode == object.FileModeRegular || entry.mode == object.FileModeExecutable || entry.mode == object.FileModeSymlink {
+ if entry.mode == tree.FileModeRegular || entry.mode == tree.FileModeExecutable || entry.mode == tree.FileModeSymlink {
var err error
size, err = entry.blobSize(treeFS.resolver)
diff --git a/object/resolve/treefs_open.go b/object/resolve/treefs_open.go
index c938505b..8e2b3588 100644
--- a/object/resolve/treefs_open.go
+++ b/object/resolve/treefs_open.go
@@ -5,7 +5,7 @@ import (
"io"
"io/fs"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// Open opens name for reading.
@@ -57,7 +57,7 @@ func (treeFS *TreeFS) Open(name string) (fs.File, error) {
}, nil
}
- if entry.mode == object.FileModeGitlink {
+ if entry.mode == tree.FileModeGitlink {
return nil, treeFSPathError(treeFSOpOpen, name, fmt.Errorf("object/resolve: gitlink entries are not readable as files"))
}
diff --git a/object/resolve/treefs_readfile.go b/object/resolve/treefs_readfile.go
index e2bc1698..e1d514a3 100644
--- a/object/resolve/treefs_readfile.go
+++ b/object/resolve/treefs_readfile.go
@@ -4,7 +4,7 @@ import (
"fmt"
"io"
- "codeberg.org/lindenii/furgit/object"
+ "codeberg.org/lindenii/furgit/object/tree"
)
// ReadFile reads the blob contents at name.
@@ -20,7 +20,7 @@ func (treeFS *TreeFS) ReadFile(name string) ([]byte, error) {
return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("is a directory"))
}
- if entry.mode == object.FileModeGitlink {
+ if entry.mode == tree.FileModeGitlink {
return nil, treeFSPathError(treeFSOpReadFile, name, fmt.Errorf("object/resolve: gitlink entries are not readable as files"))
}
diff --git a/object/resolve/treefs_stat.go b/object/resolve/treefs_stat.go
index 044ba049..396dfbae 100644
--- a/object/resolve/treefs_stat.go
+++ b/object/resolve/treefs_stat.go
@@ -6,7 +6,7 @@ import "io/fs"
//
// TreeFS metadata reflects Git tree entry mode and blob size where applicable.
// It does not represent filesystem stat metadata: ModTime is zero, ownership is
-// unavailable, and Sys returns the underlying object.TreeEntry when one exists.
+// unavailable, and Sys returns the underlying tree.TreeEntry when one exists.
func (treeFS *TreeFS) Stat(name string) (fs.FileInfo, error) {
entry, err := treeFS.resolvePath(treeFSOpStat, name)
if err != nil {
diff --git a/object/resolve/treefs_test.go b/object/resolve/treefs_test.go
index a22e5019..0c436c0b 100644
--- a/object/resolve/treefs_test.go
+++ b/object/resolve/treefs_test.go
@@ -6,9 +6,9 @@ import (
"testing"
"codeberg.org/lindenii/furgit/internal/testgit"
- "codeberg.org/lindenii/furgit/object"
objectid "codeberg.org/lindenii/furgit/object/id"
"codeberg.org/lindenii/furgit/object/resolve"
+ "codeberg.org/lindenii/furgit/object/tree"
"codeberg.org/lindenii/furgit/repository"
)
@@ -71,13 +71,13 @@ func TestTreeFS(t *testing.T) {
t.Fatalf("Stat(plain.txt): %v", err)
}
- entry, ok := info.Sys().(object.TreeEntry)
+ entry, ok := info.Sys().(tree.TreeEntry)
if !ok {
- t.Fatalf("Stat(plain.txt).Sys() type = %T, want object.TreeEntry", info.Sys())
+ t.Fatalf("Stat(plain.txt).Sys() type = %T, want tree.TreeEntry", info.Sys())
}
- if entry.Mode != object.FileModeRegular {
- t.Fatalf("Stat(plain.txt).Sys().Mode = %o, want %o", entry.Mode, object.FileModeRegular)
+ if entry.Mode != tree.FileModeRegular {
+ t.Fatalf("Stat(plain.txt).Sys().Mode = %o, want %o", entry.Mode, tree.FileModeRegular)
}
subFS, err := treeFS.Sub("dir")