mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-04 10:30:19 -05:00
112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
|
// 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
|
||
|
}
|