about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-12-09T10·49+0300
committerVincent Ambo <mail@tazj.in>2021-12-09T10·49+0300
commit24f5a642af3aa1627bbff977f0a101907a02c69f (patch)
treef1c0a6607ec9fdcdf03091fe5fbc5dabc5536a47
parentc67b3ba7ea769cd747ea2f43ee6d12943d599ae0 (diff)
gerrit: Use a Gerrit label instead of hashtag for autosubmit
This moves to using a Gerrit label ('Autosubmit') with boolean values
for determining whether a developer wants to have a change
automatically submitted.

See also https://cl.tvl.fyi/c/depot/+/4172
-rw-r--r--README.md2
-rw-r--r--gerrit/changeset.go20
-rw-r--r--gerrit/client.go16
-rw-r--r--main.go11
-rw-r--r--submitqueue/runner.go12
5 files changed, 17 insertions, 44 deletions
diff --git a/README.md b/README.md
index d021fd025c..9ffb81b8d2 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ await CI feedback on a rebased changeset, then one clicks submit, and
 effectively makes everybody else rebase again. `gerrit-queue` is meant to
 remove these races to master.
 
-Developers can add a specific tag `submit_me` to all changesets in a series,
+Developers can set the `Autosubmit` label to `+1` on all changesets in a series,
 and if all preconditions on are met ("submittable" in gerrit speech, this
 usually means passing CI and passing Code Review), `gerrit-queue` takes care of
 rebasing and submitting it to master
diff --git a/gerrit/changeset.go b/gerrit/changeset.go
index 0a0a607cd6..f71032a567 100644
--- a/gerrit/changeset.go
+++ b/gerrit/changeset.go
@@ -16,8 +16,8 @@ type Changeset struct {
 	Number          int
 	Verified        int
 	CodeReviewed    int
+	Autosubmit      int
 	Submittable     bool
-	HashTags        []string
 	CommitID        string
 	ParentCommitIDs []string
 	OwnerName       string
@@ -32,8 +32,8 @@ func MakeChangeset(changeInfo *goGerrit.ChangeInfo) *Changeset {
 		Number:          changeInfo.Number,
 		Verified:        labelInfoToInt(changeInfo.Labels["Verified"]),
 		CodeReviewed:    labelInfoToInt(changeInfo.Labels["Code-Review"]),
+		Autosubmit:      labelInfoToInt(changeInfo.Labels["Autosubmit"]),
 		Submittable:     changeInfo.Submittable,
-		HashTags:        changeInfo.Hashtags,
 		CommitID:        changeInfo.CurrentRevision, // yes, this IS the commit ID.
 		ParentCommitIDs: getParentCommitIDs(changeInfo),
 		OwnerName:       changeInfo.Owner.Name,
@@ -41,15 +41,13 @@ func MakeChangeset(changeInfo *goGerrit.ChangeInfo) *Changeset {
 	}
 }
 
-// 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
+// IsAutosubmit returns true if the changeset is intended to be
+// automatically submitted by gerrit-queue.
+//
+// This is determined by the Change Owner setting +1 on the
+// "Autosubmit" label.
+func (c *Changeset) IsAutosubmit() bool {
+	return c.Autosubmit == 1
 }
 
 // IsVerified returns true if the changeset passed CI,
diff --git a/gerrit/client.go b/gerrit/client.go
index 415871d476..314f97281c 100644
--- a/gerrit/client.go
+++ b/gerrit/client.go
@@ -26,7 +26,6 @@ type IClient interface {
 	GetChangesetURL(changeset *Changeset) string
 	SubmitChangeset(changeset *Changeset) (*Changeset, error)
 	RebaseChangeset(changeset *Changeset, ref string) (*Changeset, error)
-	RemoveTag(changeset *Changeset, tag string) (*Changeset, error)
 	ChangesetIsRebasedOnHEAD(changeset *Changeset) bool
 	SerieIsRebasedOnHEAD(serie *Serie) bool
 	FilterSeries(filter func(s *Serie) bool) []*Serie
@@ -161,21 +160,6 @@ func (c *Client) RebaseChangeset(changeset *Changeset, ref string) (*Changeset,
 	return c.fetchChangeset(changeInfo.ChangeID)
 }
 
-// RemoveTag removes the submit queue tag from a changeset and updates gerrit
-// we never add, that's something users should do in the GUI.
-func (c *Client) RemoveTag(changeset *Changeset, tag string) (*Changeset, error) {
-	hashTags := changeset.HashTags
-	newHashTags := []string{}
-	for _, hashTag := range hashTags {
-		if hashTag != tag {
-			newHashTags = append(newHashTags, hashTag)
-		}
-	}
-	// TODO: implement setting hashtags api in go-gerrit and use here
-	// https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#set-hashtags
-	return changeset, nil
-}
-
 // GetBaseURL returns the gerrit base URL
 func (c *Client) GetBaseURL() string {
 	return c.baseURL
diff --git a/main.go b/main.go
index 9f3277e9a9..d8577dad50 100644
--- a/main.go
+++ b/main.go
@@ -21,7 +21,7 @@ import (
 )
 
 func main() {
-	var URL, username, password, projectName, branchName, submitQueueTag string
+	var URL, username, password, projectName, branchName string
 	var fetchOnly bool
 	var triggerInterval int
 
@@ -64,13 +64,6 @@ func main() {
 			Destination: &branchName,
 			Value:       "master",
 		},
-		cli.StringFlag{
-			Name:        "submit-queue-tag",
-			Usage:       "the tag used to submit something to the submit queue",
-			EnvVar:      "SUBMIT_QUEUE_TAG",
-			Destination: &submitQueueTag,
-			Value:       "submit_me",
-		},
 		cli.IntFlag{
 			Name:        "trigger-interval",
 			Usage:       "How often we should trigger ourselves (interval in seconds)",
@@ -102,7 +95,7 @@ func main() {
 		}
 		log.Infof("Successfully connected to gerrit at %s", URL)
 
-		runner := submitqueue.NewRunner(l, gerrit, submitQueueTag)
+		runner := submitqueue.NewRunner(l, gerrit)
 
 		handler := frontend.MakeFrontend(rotatingLogHandler, gerrit, runner)
 
diff --git a/submitqueue/runner.go b/submitqueue/runner.go
index 0d8bcce2e1..6e4a54a71b 100644
--- a/submitqueue/runner.go
+++ b/submitqueue/runner.go
@@ -20,26 +20,24 @@ type Runner struct {
 	wipSerie         *gerrit.Serie
 	logger           *log.Logger
 	gerrit           *gerrit.Client
-	submitQueueTag   string // the tag used to submit something to the submit queue
 }
 
 // NewRunner creates a new Runner struct
-func NewRunner(logger *log.Logger, gerrit *gerrit.Client, submitQueueTag string) *Runner {
+func NewRunner(logger *log.Logger, gerrit *gerrit.Client) *Runner {
 	return &Runner{
-		logger:         logger,
-		gerrit:         gerrit,
-		submitQueueTag: submitQueueTag,
+		logger: logger,
+		gerrit: gerrit,
 	}
 }
 
 // isAutoSubmittable determines if something could be autosubmitted, potentially requiring a rebase
 // for this, it needs to:
-//  * have the auto-submit label
+//  * have the "Autosubmit" label set to +1
 //  * have gerrit's 'submittable' field set to true
 // it doesn't check if the series is rebased on HEAD
 func (r *Runner) isAutoSubmittable(s *gerrit.Serie) bool {
 	for _, c := range s.ChangeSets {
-		if c.Submittable != true || !c.HasTag(r.submitQueueTag) {
+		if c.Submittable != true || !c.IsAutosubmit() {
 			return false
 		}
 	}