@@ -7,41 +7,58 @@ package main
7
7
8
8
import (
9
9
"context"
10
- "crypto/tls"
11
10
"flag"
12
11
"fmt"
13
12
"log"
13
+ "strings"
14
14
"time"
15
15
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"
19
18
)
20
19
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
-
25
20
func main () {
21
+ client := gerrit .NewClient ("https://go-review.googlesource.com" , gerrit .NoAuth )
22
+
26
23
flag .Parse ()
27
24
28
- ctx , cancel := context .WithTimeout (context .Background (), 10 * time .Second )
25
+ ctx , cancel := context .WithTimeout (context .Background (), 60 * time .Second )
29
26
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" )
32
29
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 )
34
31
}
35
- mc := apipb .NewMaintnerServiceClient (conn )
36
32
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'" )
40
35
}
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
+
44
59
}
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 ]])
47
64
}
0 commit comments