1
// Copyright 2015 The Gogs Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
10
"code.gitea.io/gitea/modules/util"
13
// Tag represents a Git tag.
17
Object ObjectID // The id of this commit object
21
Signature *CommitSignature
24
// Commit return the commit of the tag reference
25
func (tag *Tag) Commit(gitRepo *Repository) (*Commit, error) {
26
return gitRepo.getCommit(tag.Object)
29
func parsePayloadSignature(data []byte, messageStart int) (payload, msg, sign string) {
31
signStart, signEnd := -1, -1
33
eol := bytes.IndexByte(data[pos:], '\n')
37
line := data[pos : pos+eol]
38
signType, hasPrefix := bytes.CutPrefix(line, []byte("-----BEGIN "))
39
signType, hasSuffix := bytes.CutSuffix(signType, []byte(" SIGNATURE-----"))
40
if hasPrefix && hasSuffix {
41
signEndBytes := append([]byte("\n-----END "), signType...)
42
signEndBytes = append(signEndBytes, []byte(" SIGNATURE-----")...)
43
signEnd = bytes.Index(data[pos:], signEndBytes)
46
signEnd = pos + signEnd + len(signEndBytes)
52
if signStart != -1 && signEnd != -1 {
53
msgEnd := max(messageStart, signStart-1)
54
return string(data[:msgEnd]), string(data[messageStart:msgEnd]), string(data[signStart:signEnd])
56
return string(data), string(data[messageStart:]), ""
59
// Parse commit information from the (uncompressed) raw
60
// data from the commit object.
61
// \n\n separate headers from message
62
func parseTagData(objectFormat ObjectFormat, data []byte) (*Tag, error) {
64
tag.ID = objectFormat.EmptyObjectID()
65
tag.Object = objectFormat.EmptyObjectID()
66
tag.Tagger = &Signature{}
70
eol := bytes.IndexByte(data[pos:], '\n')
72
break // shouldn't happen, but could just tolerate it
76
break // end of headers
78
line := data[pos : pos+eol]
79
key, val, _ := bytes.Cut(line, []byte(" "))
82
id, err := NewIDFromString(string(val))
88
tag.Type = string(val) // A commit can have one or more parents
90
tag.Tagger = parseSignatureFromCommitLine(util.UnsafeBytesToString(val))
94
payload, msg, sign := parsePayloadSignature(data, pos)
97
tag.Signature = &CommitSignature{Signature: sign, Payload: payload}
104
func (ts tagSorter) Len() int {
105
return len([]*Tag(ts))
108
func (ts tagSorter) Less(i, j int) bool {
109
return []*Tag(ts)[i].Tagger.When.After([]*Tag(ts)[j].Tagger.When)
112
func (ts tagSorter) Swap(i, j int) {
113
[]*Tag(ts)[i], []*Tag(ts)[j] = []*Tag(ts)[j], []*Tag(ts)[i]
117
func sortTagsByTime(tags []*Tag) {
118
sorter := tagSorter(tags)