blob: 2f69e7db2290f0d48c30315c1f77df688dfe0008 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package tasks
import (
"context"
"fmt"
gerritpb "go.chromium.org/luci/common/proto/gerrit"
"go.chromium.org/luci/server/tq"
"google.golang.org/protobuf/proto"
"infra/appengine/rubber-stamper/internal/reviewer"
"infra/appengine/rubber-stamper/internal/util"
"infra/appengine/rubber-stamper/tasks/taskspb"
)
func init() {
tq.RegisterTaskClass(tq.TaskClass{
ID: "change-review-task",
Prototype: (*taskspb.ChangeReviewTask)(nil),
Queue: "change-review-queue",
Kind: tq.NonTransactional,
Handler: func(ctx context.Context, payload proto.Message) error {
t := payload.(*taskspb.ChangeReviewTask)
if err := reviewer.ReviewChange(ctx, t); err != nil {
info := tq.TaskExecutionInfo(ctx)
if info != nil && info.ExecutionCount >= 2 {
util.SendErrorReport(ctx, fmt.Errorf("task (host %s, cl %d, revision %s) failed for at least 3 times", t.Host, t.Number, t.Revision))
}
return fmt.Errorf("failed to review change for host %s, cl %d, revision %s: %v", t.Host, t.Number, t.Revision, err.Error())
}
return nil
},
})
}
// EnqueueChangeReviewTask enqueues a change review task.
func EnqueueChangeReviewTask(ctx context.Context, host string, cl *gerritpb.ChangeInfo) error {
t := &taskspb.ChangeReviewTask{
Host: host,
Number: cl.Number,
Revision: cl.CurrentRevision,
Repo: cl.Project,
AutoSubmit: (cl.Labels["Auto-Submit"] != nil) && (cl.Labels["Auto-Submit"].Approved != nil),
RevertOf: cl.RevertOf,
CherryPickOfChange: cl.CherryPickOfChange,
RevisionsCount: int64(len(cl.Revisions)),
Created: cl.Created,
}
dedupKey := fmt.Sprintf("change(%s,%d,%s)", t.Host, t.Number, t.Revision)
return tq.AddTask(ctx, &tq.Task{
Payload: t,
Title: dedupKey,
DeduplicationKey: dedupKey,
})
}