Fast implementation of Git in pure Go
at master 55 lines 1.2 kB view raw
1package object 2 3import ( 4 "errors" 5 "strconv" 6 7 "codeberg.org/lindenii/furgit/objectheader" 8 "codeberg.org/lindenii/furgit/objecttype" 9) 10 11// SerializeWithoutHeader renders the raw tree body bytes. 12func (tree *Tree) SerializeWithoutHeader() ([]byte, error) { 13 var bodyLen int 14 15 for _, entry := range tree.Entries { 16 mode := strconv.FormatUint(uint64(entry.Mode), 8) 17 bodyLen += len(mode) + 1 + len(entry.Name) + 1 + entry.ID.Size() 18 } 19 20 body := make([]byte, bodyLen) 21 pos := 0 22 23 for _, entry := range tree.Entries { 24 mode := strconv.FormatUint(uint64(entry.Mode), 8) 25 pos += copy(body[pos:], mode) 26 body[pos] = ' ' 27 pos++ 28 pos += copy(body[pos:], entry.Name) 29 body[pos] = 0 30 pos++ 31 id := entry.ID.Bytes() 32 pos += copy(body[pos:], id) 33 } 34 35 return body, nil 36} 37 38// SerializeWithHeader renders the raw object (header + body). 39func (tree *Tree) SerializeWithHeader() ([]byte, error) { 40 body, err := tree.SerializeWithoutHeader() 41 if err != nil { 42 return nil, err 43 } 44 45 header, ok := objectheader.Encode(objecttype.TypeTree, int64(len(body))) 46 if !ok { 47 return nil, errors.New("object: tree: failed to encode object header") 48 } 49 50 raw := make([]byte, len(header)+len(body)) 51 copy(raw, header) 52 copy(raw[len(header):], body) 53 54 return raw, nil 55}