cmd/latestgo: Use Gerrit to retrieve latest Go version Fixes golang/go#58350 Change-Id: I4bb22a6a1aaebcb965938d78c754c71e1041e431 Reviewed-on: https://go-review.googlesource.com/c/playground/+/467955 Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/cmd/latestgo/main.go b/cmd/latestgo/main.go index 5dab543..1b46133 100644 --- a/cmd/latestgo/main.go +++ b/cmd/latestgo/main.go
@@ -7,41 +7,58 @@ import ( "context" - "crypto/tls" "flag" "fmt" "log" + "strings" "time" - "golang.org/x/build/maintner/maintnerd/apipb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" + "golang.org/x/build/gerrit" + "golang.org/x/mod/semver" ) -var prev = flag.Bool("prev", false, "whether to query the previous Go release, rather than the last (e.g. 1.17 versus 1.18)") - -const maintnerURI = "maintner.golang.org:443" - func main() { + client := gerrit.NewClient("https://go-review.googlesource.com", gerrit.NoAuth) + flag.Parse() - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() - conn, err := grpc.DialContext(ctx, maintnerURI, grpc.WithBlock(), - grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{NextProtos: []string{"h2"}}))) - if err != nil { - log.Fatalf("error creating grpc client for %q: %v", maintnerURI, err) - } - mc := apipb.NewMaintnerServiceClient(conn) - resp, err := mc.ListGoReleases(context.Background(), &apipb.ListGoReleasesRequest{}) + tagInfo, err := client.GetProjectTags(ctx, "go") if err != nil { - log.Fatalln(err) + log.Fatalf("error retrieving project tags for 'go': %v", err) } - idx := 0 - if *prev { - idx = 1 + + if len(tagInfo) == 0 { + log.Fatalln("no project tags found for 'go'") } - // On success, the maintner API always returns at least two releases. - fmt.Print(resp.GetReleases()[idx].GetTagName()) + + var versions []string // semantic Go versions + tagMap := make(map[string]string) // version -> tag + + for _, tag := range tagInfo { + + tagName := strings.TrimPrefix(tag.Ref, "refs/tags/") + + var maj, min, patch int // semver numbers corresponding to Go release + var err error + if _, err = fmt.Sscanf(tagName, "go%d.%d.%d", &maj, &min, &patch); err != nil { + _, err = fmt.Sscanf(tagName, "go%d.%d", &maj, &min) + patch = 0 + } + + if err != nil { + continue + } + + version := fmt.Sprintf("v%d.%d.%d", maj, min, patch) + versions = append(versions, version) + tagMap[version] = tagName + + } + + semver.Sort(versions) + + fmt.Print(tagMap[versions[len(versions)-1]]) }