Documentation ¶
Index ¶
- Constants
- func InflateZlib(r *io.SectionReader, len int) (bs []byte, err error)
- func IsMsbSet(b byte) bool
- func ParseCopyOrInsert(r io.Reader) (stype int, offset, length int64, err error)
- func ParsePackHeader(pack *io.SectionReader) (version, objectCount uint32, err error)
- func ParseVarLen(r io.Reader) (len int64, err error)
- func PatchDelta(base io.ReaderAt, delta io.Reader, target io.ReadWriter) (err error)
- func ReadOneByte(r io.Reader) (b byte, err error)
- type Conn
- type Delta
- type ObjType
- type Object
- type ObjectStore
- type PackReader
- type Ref
- type Refs
- type Repo
- func (repo *Repo) CreateLocalRefs(name string, ref Ref) (err error)
- func (repo *Repo) Distruct()
- func (repo *Repo) FetchPack(sideBandHandle func(dataType byte, data []byte), ...) (err error)
- func (repo *Repo) GetRepoFilePath(dir, fname string) string
- func (repo *Repo) GetTmpPackFile() (*os.File, error)
- func (repo *Repo) RefDiscover() (refs Refs, capabilities []string, err error)
- func (repo *Repo) SaveLooseObjects(f *os.File) (err error)
- func (repo *Repo) SaveObject(obj *Object) (err error)
- func (repo *Repo) SendCmd(cmds ...string) (err error)
- func (repo *Repo) SendWantList(ids ...string) (err error)
- type URL
Constants ¶
const ( FLUSH_PKT = "0000" PKT_SP = " " PKT_LR = "\n" PROGRESS_FRAME = '\x02' DATA_FRAME = '\x01' ERROR_FRAME = '\x03' )
Variables ¶
This section is empty.
Functions ¶
func InflateZlib ¶
func InflateZlib(r *io.SectionReader, len int) (bs []byte, err error)
InflateZlib unbuffered io
func ParseCopyOrInsert ¶
ParseCopyOrInsert parse copy or insert section info from delta reader
func ParsePackHeader ¶
func ParsePackHeader(pack *io.SectionReader) (version, objectCount uint32, err error)
ParsePackHeader A header appears at the beginning and consists of the following:
4-byte signature: The signature is: {'P', 'A', 'C', 'K'} 4-byte version number (network byte order): Git currently accepts version number 2 or 3 but generates version 2 only. 4-byte number of objects contained in the pack (network byte order) Observation: we cannot have more than 4G versions ;-) and more than 4G objects in a pack.
func ParseVarLen ¶
ParseVarLen parse variable-length integers
func PatchDelta ¶
PatchDelta recover real object data
Types ¶
type Conn ¶
Conn handle git connection(ssh or git or http)
func (*Conn) ReadPktLine ¶
ReadPktLine read pktline from conn
func (*Conn) WriteEndPktLine ¶
WriteEndPktLine write end pkt line
func (*Conn) WriteMultiPktLine ¶
WriteMultiPktLine write multi pktline co conn
type ObjType ¶
type ObjType int8
ObjType represent a git object type
type Object ¶
type Object struct { ID string //SHA-1 40 char Type ObjType //commit, blob, tree, tag Content []byte //content Base interface{} //hashid or offset(string or int) }
Object git internal man
func NewObject ¶
NewObject create object if it is a delta object, we will delating it to real content
func (*Object) DeflateZlib ¶
DeflateZlib deflat the object to bytes
func (*Object) FlushID ¶
FlushID flush object id please call it when change object content or object type
func (*Object) GetStoreHeader ¶
GetStoreHeader create a object store header
type ObjectStore ¶
type ObjectStore struct { List []*Object // contains filtered or unexported fields }
func (*ObjectStore) AddObject ¶
func (objStore *ObjectStore) AddObject(obj *Object, offset int64) (err error)
AddObject add object to pack object list
func (*ObjectStore) FindByHash ¶
func (objStore *ObjectStore) FindByHash(hash string) (obj *Object)
FindByHash find object by hash id
func (*ObjectStore) FindByOffset ¶
func (objStore *ObjectStore) FindByOffset(offset int64) (obj *Object)
FindByOffset find object by offset
type PackReader ¶
type PackReader struct { *io.SectionReader Version, ObjCount uint32 ObjStore *ObjectStore // contains filtered or unexported fields }
PackReader a struct
func NewPackReader ¶
func NewPackReader(r io.ReaderAt, size int64) (*PackReader, error)
NewPackReader create a pack reader
func (*PackReader) ParseObjectEntry ¶
func (pack *PackReader) ParseObjectEntry() (obj *Object, offset int64, err error)
ParseObjectEntry parse object from pack reader
(undeltified representation) n-byte type and length (3-bit type, (n-1)*7+4-bit length) compressed data (deltified representation) n-byte type and length (3-bit type, (n-1)*7+4-bit length) 20-byte base object name if OBJ_REF_DELTA or a negative relative offset from the delta object's position in the pack if this is an OBJ_OFS_DELTA object compressed delta data
func (*PackReader) ParseObjects ¶
func (pack *PackReader) ParseObjects(f func(object *Object) error) (err error)
ParseObjects translate all object in pack reader
type Ref ¶
type Ref struct { Name string Object //i think it is a commit object Child Object //contain some info for this ref }
Ref is a human name for a commit
type Repo ¶
Repo git repo instance
func (*Repo) CreateLocalRefs ¶
CreateLocalRefs save ref to local disk
func (*Repo) FetchPack ¶
func (repo *Repo) FetchPack( sideBandHandle func(dataType byte, data []byte), refHandle func(name string, ref Ref) (err error), ) (err error)
FetchPack negotionate with remote server send want list and parse pack file to objects sideBandHandle func(dataType byte, data []byte)
func (*Repo) GetRepoFilePath ¶
GetRepoFilePath get repo file path with current repo path
func (*Repo) GetTmpPackFile ¶
GetTmpPackFile return clone temp pack file E.g. in native git this is something like .git/objects/pack/tmp_pack_6bo2La
func (*Repo) RefDiscover ¶
RefDiscover just get refs from server
func (*Repo) SaveLooseObjects ¶
SaveLooseObjects directly use pack file to recover objects
func (*Repo) SaveObject ¶
SaveObject save object on disk
func (*Repo) SendWantList ¶
SendWantList telling the server what objects it wants and what objects it has, so the server can make a packfile that only contains the objects that the client needs. The client will also send a list of the capabilities it wants to be in effect, out of what the server said it could do with the first 'want' line. ----
upload-request = want-list have-list compute-end want-list = first-want *additional-want flush-pkt first-want = PKT-LINE("want" SP obj-id SP capability-list LF) additional-want = PKT-LINE("want" SP obj-id LF) have-list = *have-line have-line = PKT-LINE("have" SP obj-id LF) compute-end = flush-pkt / PKT-LINE("done")
----