shithub: furgit

Download patch

ref: 977114819521563458c40a8d1aa35c72b23d5395
parent: 18c460be20d78813afafd04077e9970f1d22f364
author: Runxi Yu <me@runxiyu.org>
date: Fri Feb 20 17:16:08 EST 2026

object: Use objecttype instead of doing object types ourself

--- a/object/blob.go
+++ b/object/blob.go
@@ -1,5 +1,7 @@
 package object
 
+import "codeberg.org/lindenii/furgit/objecttype"
+
 // Blob represents a Git blob object.
 type Blob struct {
 	Data []byte
@@ -6,7 +8,7 @@
 }
 
 // ObjectType returns TypeBlob.
-func (blob *Blob) ObjectType() Type {
+func (blob *Blob) ObjectType() objecttype.Type {
 	_ = blob
-	return TypeBlob
+	return objecttype.TypeBlob
 }
--- a/object/blob_serialize.go
+++ b/object/blob_serialize.go
@@ -1,8 +1,10 @@
 package object
 
+import "codeberg.org/lindenii/furgit/objecttype"
+
 // Serialize renders the raw object (header + body).
 func (blob *Blob) Serialize() ([]byte, error) {
-	header, err := headerForType(TypeBlob, blob.Data)
+	header, err := headerForType(objecttype.TypeBlob, blob.Data)
 	if err != nil {
 		return nil, err
 	}
--- a/object/commit.go
+++ b/object/commit.go
@@ -1,6 +1,9 @@
 package object
 
-import "codeberg.org/lindenii/furgit/oid"
+import (
+	"codeberg.org/lindenii/furgit/objecttype"
+	"codeberg.org/lindenii/furgit/oid"
+)
 
 // Commit represents a Git commit object.
 type Commit struct {
@@ -14,7 +17,7 @@
 }
 
 // ObjectType returns TypeCommit.
-func (commit *Commit) ObjectType() Type {
+func (commit *Commit) ObjectType() objecttype.Type {
 	_ = commit
-	return TypeCommit
+	return objecttype.TypeCommit
 }
--- a/object/commit_serialize.go
+++ b/object/commit_serialize.go
@@ -3,6 +3,8 @@
 import (
 	"bytes"
 	"fmt"
+
+	"codeberg.org/lindenii/furgit/objecttype"
 )
 
 func (commit *Commit) serialize() ([]byte, error) {
@@ -58,7 +60,7 @@
 	if err != nil {
 		return nil, err
 	}
-	header, err := headerForType(TypeCommit, body)
+	header, err := headerForType(objecttype.TypeCommit, body)
 	if err != nil {
 		return nil, err
 	}
--- a/object/object.go
+++ b/object/object.go
@@ -4,8 +4,9 @@
 import (
 	"bytes"
 	"errors"
-	"fmt"
 	"strconv"
+
+	"codeberg.org/lindenii/furgit/objecttype"
 )
 
 var (
@@ -15,68 +16,16 @@
 	ErrNotFound = errors.New("object: not found")
 )
 
-// Type mirrors Git object type tags.
-type Type uint8
-
-const (
-	TypeInvalid  Type = 0
-	TypeCommit   Type = 1
-	TypeTree     Type = 2
-	TypeBlob     Type = 3
-	TypeTag      Type = 4
-	TypeFuture   Type = 5
-	TypeOfsDelta Type = 6
-	TypeRefDelta Type = 7
-)
-
-const (
-	typeNameBlob   = "blob"
-	typeNameTree   = "tree"
-	typeNameCommit = "commit"
-	typeNameTag    = "tag"
-)
-
 // Object is a Git object that can serialize itself.
 type Object interface {
-	ObjectType() Type
+	ObjectType() objecttype.Type
 	Serialize() ([]byte, error)
 }
 
-// ParseTypeName parses a canonical Git object type name.
-func ParseTypeName(name string) (Type, error) {
-	switch name {
-	case typeNameBlob:
-		return TypeBlob, nil
-	case typeNameTree:
-		return TypeTree, nil
-	case typeNameCommit:
-		return TypeCommit, nil
-	case typeNameTag:
-		return TypeTag, nil
-	default:
-		return TypeInvalid, ErrInvalidObject
-	}
-}
-
-func typeName(ty Type) (string, error) {
-	switch ty {
-	case TypeBlob:
-		return typeNameBlob, nil
-	case TypeTree:
-		return typeNameTree, nil
-	case TypeCommit:
-		return typeNameCommit, nil
-	case TypeTag:
-		return typeNameTag, nil
-	default:
-		return "", fmt.Errorf("object: unsupported type %d", ty)
-	}
-}
-
-func headerForType(ty Type, body []byte) ([]byte, error) {
-	tyStr, err := typeName(ty)
-	if err != nil {
-		return nil, err
+func headerForType(ty objecttype.Type, body []byte) ([]byte, error) {
+	tyStr, ok := objecttype.Name(ty)
+	if !ok {
+		return nil, ErrInvalidObject
 	}
 	size := strconv.Itoa(len(body))
 	var buf bytes.Buffer
--- a/object/tag.go
+++ b/object/tag.go
@@ -1,11 +1,14 @@
 package object
 
-import "codeberg.org/lindenii/furgit/oid"
+import (
+	"codeberg.org/lindenii/furgit/objecttype"
+	"codeberg.org/lindenii/furgit/oid"
+)
 
 // Tag represents a Git annotated tag object.
 type Tag struct {
 	Target     oid.ObjectID
-	TargetType Type
+	TargetType objecttype.Type
 	Name       []byte
 	Tagger     *Ident
 	Message    []byte
@@ -12,7 +15,7 @@
 }
 
 // ObjectType returns TypeTag.
-func (tag *Tag) ObjectType() Type {
+func (tag *Tag) ObjectType() objecttype.Type {
 	_ = tag
-	return TypeTag
+	return objecttype.TypeTag
 }
--- a/object/tag_parse.go
+++ b/object/tag_parse.go
@@ -5,6 +5,7 @@
 	"errors"
 	"fmt"
 
+	"codeberg.org/lindenii/furgit/objecttype"
 	"codeberg.org/lindenii/furgit/oid"
 )
 
@@ -43,8 +44,8 @@
 			t.Target = id
 			haveTarget = true
 		case "type":
-			ty, err := ParseTypeName(string(value))
-			if err != nil {
+			ty, ok := objecttype.ParseName(string(value))
+			if !ok {
 				return nil, errors.New("object: tag: unknown target type")
 			}
 			t.TargetType = ty
--- a/object/tag_parse_test.go
+++ b/object/tag_parse_test.go
@@ -6,6 +6,7 @@
 
 	"codeberg.org/lindenii/furgit/internal/testgit"
 	"codeberg.org/lindenii/furgit/object"
+	"codeberg.org/lindenii/furgit/objecttype"
 	"codeberg.org/lindenii/furgit/oid"
 )
 
@@ -23,8 +24,8 @@
 		if tag.Target != commitID {
 			t.Fatalf("tag target mismatch: got %s want %s", tag.Target, commitID)
 		}
-		if tag.TargetType != object.TypeCommit {
-			t.Fatalf("tag target type = %v, want %v", tag.TargetType, object.TypeCommit)
+		if tag.TargetType != objecttype.TypeCommit {
+			t.Fatalf("tag target type = %v, want %v", tag.TargetType, objecttype.TypeCommit)
 		}
 		if !bytes.Equal(tag.Name, []byte("v1")) {
 			t.Fatalf("tag name = %q, want %q", tag.Name, "v1")
--- a/object/tag_serialize.go
+++ b/object/tag_serialize.go
@@ -3,6 +3,8 @@
 import (
 	"bytes"
 	"fmt"
+
+	"codeberg.org/lindenii/furgit/objecttype"
 )
 
 func (tag *Tag) serialize() ([]byte, error) {
@@ -13,8 +15,8 @@
 	var buf bytes.Buffer
 	fmt.Fprintf(&buf, "object %s\n", tag.Target.String())
 
-	tyName, err := typeName(tag.TargetType)
-	if err != nil {
+	tyName, ok := objecttype.Name(tag.TargetType)
+	if !ok {
 		return nil, fmt.Errorf("object: tag: invalid target type %d", tag.TargetType)
 	}
 	buf.WriteString("type ")
@@ -46,7 +48,7 @@
 	if err != nil {
 		return nil, err
 	}
-	header, err := headerForType(TypeTag, body)
+	header, err := headerForType(objecttype.TypeTag, body)
 	if err != nil {
 		return nil, err
 	}
--- a/object/tree.go
+++ b/object/tree.go
@@ -5,6 +5,7 @@
 	"fmt"
 	"sort"
 
+	"codeberg.org/lindenii/furgit/objecttype"
 	"codeberg.org/lindenii/furgit/oid"
 )
 
@@ -32,9 +33,9 @@
 }
 
 // ObjectType returns TypeTree.
-func (tree *Tree) ObjectType() Type {
+func (tree *Tree) ObjectType() objecttype.Type {
 	_ = tree
-	return TypeTree
+	return objecttype.TypeTree
 }
 
 // Entry looks up a tree entry by name.
--- a/object/tree_serialize.go
+++ b/object/tree_serialize.go
@@ -1,7 +1,11 @@
 package object
 
-import "strconv"
+import (
+	"strconv"
 
+	"codeberg.org/lindenii/furgit/objecttype"
+)
+
 func (tree *Tree) serialize() []byte {
 	var bodyLen int
 	for _, entry := range tree.Entries {
@@ -29,7 +33,7 @@
 // Serialize renders the raw object (header + body).
 func (tree *Tree) Serialize() ([]byte, error) {
 	body := tree.serialize()
-	header, err := headerForType(TypeTree, body)
+	header, err := headerForType(objecttype.TypeTree, body)
 	if err != nil {
 		return nil, err
 	}
--