tvl-depot/gerrit/changeset.go
Florian Klink 04a24a0c60 Use Runner
This revamps code quite a bit. Series handling has been moved into the
gerrit client, it also handles caching.

The Runner logic itself has been greatly simplified.

The runner logic has been moved into the runner.go, submitqueue.go is
gone.

The "per-run result object" concept has been dropped - we instead just
use annotated logs.

Also, we switched to apex/log
2019-12-02 10:00:32 +01:00

116 lines
3.3 KiB
Go

package gerrit
import (
"bytes"
"fmt"
goGerrit "github.com/andygrunwald/go-gerrit"
"github.com/apex/log"
)
// Changeset represents a single changeset
// Relationships between different changesets are described in Series
type Changeset struct {
changeInfo *goGerrit.ChangeInfo
ChangeID string
Number int
Verified int
CodeReviewed int
HashTags []string
CommitID string
ParentCommitIDs []string
OwnerName string
Subject string
}
// MakeChangeset creates a new Changeset object out of a goGerrit.ChangeInfo object
func MakeChangeset(changeInfo *goGerrit.ChangeInfo) *Changeset {
return &Changeset{
changeInfo: changeInfo,
ChangeID: changeInfo.ChangeID,
Number: changeInfo.Number,
Verified: labelInfoToInt(changeInfo.Labels["Verified"]),
CodeReviewed: labelInfoToInt(changeInfo.Labels["Code-Review"]),
HashTags: changeInfo.Hashtags,
CommitID: changeInfo.CurrentRevision, // yes, this IS the commit ID.
ParentCommitIDs: getParentCommitIDs(changeInfo),
OwnerName: changeInfo.Owner.Name,
Subject: changeInfo.Subject,
}
}
// HasTag returns true if a Changeset has the given tag.
func (c *Changeset) HasTag(tag string) bool {
hashTags := c.HashTags
for _, hashTag := range hashTags {
if hashTag == tag {
return true
}
}
return false
}
// IsVerified returns true if the changeset passed CI,
// that's when somebody left the Approved (+1) on the "Verified" label
func (c *Changeset) IsVerified() bool {
return c.Verified == 1
}
// IsCodeReviewed returns true if the changeset passed code review,
// that's when somebody left the Recommended (+2) on the "Code-Review" label
func (c *Changeset) IsCodeReviewed() bool {
return c.CodeReviewed == 2
}
func (c *Changeset) String() string {
var b bytes.Buffer
b.WriteString("Changeset")
b.WriteString(fmt.Sprintf("(commitID: %.7s, author: %s, subject: %s)", c.CommitID, c.OwnerName, c.Subject))
return b.String()
}
// FilterChangesets filters a list of Changeset by a given filter function
func FilterChangesets(changesets []*Changeset, f func(*Changeset) bool) []*Changeset {
newChangesets := make([]*Changeset, 0)
for _, changeset := range changesets {
if f(changeset) {
newChangesets = append(newChangesets, changeset)
} else {
log.WithField("changeset", changeset.String()).Debug("dropped by filter")
}
}
return newChangesets
}
// labelInfoToInt converts a goGerrit.LabelInfo to -2…+2 int
func labelInfoToInt(labelInfo goGerrit.LabelInfo) int {
if labelInfo.Recommended.AccountID != 0 {
return 2
}
if labelInfo.Approved.AccountID != 0 {
return 1
}
if labelInfo.Disliked.AccountID != 0 {
return -1
}
if labelInfo.Rejected.AccountID != 0 {
return -2
}
return 0
}
// getParentCommitIDs returns the parent commit IDs of the goGerrit.ChangeInfo
// There is usually only one parent commit ID, except for merge commits.
func getParentCommitIDs(changeInfo *goGerrit.ChangeInfo) []string {
// obtain the RevisionInfo object
revisionInfo := changeInfo.Revisions[changeInfo.CurrentRevision]
// obtain the Commit object
commit := revisionInfo.Commit
commitIDs := make([]string, len(commit.Parents))
for i, commit := range commit.Parents {
commitIDs[i] = commit.Commit
}
return commitIDs
}