aboutsummaryrefslogtreecommitdiff
path: root/object/object.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/object.go')
-rw-r--r--object/object.go89
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
+}