Skip to content

Commit 6d06603

Browse files
pgeorgasfindleyr
authored andcommitted
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 <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Reviewed-by: Robert Findley <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent f9826ed commit 6d06603

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

cmd/latestgo/main.go

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,58 @@ package main
77

88
import (
99
"context"
10-
"crypto/tls"
1110
"flag"
1211
"fmt"
1312
"log"
13+
"strings"
1414
"time"
1515

16-
"golang.org/x/build/maintner/maintnerd/apipb"
17-
"google.golang.org/grpc"
18-
"google.golang.org/grpc/credentials"
16+
"golang.org/x/build/gerrit"
17+
"golang.org/x/mod/semver"
1918
)
2019

21-
var prev = flag.Bool("prev", false, "whether to query the previous Go release, rather than the last (e.g. 1.17 versus 1.18)")
22-
23-
const maintnerURI = "maintner.golang.org:443"
24-
2520
func main() {
21+
client := gerrit.NewClient("https://go-review.googlesource.com", gerrit.NoAuth)
22+
2623
flag.Parse()
2724

28-
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
25+
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
2926
defer cancel()
30-
conn, err := grpc.DialContext(ctx, maintnerURI, grpc.WithBlock(),
31-
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{NextProtos: []string{"h2"}})))
27+
28+
tagInfo, err := client.GetProjectTags(ctx, "go")
3229
if err != nil {
33-
log.Fatalf("error creating grpc client for %q: %v", maintnerURI, err)
30+
log.Fatalf("error retrieving project tags for 'go': %v", err)
3431
}
35-
mc := apipb.NewMaintnerServiceClient(conn)
3632

37-
resp, err := mc.ListGoReleases(context.Background(), &apipb.ListGoReleasesRequest{})
38-
if err != nil {
39-
log.Fatalln(err)
33+
if len(tagInfo) == 0 {
34+
log.Fatalln("no project tags found for 'go'")
4035
}
41-
idx := 0
42-
if *prev {
43-
idx = 1
36+
37+
var versions []string // semantic Go versions
38+
tagMap := make(map[string]string) // version -> tag
39+
40+
for _, tag := range tagInfo {
41+
42+
tagName := strings.TrimPrefix(tag.Ref, "refs/tags/")
43+
44+
var maj, min, patch int // semver numbers corresponding to Go release
45+
var err error
46+
if _, err = fmt.Sscanf(tagName, "go%d.%d.%d", &maj, &min, &patch); err != nil {
47+
_, err = fmt.Sscanf(tagName, "go%d.%d", &maj, &min)
48+
patch = 0
49+
}
50+
51+
if err != nil {
52+
continue
53+
}
54+
55+
version := fmt.Sprintf("v%d.%d.%d", maj, min, patch)
56+
versions = append(versions, version)
57+
tagMap[version] = tagName
58+
4459
}
45-
// On success, the maintner API always returns at least two releases.
46-
fmt.Print(resp.GetReleases()[idx].GetTagName())
60+
61+
semver.Sort(versions)
62+
63+
fmt.Print(tagMap[versions[len(versions)-1]])
4764
}

0 commit comments

Comments
 (0)