cmd/gopherbot: label Tools issues automatically

Automatically label any issues with x/tools in the title. This will make
them easier to search.

Change-Id: Ib2b1b9d6b208d2c0748282a5cdeb8c7705483f61
Reviewed-on: https://go-review.googlesource.com/c/build/+/194360
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/cmd/gopherbot/gopherbot.go b/cmd/gopherbot/gopherbot.go
index 5794048..9d1f818 100644
--- a/cmd/gopherbot/gopherbot.go
+++ b/cmd/gopherbot/gopherbot.go
@@ -285,6 +285,7 @@
 	{"label build issues", (*gopherbot).labelBuildIssues},
 	{"label mobile issues", (*gopherbot).labelMobileIssues},
 	{"label documentation issues", (*gopherbot).labelDocumentationIssues},
+	{"label tools issues", (*gopherbot).labelToolsIssues},
 	{"handle gopls issues", (*gopherbot).handleGoplsIssues},
 	{"close stale WaitingForInfo", (*gopherbot).closeStaleWaitingForInfo},
 	{"cl2issue", (*gopherbot).cl2issue},
@@ -878,6 +879,15 @@
 	})
 }
 
+func (b *gopherbot) labelToolsIssues(ctx context.Context) error {
+	return b.gorepo.ForeachIssue(func(gi *maintner.GitHubIssue) error {
+		if gi.Closed || gi.PullRequest || !strings.HasPrefix(gi.Title, "x/tools") || gi.HasLabel("Tools") || gi.HasEvent("unlabeled") {
+			return nil
+		}
+		return b.addLabel(ctx, gi, "Tools")
+	})
+}
+
 // handleGoplsIssues labels and asks for additional information on gopls issues.
 //
 // This is necessary because gopls issues often require additional information to diagnose,