diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-31 01:14:03 +0100 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-31 01:14:03 +0100 |
commit | c6349552c1c54ea114b92ae23fc840f68f6551f4 (patch) | |
tree | 6fbaf514ae9caf8241a0b9dfc3709d60942876c5 /core/object.go | |
parent | fe1fc1aa7dca3e0f6e54ab17f0acfa45f269e58c (diff) | |
download | go-git-c6349552c1c54ea114b92ae23fc840f68f6551f4.tar.gz |
internal -> core
Diffstat (limited to 'core/object.go')
-rw-r--r-- | core/object.go | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/core/object.go b/core/object.go new file mode 100644 index 0000000..4e8a587 --- /dev/null +++ b/core/object.go @@ -0,0 +1,113 @@ +package core + +import ( + "bytes" + "io" +) + +// Object is a generic representation of any git object +type Object interface { + Type() ObjectType + SetType(ObjectType) + Size() int64 + SetSize(int64) + Hash() Hash + Reader() io.Reader + Writer() io.Writer +} + +// ObjectStorage generic storage of objects +type ObjectStorage interface { + New() Object + Set(Object) Hash + Get(Hash) (Object, bool) +} + +// ObjectType internal object type's +type ObjectType int8 + +const ( + CommitObject ObjectType = 1 + TreeObject ObjectType = 2 + BlobObject ObjectType = 3 + TagObject ObjectType = 4 + OFSDeltaObject ObjectType = 6 + REFDeltaObject ObjectType = 7 +) + +func (t ObjectType) String() string { + switch t { + case CommitObject: + return "commit" + case TreeObject: + return "tree" + case BlobObject: + return "blob" + default: + return "-" + } +} + +func (t ObjectType) Bytes() []byte { + return []byte(t.String()) +} + +type RAWObject struct { + b []byte + t ObjectType + s int64 +} + +func (o *RAWObject) Type() ObjectType { return o.t } +func (o *RAWObject) SetType(t ObjectType) { o.t = t } +func (o *RAWObject) Size() int64 { return o.s } +func (o *RAWObject) SetSize(s int64) { o.s = s } +func (o *RAWObject) Reader() io.Reader { return bytes.NewBuffer(o.b) } +func (o *RAWObject) Hash() Hash { return ComputeHash(o.t, o.b) } +func (o *RAWObject) Writer() io.Writer { return o } +func (o *RAWObject) Write(p []byte) (n int, err error) { + o.b = append(o.b, p...) + return len(p), nil +} + +type RAWObjectStorage struct { + Objects map[Hash]Object + Commits map[Hash]Object + Trees map[Hash]Object + Blobs map[Hash]Object +} + +func NewRAWObjectStorage() *RAWObjectStorage { + return &RAWObjectStorage{ + Objects: make(map[Hash]Object, 0), + Commits: make(map[Hash]Object, 0), + Trees: make(map[Hash]Object, 0), + Blobs: make(map[Hash]Object, 0), + } +} + +func (o *RAWObjectStorage) New() Object { + return &RAWObject{} +} + +func (o *RAWObjectStorage) Set(obj Object) Hash { + h := obj.Hash() + o.Objects[h] = obj + + switch obj.Type() { + case CommitObject: + o.Commits[h] = o.Objects[h] + case TreeObject: + o.Trees[h] = o.Objects[h] + case BlobObject: + o.Blobs[h] = o.Objects[h] + } + + return h +} + +func (o *RAWObjectStorage) Get(h Hash) (Object, bool) { + obj, ok := o.Objects[h] + + return obj, ok +} |