func NewCommit(b []byte) (*Commit, error) { o := &Commit{hash: commons.GitHash("commit", b)} lines := bytes.Split(b, []byte{'\n'}) for i := range lines { if len(lines[i]) > 0 { var err error split := bytes.SplitN(lines[i], []byte{' '}, 2) switch string(split[0]) { case "tree": o.Tree = make([]byte, 20) _, err = hex.Decode(o.Tree, split[1]) case "parent": h := make([]byte, 20) _, err = hex.Decode(h, split[1]) if err == nil { o.Parents = append(o.Parents, h) } case "author": o.Author = NewSignature(split[1]) case "committer": o.Committer = NewSignature(split[1]) } if err != nil { return nil, err } } else { o.Message = string(bytes.Join(append(lines[i+1:]), []byte{'\n'})) break } } return o, nil }
func NewTree(body []byte) (*Tree, error) { o := &Tree{hash: commons.GitHash("tree", body)} if len(body) == 0 { return o, nil } for { split := bytes.SplitN(body, []byte{0}, 2) split1 := bytes.SplitN(split[0], []byte{' '}, 2) o.Entries = append(o.Entries, TreeEntry{ Name: string(split1[1]), Hash: fmt.Sprintf("%x", split[1][0:20]), }) body = split[1][20:] if len(split[1]) == 20 { break } } return o, nil }
func NewBlob(b []byte) (*Blob, error) { return &Blob{Len: len(b), hash: commons.GitHash("blob", b)}, nil }