| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | // Copyright 2014 The Gogs Authors. All rights reserved.// Use of this source code is governed by a MIT-style// license that can be found in the LICENSE file.package gitimport (	"bytes")// Tag represents a Git tag.type Tag struct {	Name       string	Id         sha1	repo       *Repository	Object     sha1 // The id of this commit object	Type       string	Tagger     *Signature	TagMessage string}func (tag *Tag) Commit() (*Commit, error) {	return tag.repo.getCommit(tag.Object)}// Parse commit information from the (uncompressed) raw// data from the commit object.// \n\n separate headers from messagefunc parseTagData(data []byte) (*Tag, error) {	tag := new(Tag)	// we now have the contents of the commit object. Let's investigate...	nextline := 0l:	for {		eol := bytes.IndexByte(data[nextline:], '\n')		switch {		case eol > 0:			line := data[nextline : nextline+eol]			spacepos := bytes.IndexByte(line, ' ')			reftype := line[:spacepos]			switch string(reftype) {			case "object":				id, err := NewIdFromString(string(line[spacepos+1:]))				if err != nil {					return nil, err				}				tag.Object = id			case "type":				// A commit can have one or more parents				tag.Type = string(line[spacepos+1:])			case "tagger":				sig, err := newSignatureFromCommitline(line[spacepos+1:])				if err != nil {					return nil, err				}				tag.Tagger = sig			}			nextline += eol + 1		case eol == 0:			tag.TagMessage = string(data[nextline+1:])			break l		default:			break l		}	}	return tag, nil}
 |