diff options
| author | 2026-02-20 21:20:35 +0800 | |
|---|---|---|
| committer | 2026-02-20 21:51:00 +0800 | |
| commit | b5a545a3d883026d61beac5556fec2a45e9ec3d3 (patch) | |
| tree | 6281f89df21cb4b63a16bbcb057c5f186c40b148 /object/object.go | |
| parent | testgit: Add test harnesses (diff) | |
| signature | No signature | |
object: Add basic object code
Diffstat (limited to 'object/object.go')
| -rw-r--r-- | object/object.go | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/object/object.go b/object/object.go new file mode 100644 index 00000000..c40769a7 --- /dev/null +++ b/object/object.go @@ -0,0 +1,89 @@ +// Package object provides Git object models and codecs. +package object + +import ( + "bytes" + "errors" + "fmt" + "strconv" +) + +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") +) + +// 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 + 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 + } + size := strconv.Itoa(len(body)) + var buf bytes.Buffer + buf.Grow(len(tyStr) + len(size) + 2) + buf.WriteString(tyStr) + buf.WriteByte(' ') + buf.WriteString(size) + buf.WriteByte(0) + return buf.Bytes(), nil +} |
