maintner/maintnerd/maintapi: ignore unexpected release branches

Fixes golang/go#29510

Change-Id: Ia67cd1e929282d840f6a1607d56da7e3ba65f5b5
Reviewed-on: https://go-review.googlesource.com/c/157443
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/maintner/maintnerd/maintapi/api.go b/maintner/maintnerd/maintapi/api.go
index 1c76fdb..f8ccd4e 100644
--- a/maintner/maintnerd/maintapi/api.go
+++ b/maintner/maintnerd/maintapi/api.go
@@ -11,7 +11,9 @@
 	"fmt"
 	"io"
 	"log"
+	"regexp"
 	"sort"
+	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -244,6 +246,10 @@
 	ForeachNonChangeRef(fn func(ref string, hash maintner.GitHash) error) error
 }
 
+// releaseBranchRx matches things of the form "release-branch.go1.5" or "release-branch.go2",
+// but not things like "release-branch.go1.10-security".
+var releaseBranchRx = regexp.MustCompile(`^release-branch\.go(\d{1,2})(?:\.(\d{1,3}))?$`)
+
 // supportedGoReleases returns the latest patches of releases
 // that are considered supported per policy.
 func supportedGoReleases(goProj nonChangeRefLister) ([]*apipb.GoRelease, error) {
@@ -289,14 +295,16 @@
 		case strings.HasPrefix(ref, "refs/heads/release-branch.go"):
 			// Release branch.
 			branchName := ref[len("refs/heads/"):]
-			var major, minor int32
-			_, err := fmt.Sscanf(branchName, "release-branch.go%d.%d", &major, &minor)
-			if err == io.ErrUnexpectedEOF {
-				// Do nothing.
-			} else if err != nil {
+			m := releaseBranchRx.FindStringSubmatch(branchName)
+			if m == nil {
 				return nil
 			}
-			branches[majorMinor{major, minor}] = branch{
+			var major, minor int
+			major, _ = strconv.Atoi(m[1])
+			if len(m) > 2 {
+				minor, _ = strconv.Atoi(m[2])
+			}
+			branches[majorMinor{int32(major), int32(minor)}] = branch{
 				Name:   branchName,
 				Commit: hash,
 			}
diff --git a/maintner/maintnerd/maintapi/api_test.go b/maintner/maintnerd/maintapi/api_test.go
index f1c02f9..435700a 100644
--- a/maintner/maintnerd/maintapi/api_test.go
+++ b/maintner/maintnerd/maintapi/api_test.go
@@ -56,9 +56,6 @@
 var hitGerrit = flag.Bool("hit_gerrit", false, "query production Gerrit in TestFindTryWork")
 
 func TestFindTryWork(t *testing.T) {
-	if testing.Short() {
-		t.Skip("skipping in short mode")
-	}
 	if !*hitGerrit {
 		t.Skip("skipping without flag --hit_gerrit")
 	}
@@ -153,6 +150,9 @@
 )
 
 func getGoData(tb testing.TB) *maintner.Corpus {
+	if testing.Short() {
+		tb.Skip("skipping maintner godata test in short mode")
+	}
 	corpusMu.Lock()
 	defer corpusMu.Unlock()
 	if corpusCache != nil {
@@ -185,6 +185,8 @@
 					{"refs/heads/release-branch.go1.1", gitHash("1d6d8fca241bb611af51e265c1b5a2e9ae904702")},
 					{"refs/heads/release-branch.go1.10", gitHash("e97b7d68f107ff60152f5bd5701e0286f221ee93")},
 					{"refs/heads/release-branch.go1.11", gitHash("97781d2ed116d2cd9cb870d0b84fc0ec598c9abc")},
+					{"refs/heads/release-branch.go1.10-security", gitHash("e97b7d68f107ff60152f5bd5701e0286f221ee93")},
+					{"refs/heads/release-branch.go1.11-security", gitHash("97781d2ed116d2cd9cb870d0b84fc0ec598c9abc")},
 					{"refs/heads/release-branch.go1.2", gitHash("43d00b0942c1c6f43993ac71e1eea48e62e22b8d")},
 					{"refs/heads/release-branch.r59", gitHash("5d9765785dff74784bbdad43f7847b6825509032")},
 					{"refs/heads/release-branch.r60", gitHash("394b383a1ee0ac3fec5e453a7dbe590d3ce6d6b0")},