diff options
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 +} |
