blob: 5cb7fde9388a2f7d2794783f8e0d73858df34fa9 [file] [log] [blame]
package gerrit_steps
/*
Package gerrit_steps provides Task Driver steps used for interacting
with the Gerrit API.
*/
import (
"context"
"fmt"
"path"
"strings"
"go.skia.org/infra/go/gerrit"
"go.skia.org/infra/go/git"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/task_driver/go/lib/git_steps"
"go.skia.org/infra/task_driver/go/lib/os_steps"
"go.skia.org/infra/task_driver/go/td"
)
// Init creates and returns an authenticated GerritInterface, or any error
// which occurred.
func Init(ctx context.Context, local bool, gerritUrl string) (gerrit.GerritInterface, error) {
ts, err := git_steps.Init(ctx, local)
if err != nil {
return nil, err
}
var rv gerrit.GerritInterface
err = td.Do(ctx, td.Props("Gerrit Init").Infra(), func(ctx context.Context) error {
client := httputils.DefaultClientConfig().WithTokenSource(ts).Client()
g, err := gerrit.NewGerrit(gerritUrl, td.HttpClient(ctx, client))
rv = g
return err
})
return rv, err
}
// UploadCL uploads a CL containing any changes to the given git.Checkout. This
// is a no-op if there are no changes.
func UploadCL(ctx context.Context, g gerrit.GerritInterface, co *git.Checkout, project, branch, baseRevision, commitMsg string, reviewers []string, isTryJob bool) error {
diff, err := co.Git(ctx, "diff", "--name-only")
if err != nil {
return err
}
diff = strings.TrimSpace(diff)
modFiles := strings.Split(diff, "\n")
if len(modFiles) > 0 && diff != "" {
if err := td.Do(ctx, td.Props("Upload CL").Infra(), func(ctx context.Context) error {
ci, err := gerrit.CreateAndEditChange(ctx, g, project, branch, commitMsg, baseRevision, func(ctx context.Context, g gerrit.GerritInterface, ci *gerrit.ChangeInfo) error {
for _, f := range modFiles {
contents, err := os_steps.ReadFile(ctx, path.Join(co.Dir(), f))
if err != nil {
return err
}
if err := g.EditFile(ctx, ci, f, string(contents)); err != nil {
return err
}
}
return nil
})
if err != nil {
return err
}
var labels map[string]int
if !isTryJob {
labels = map[string]int{
gerrit.LabelCodeReview: gerrit.LabelCodeReviewApprove,
gerrit.LabelCommitQueue: gerrit.LabelCommitQueueSubmit,
}
}
if err := g.SetReview(ctx, ci, "Ready for review.", labels, reviewers); err != nil {
return err
}
return nil
}); err != nil {
return err
}
}
return nil
}
// GetIssueProperties is a wrapper around GerritInterface.GetIssueProperties.
func GetIssueProperties(ctx context.Context, g gerrit.GerritInterface, issue int64) (*gerrit.ChangeInfo, error) {
var rv *gerrit.ChangeInfo
return rv, td.Do(ctx, td.Props(fmt.Sprintf("Get Issue %d", issue)).Infra(), func(ctx context.Context) error {
var err error
rv, err = g.GetIssueProperties(ctx, issue)
return err
})
}