Documentation ¶
Overview ¶
Package packfile implements a encoder/decoder of packfile format
Index ¶
- Constants
- Variables
- func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) error
- func DiffDelta(baseBuf []byte, targetBuf []byte) []byte
- func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, error)
- func PatchDelta(src, delta []byte) []byte
- type Decoder
- func (d *Decoder) CRCs() map[plumbing.Hash]uint32
- func (d *Decoder) Close() error
- func (d *Decoder) Decode() (checksum plumbing.Hash, err error)
- func (d *Decoder) DecodeObject() (plumbing.EncodedObject, error)
- func (d *Decoder) DecodeObjectAt(offset int64) (plumbing.EncodedObject, error)
- func (d *Decoder) Offsets() map[plumbing.Hash]int64
- func (d *Decoder) SetOffsets(offsets map[plumbing.Hash]int64)
- type Encoder
- type Error
- type Format
- type ObjectHeader
- type ObjectToPack
- type Scanner
- func (s *Scanner) Checksum() (plumbing.Hash, error)
- func (s *Scanner) Close() error
- func (s *Scanner) Header() (version, objects uint32, err error)
- func (s *Scanner) NextObject(w io.Writer) (written int64, crc32 uint32, err error)
- func (s *Scanner) NextObjectHeader() (*ObjectHeader, error)
- func (s *Scanner) Seek(offset int64) (previous int64, err error)
Constants ¶
const ( // VersionSupported is the packfile version supported by this package VersionSupported uint32 = 2 )
Variables ¶
var ( // ErrMaxObjectsLimitReached is returned by Decode when the number // of objects in the packfile is higher than // Decoder.MaxObjectsLimit. ErrMaxObjectsLimitReached = NewError("max. objects limit reached") // ErrInvalidObject is returned by Decode when an invalid object is // found in the packfile. ErrInvalidObject = NewError("invalid git object") // ErrPackEntryNotFound is returned by Decode when a reference in // the packfile references and unknown object. ErrPackEntryNotFound = NewError("can't find a pack entry") // ErrZLib is returned by Decode when there was an error unzipping // the packfile contents. ErrZLib = NewError("zlib reading error") // ErrCannotRecall is returned by RecallByOffset or RecallByHash if the object // to recall cannot be returned. ErrCannotRecall = NewError("cannot recall object") // ErrResolveDeltasNotSupported is returned if a NewDecoder is used with a // non-seekable scanner and without a plumbing.ObjectStorage ErrResolveDeltasNotSupported = NewError("resolve delta is not supported") // ErrNonSeekable is returned if a ReadObjectAt method is called without a // seekable scanner ErrNonSeekable = NewError("non-seekable scanner") // ErrRollback error making Rollback over a transaction after an error ErrRollback = NewError("rollback error, during set error") // ErrAlreadyDecoded is returned if NewDecoder is called for a second time ErrAlreadyDecoded = NewError("packfile was already decoded") )
var ( // ErrEmptyPackfile is returned by ReadHeader when no data is found in the packfile ErrEmptyPackfile = NewError("empty packfile") // ErrBadSignature is returned by ReadHeader when the signature in the packfile is incorrect. ErrBadSignature = NewError("malformed pack file signature") // ErrUnsupportedVersion is returned by ReadHeader when the packfile version is // different than VersionSupported. ErrUnsupportedVersion = NewError("unsupported packfile version") // ErrSeekNotSupported returned if seek is not support ErrSeekNotSupported = NewError("not seek support") )
Functions ¶
func ApplyDelta ¶
func ApplyDelta(target, base plumbing.EncodedObject, delta []byte) error
ApplyDelta writes to taget the result of applying the modification deltas in delta to base.
func GetDelta ¶
func GetDelta(base, target plumbing.EncodedObject) (plumbing.EncodedObject, error)
GetDelta returns an offset delta that knows the way of how to transform base object to target object
func PatchDelta ¶
PatchDelta returns the result of applying the modification deltas in delta to src.
Types ¶
type Decoder ¶
type Decoder struct {
// contains filtered or unexported fields
}
Decoder reads and decodes packfiles from an input Scanner, if an ObjectStorer was provided the decoded objects are store there. If not the decode object is destroyed. The Offsets and CRCs are calculated independand if the an ObjectStorer was provided or not.
func NewDecoder ¶
func NewDecoder(s *Scanner, o storer.EncodedObjectStorer) (*Decoder, error)
NewDecoder returns a new Decoder that decodes a Packfile using the given s and store the objects in the provided o. ObjectStorer can be nil, in this case the objects are not stored but objects offsets on the Packfile and the CRCs are calculated.
If ObjectStorer is nil and the Scanner is not Seekable, ErrNonSeekable is returned.
If the ObjectStorer implements storer.Transactioner, a transaction is created during the Decode execution, if something fails the Rollback is called
func (*Decoder) CRCs ¶
CRCs returns the CRC-32 for each objected read,Decode method should be called before to calculate the CRCs
func (*Decoder) Close ¶
Close close the Scanner, usually this mean that the whole reader is read and discarded
func (*Decoder) Decode ¶
Decode reads a packfile and stores it in the value pointed to by s. The offsets and the CRCs are calculated by this method
func (*Decoder) DecodeObject ¶
func (d *Decoder) DecodeObject() (plumbing.EncodedObject, error)
DecodeObject reads the next object from the scanner and returns it. This method can be used in replacement of the Decode method, to work in a interative way
func (*Decoder) DecodeObjectAt ¶
func (d *Decoder) DecodeObjectAt(offset int64) (plumbing.EncodedObject, error)
DecodeObjectAt reads an object at the given location, if Decode wasn't called previously objects offset should provided using the SetOffsets method
type Encoder ¶
type Encoder struct {
// contains filtered or unexported fields
}
Encoder gets the data from the storage and write it into the writer in PACK format
func NewEncoder ¶
NewEncoder creates a new packfile encoder using a specific Writer and ObjectStorer
type Error ¶
type Error struct {
// contains filtered or unexported fields
}
Error specifies errors returned during packfile parsing.
func (*Error) AddDetails ¶
AddDetails adds details to an error, with additional text.
type ObjectHeader ¶
type ObjectHeader struct { Type plumbing.ObjectType Offset int64 Length int64 Reference plumbing.Hash OffsetReference int64 }
ObjectHeader contains the information related to the object, this information is collected from the previous bytes to the content of the object.
type ObjectToPack ¶
type ObjectToPack struct { // The main object to pack, it could be any object, including deltas Object plumbing.EncodedObject // Base is the object that a delta is based on (it could be also another delta). // If the main object is not a delta, Base will be null Base *ObjectToPack // Original is the object that we can generate applying the delta to // Base, or the same object as EncodedObject in the case of a non-delta // object. Original plumbing.EncodedObject // Depth is the amount of deltas needed to resolve to obtain Original // (delta based on delta based on ...) Depth int }
ObjectToPack is a representation of an object that is going to be into a pack file.
func (*ObjectToPack) IsDelta ¶
func (o *ObjectToPack) IsDelta() bool
func (*ObjectToPack) SetDelta ¶
func (o *ObjectToPack) SetDelta(base *ObjectToPack, delta plumbing.EncodedObject)
type Scanner ¶
type Scanner struct { // lsSeekable says if this scanner can do Seek or not, to have a Scanner // seekable a r implementing io.Seeker is required IsSeekable bool // contains filtered or unexported fields }
func NewScanner ¶
NewScanner returns a new Scanner based on a reader, if the given reader implements io.ReadSeeker the Scanner will be also Seekable
func (*Scanner) Header ¶
Header reads the whole packfile header (signature, version and object count). It returns the version and the object count and performs checks on the validity of the signature and the version fields.
func (*Scanner) NextObject ¶
NextObject writes the content of the next object into the reader, returns the number of bytes written, the CRC32 of the content and an error, if any
func (*Scanner) NextObjectHeader ¶
func (s *Scanner) NextObjectHeader() (*ObjectHeader, error)
NextObjectHeader returns the ObjectHeader for the next object in the reader