shithub: furgit

Download patch

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