blob: 4cf0b40a8157094f5c9fb7522d82d39f9658f70a [file] [log] [blame]
package gerritsource
import (
"context"
"strings"
"github.com/spf13/viper"
"go.skia.org/infra/go/gerrit"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/hashtag/go/source"
)
// gerritSource implements source.Source.
type gerritSource struct {
g *gerrit.Gerrit
terms []*gerrit.SearchTerm
}
// New returns a new Source.
func New() (source.Source, error) {
c := httputils.DefaultClientConfig().With2xxOnly().Client()
g, err := gerrit.NewGerrit(viper.GetString("sources.gerrit.url"), "", c)
if err != nil {
return nil, skerr.Wrapf(err, "Failed to create gerrit instance")
}
terms := []*gerrit.SearchTerm{}
for _, filter := range viper.GetStringSlice("sources.gerrit.filters") {
parts := strings.SplitN(filter, ":", 2)
if len(parts) != 2 {
return nil, skerr.Fmt("All Gerrit filters must start with an operator, e.g. 'owner:'.")
}
terms = append(terms, &gerrit.SearchTerm{
Key: parts[0],
Value: parts[1],
})
}
return &gerritSource{
g: g,
terms: terms,
}, err
}
// See source.Source.
func (g *gerritSource) ByHashtag(hashtag string) <-chan source.Artifact {
ret := make(chan source.Artifact)
go func() {
defer close(ret)
terms := []*gerrit.SearchTerm{
{
Key: "message",
Value: hashtag,
},
}
terms = append(terms, g.terms...)
changes, err := g.g.Search(context.Background(), gerrit.MAX_GERRIT_LIMIT, terms...)
if err != nil {
sklog.Errorf("Failed to build Gerrit search: %s", err)
return
}
for _, c := range changes {
ret <- source.Artifact{
Title: c.Subject,
URL: g.g.Url(c.Issue),
LastModified: c.Updated,
}
}
}()
return ret
}
// See source.Source.
func (g *gerritSource) ByUser(string) <-chan source.Artifact {
ret := make(chan source.Artifact)
close(ret)
return ret
}