| // package plumbing implement the core interfaces and structs used by go-git |
| package plumbing |
| |
| import ( |
| "errors" |
| "io" |
| ) |
| |
| var ( |
| ErrObjectNotFound = errors.New("object not found") |
| // ErrInvalidType is returned when an invalid object type is provided. |
| ErrInvalidType = errors.New("invalid object type") |
| ) |
| |
| // Object is a generic representation of any git object |
| type EncodedObject interface { |
| Hash() Hash |
| Type() ObjectType |
| SetType(ObjectType) |
| Size() int64 |
| SetSize(int64) |
| Reader() (io.ReadCloser, error) |
| Writer() (io.WriteCloser, error) |
| } |
| |
| // DeltaObject is an EncodedObject representing a delta. |
| type DeltaObject interface { |
| EncodedObject |
| // BaseHash returns the hash of the object used as base for this delta. |
| BaseHash() Hash |
| // ActualHash returns the hash of the object after applying the delta. |
| ActualHash() Hash |
| // Size returns the size of the object after applying the delta. |
| ActualSize() int64 |
| } |
| |
| // ObjectType internal object type |
| // Integer values from 0 to 7 map to those exposed by git. |
| // AnyObject is used to represent any from 0 to 7. |
| type ObjectType int8 |
| |
| const ( |
| InvalidObject ObjectType = 0 |
| CommitObject ObjectType = 1 |
| TreeObject ObjectType = 2 |
| BlobObject ObjectType = 3 |
| TagObject ObjectType = 4 |
| // 5 reserved for future expansion |
| OFSDeltaObject ObjectType = 6 |
| REFDeltaObject ObjectType = 7 |
| |
| AnyObject ObjectType = -127 |
| ) |
| |
| func (t ObjectType) String() string { |
| switch t { |
| case CommitObject: |
| return "commit" |
| case TreeObject: |
| return "tree" |
| case BlobObject: |
| return "blob" |
| case TagObject: |
| return "tag" |
| case OFSDeltaObject: |
| return "ofs-delta" |
| case REFDeltaObject: |
| return "ref-delta" |
| case AnyObject: |
| return "any" |
| default: |
| return "unknown" |
| } |
| } |
| |
| func (t ObjectType) Bytes() []byte { |
| return []byte(t.String()) |
| } |
| |
| // Valid returns true if t is a valid ObjectType. |
| func (t ObjectType) Valid() bool { |
| return t >= CommitObject && t <= REFDeltaObject |
| } |
| |
| // IsDelta returns true for any ObjectTyoe that represents a delta (i.e. |
| // REFDeltaObject or OFSDeltaObject). |
| func (t ObjectType) IsDelta() bool { |
| return t == REFDeltaObject || t == OFSDeltaObject |
| } |
| |
| // ParseObjectType parses a string representation of ObjectType. It returns an |
| // error on parse failure. |
| func ParseObjectType(value string) (typ ObjectType, err error) { |
| switch value { |
| case "commit": |
| typ = CommitObject |
| case "tree": |
| typ = TreeObject |
| case "blob": |
| typ = BlobObject |
| case "tag": |
| typ = TagObject |
| case "ofs-delta": |
| typ = OFSDeltaObject |
| case "ref-delta": |
| typ = REFDeltaObject |
| default: |
| err = ErrInvalidType |
| } |
| return |
| } |