ref: bb5b5334c74026c0a46f48cf2418038e0d909e9b
parent: 98e5a64ce72e81dcede7dbebc74e22576a1f5ab8
author: Runxi Yu <me@runxiyu.org>
date: Fri Feb 20 17:30:57 EST 2026
object: Remove the old opaque errors
--- a/object/blob_serialize.go
+++ b/object/blob_serialize.go
@@ -1,6 +1,8 @@
package object
import (
+ "errors"
+
"codeberg.org/lindenii/furgit/internal/objectheader"
"codeberg.org/lindenii/furgit/objecttype"
)
@@ -18,7 +20,7 @@
}
header, ok := objectheader.Encode(objecttype.TypeBlob, int64(len(body)))
if !ok {- return nil, ErrInvalidObject
+ return nil, errors.New("object: blob: failed to encode object header")}
raw := make([]byte, len(header)+len(body))
copy(raw, header)
--- a/object/commit_parse.go
+++ b/object/commit_parse.go
@@ -11,7 +11,7 @@
// ParseCommit decodes a commit object body.
func ParseCommit(body []byte, algo oid.Algorithm) (*Commit, error) { if algo.Size() == 0 {- return nil, ErrInvalidObject
+ return nil, fmt.Errorf("object: commit: invalid hash algorithm %q", algo)}
c := new(Commit)
@@ -79,7 +79,7 @@
}
if i > len(body) {- return nil, ErrInvalidObject
+ return nil, errors.New("object: commit: parser position out of bounds")}
c.Message = append([]byte(nil), body[i:]...)
return c, nil
--- a/object/commit_serialize.go
+++ b/object/commit_serialize.go
@@ -2,6 +2,7 @@
import (
"bytes"
+ "errors"
"fmt"
"codeberg.org/lindenii/furgit/internal/objectheader"
@@ -13,7 +14,7 @@
var buf bytes.Buffer
if commit.Tree.Size() == 0 {- return nil, ErrInvalidObject
+ return nil, errors.New("object: commit: missing tree id")}
fmt.Fprintf(&buf, "tree %s\n", commit.Tree.String())
for _, parent := range commit.Parents {@@ -43,7 +44,7 @@
}
for _, h := range commit.ExtraHeaders { if h.Key == "" {- return nil, ErrInvalidObject
+ return nil, errors.New("object: commit: extra header has empty key")}
buf.WriteString(h.Key)
buf.WriteByte(' ')@@ -64,7 +65,7 @@
}
header, ok := objectheader.Encode(objecttype.TypeCommit, int64(len(body)))
if !ok {- return nil, ErrInvalidObject
+ return nil, errors.New("object: commit: failed to encode object header")}
raw := make([]byte, len(header)+len(body))
copy(raw, header)
--- a/object/object.go
+++ b/object/object.go
@@ -1,18 +1,7 @@
// Package object provides Git object models and codecs.
package object
-import (
- "errors"
-
- "codeberg.org/lindenii/furgit/objecttype"
-)
-
-var (
- // ErrInvalidObject indicates malformed serialized data.
- ErrInvalidObject = errors.New("object: invalid object encoding")- // ErrNotFound indicates missing entries in in-memory lookups.
- ErrNotFound = errors.New("object: not found")-)
+import "codeberg.org/lindenii/furgit/objecttype"
// Object is a Git object that can serialize itself.
type Object interface {--- a/object/tag_parse.go
+++ b/object/tag_parse.go
@@ -12,7 +12,7 @@
// ParseTag decodes a tag object body.
func ParseTag(body []byte, algo oid.Algorithm) (*Tag, error) { if algo.Size() == 0 {- return nil, ErrInvalidObject
+ return nil, fmt.Errorf("object: tag: invalid hash algorithm %q", algo)}
t := new(Tag)
--- a/object/tag_serialize.go
+++ b/object/tag_serialize.go
@@ -2,6 +2,7 @@
import (
"bytes"
+ "errors"
"fmt"
"codeberg.org/lindenii/furgit/internal/objectheader"
@@ -11,7 +12,7 @@
// SerializeWithoutHeader renders the raw tag body bytes.
func (tag *Tag) SerializeWithoutHeader() ([]byte, error) { if tag.Target.Size() == 0 {- return nil, ErrInvalidObject
+ return nil, errors.New("object: tag: missing target id")}
var buf bytes.Buffer
@@ -52,7 +53,7 @@
}
header, ok := objectheader.Encode(objecttype.TypeTag, int64(len(body)))
if !ok {- return nil, ErrInvalidObject
+ return nil, errors.New("object: tag: failed to encode object header")}
raw := make([]byte, len(header)+len(body))
copy(raw, header)
--- a/object/tree.go
+++ b/object/tree.go
@@ -2,6 +2,7 @@
import (
"bytes"
+ "errors"
"fmt"
"sort"
@@ -73,7 +74,7 @@
// InsertEntry inserts a tree entry while preserving Git ordering.
func (tree *Tree) InsertEntry(newEntry TreeEntry) error { if tree == nil {- return ErrInvalidObject
+ return errors.New("object: tree: insert on nil tree")}
if tree.entry(newEntry.Name, true) != nil || tree.entry(newEntry.Name, false) != nil { return fmt.Errorf("object: tree: entry %q already exists", newEntry.Name)@@ -91,10 +92,10 @@
// RemoveEntry removes a tree entry by name.
func (tree *Tree) RemoveEntry(name []byte) error { if tree == nil {- return ErrInvalidObject
+ return errors.New("object: tree: remove on nil tree")}
if len(tree.Entries) == 0 {- return ErrNotFound
+ return fmt.Errorf("object: tree: entry %q not found", name)}
for i := range tree.Entries { if bytes.Equal(tree.Entries[i].Name, name) {@@ -103,7 +104,7 @@
return nil
}
}
- return ErrNotFound
+ return fmt.Errorf("object: tree: entry %q not found", name)}
// TreeEntryNameCompare compares names using Git tree ordering rules.
--- a/object/tree_parse.go
+++ b/object/tree_parse.go
@@ -11,7 +11,7 @@
// ParseTree decodes a tree object body.
func ParseTree(body []byte, algo oid.Algorithm) (*Tree, error) { if algo.Size() == 0 {- return nil, ErrInvalidObject
+ return nil, fmt.Errorf("object: tree: invalid hash algorithm %q", algo)}
var entries []TreeEntry
--- a/object/tree_serialize.go
+++ b/object/tree_serialize.go
@@ -1,6 +1,7 @@
package object
import (
+ "errors"
"strconv"
"codeberg.org/lindenii/furgit/internal/objectheader"
@@ -40,7 +41,7 @@
}
header, ok := objectheader.Encode(objecttype.TypeTree, int64(len(body)))
if !ok {- return nil, ErrInvalidObject
+ return nil, errors.New("object: tree: failed to encode object header")}
raw := make([]byte, len(header)+len(body))
copy(raw, header)
--- a/object/tree_serialize_test.go
+++ b/object/tree_serialize_test.go
@@ -1,7 +1,6 @@
package object_test
import (
- "errors"
"testing"
"codeberg.org/lindenii/furgit/internal/testgit"
@@ -36,8 +35,8 @@
if tree.Entry(removed.Name) != nil { t.Fatalf("Entry(%q) should be nil after remove", removed.Name)}
- if err := tree.RemoveEntry([]byte("no-such-entry")); !errors.Is(err, object.ErrNotFound) {- t.Fatalf("RemoveEntry missing err = %v, want ErrNotFound", err)+ if err := tree.RemoveEntry([]byte("no-such-entry")); err == nil {+ t.Fatalf("RemoveEntry missing entry should fail")}
if err := tree.InsertEntry(removed); err != nil { t.Fatalf("re-InsertEntry(%q): %v", removed.Name, err)--
⑨