// Header reads the type and the size of object, and prepares the reader for read func (r *Reader) Header() (t plumbing.ObjectType, size int64, err error) { var raw []byte raw, err = r.readUntil(' ') if err != nil { return } t, err = plumbing.ParseObjectType(string(raw)) if err != nil { return } raw, err = r.readUntil(0) if err != nil { return } size, err = strconv.ParseInt(string(raw), 10, 64) if err != nil { err = ErrHeader return } defer r.prepareForRead(t, size) return }
// Decode transforms a plumbing.EncodedObject into a Tag struct. func (t *Tag) Decode(o plumbing.EncodedObject) (err error) { if o.Type() != plumbing.TagObject { return ErrUnsupportedObject } t.Hash = o.Hash() reader, err := o.Reader() if err != nil { return err } defer ioutil.CheckClose(reader, &err) r := bufio.NewReader(reader) for { line, err := r.ReadSlice('\n') if err != nil && err != io.EOF { return err } line = bytes.TrimSpace(line) if len(line) == 0 { break // Start of message } split := bytes.SplitN(line, []byte{' '}, 2) switch string(split[0]) { case "object": t.Target = plumbing.NewHash(string(split[1])) case "type": t.TargetType, err = plumbing.ParseObjectType(string(split[1])) if err != nil { return err } case "tag": t.Name = string(split[1]) case "tagger": t.Tagger.Decode(split[1]) } if err == io.EOF { return nil } } data, err := stdioutil.ReadAll(r) if err != nil { return err } t.Message = string(data) return nil }