@@ -32,6 +32,10 @@ import (
32
32
33
33
// A Target is a release target.
34
34
type Target struct {
35
+ // GoQuery is a Go version query specifying the Go versions the
36
+ // release target applies to. Empty string means all Go versions.
37
+ GoQuery string
38
+
35
39
Name string // Target name as accepted by cmd/release. For example, "linux-amd64".
36
40
TestOnly bool // Run tests only; don't produce a release artifact.
37
41
}
@@ -50,6 +54,7 @@ var releaseTargets = []Target{
50
54
{Name : "windows-386" },
51
55
{Name : "windows-amd64" },
52
56
{Name : "darwin-amd64" },
57
+ {Name : "darwin-arm64" , GoQuery : ">= go1.16beta1" },
53
58
{Name : "linux-s390x" },
54
59
{Name : "linux-ppc64le" },
55
60
@@ -88,8 +93,9 @@ func main() {
88
93
fmt .Fprintln (os .Stderr , "need to provide a valid mode and a release name" )
89
94
usage ()
90
95
}
96
+ releaseVersion := flag .Arg (0 )
91
97
for _ , target := range strings .Fields (* skipTestFlag ) {
92
- if t , ok := releaseTarget (target ); ! ok {
98
+ if t , ok := releaseTarget (target , releaseVersion ); ! ok {
93
99
fmt .Fprintf (os .Stderr , "target %q in -skip-test=%q is not a known target\n " , target , * skipTestFlag )
94
100
usage ()
95
101
} else if ! t .TestOnly {
@@ -108,13 +114,11 @@ func main() {
108
114
loadGithubAuth ()
109
115
loadGCSAuth ()
110
116
111
- release := flag .Arg (0 )
112
-
113
117
w := & Work {
114
118
Prepare : * modeFlag == "prepare" ,
115
- Version : release ,
116
- BetaRelease : strings .Contains (release , "beta" ),
117
- RCRelease : strings .Contains (release , "rc" ),
119
+ Version : releaseVersion ,
120
+ BetaRelease : strings .Contains (releaseVersion , "beta" ),
121
+ RCRelease : strings .Contains (releaseVersion , "rc" ),
118
122
Security : * security ,
119
123
}
120
124
@@ -147,6 +151,9 @@ func main() {
147
151
log .Fatalf ("cannot understand version %q" , w .Version )
148
152
}
149
153
154
+ // Select release targets for this Go version.
155
+ w .ReleaseTargets = matchTargets (w .Version )
156
+
150
157
// Find milestones.
151
158
var err error
152
159
w .Milestone , err = getMilestone (w .Version )
@@ -244,14 +251,15 @@ type Work struct {
244
251
RCRelease bool
245
252
Security bool // cut a security release from the internal Gerrit
246
253
247
- ReleaseIssue int // Release status issue number
248
- ReleaseBranch string // "master" for beta releases
249
- Dir string // work directory ($HOME/go-releasebot-work/<release>)
250
- StagingDir string // staging directory (a temporary directory inside <work>/release-staging)
251
- Errors []string
252
- ReleaseBinary string
253
- Version string
254
- VersionCommit string
254
+ ReleaseIssue int // Release status issue number
255
+ ReleaseBranch string // "master" for beta releases
256
+ Dir string // work directory ($HOME/go-releasebot-work/<release>)
257
+ StagingDir string // staging directory (a temporary directory inside <work>/release-staging)
258
+ Errors []string
259
+ ReleaseBinary string
260
+ ReleaseTargets []Target // Selected release targets for this release.
261
+ Version string
262
+ VersionCommit string
255
263
256
264
releaseMu sync.Mutex
257
265
ReleaseInfo map [string ]* ReleaseInfo // map and info protected by releaseMu
@@ -560,7 +568,7 @@ func (w *Work) printReleaseTable(md *bytes.Buffer) {
560
568
// TODO: print sha256
561
569
w .releaseMu .Lock ()
562
570
defer w .releaseMu .Unlock ()
563
- for _ , target := range releaseTargets {
571
+ for _ , target := range w . ReleaseTargets {
564
572
fmt .Fprintf (md , "- %s" , mdEscape (target .Name ))
565
573
if target .TestOnly {
566
574
fmt .Fprintf (md , " (test only)" )
@@ -671,7 +679,7 @@ to %s and press enter.
671
679
}
672
680
673
681
var wg sync.WaitGroup
674
- for _ , target := range releaseTargets {
682
+ for _ , target := range w . ReleaseTargets {
675
683
w .releaseMu .Lock ()
676
684
w .ReleaseInfo [target .Name ] = new (ReleaseInfo )
677
685
w .releaseMu .Unlock ()
@@ -706,7 +714,7 @@ to %s and press enter.
706
714
707
715
// Check for release errors and stop if any.
708
716
w .releaseMu .Lock ()
709
- for _ , target := range releaseTargets {
717
+ for _ , target := range w . ReleaseTargets {
710
718
for _ , out := range w .ReleaseInfo [target .Name ].Outputs {
711
719
if out .Error != "" || len (w .Errors ) > 0 {
712
720
w .logError ("RELEASE BUILD FAILED\n " )
@@ -889,12 +897,43 @@ func (w *Work) mustIncludeSecurityBranch() {
889
897
}
890
898
}
891
899
892
- // releaseTarget returns a release target with the specified name.
893
- func releaseTarget (name string ) (_ Target , ok bool ) {
900
+ // releaseTarget returns a release target with the specified name
901
+ // for the specified Go version.
902
+ func releaseTarget (name , goVer string ) (_ Target , ok bool ) {
894
903
for _ , t := range releaseTargets {
904
+ if ! match (t .GoQuery , goVer ) {
905
+ continue
906
+ }
895
907
if t .Name == name {
896
908
return t , true
897
909
}
898
910
}
899
911
return Target {}, false
900
912
}
913
+
914
+ // matchTargets selects release targets that have a matching
915
+ // GoQuery value for the specified Go version.
916
+ func matchTargets (goVer string ) (matched []Target ) {
917
+ for _ , t := range releaseTargets {
918
+ if ! match (t .GoQuery , goVer ) {
919
+ continue
920
+ }
921
+ matched = append (matched , t )
922
+ }
923
+ return matched
924
+ }
925
+
926
+ // match reports whether the Go version goVer matches the provided version query.
927
+ // The empty query matches all Go versions.
928
+ // match panics if given a query that it doesn't support.
929
+ func match (query , goVer string ) bool {
930
+ // TODO(golang.org/issue/40558): This should help inform the API for a Go version parser.
931
+ switch query {
932
+ case "" : // A special case to make the zero Target.GoQuery value useful.
933
+ return true
934
+ case ">= go1.16beta1" :
935
+ return ! strings .HasPrefix (goVer , "go1.15" ) && ! strings .HasPrefix (goVer , "go1.14" )
936
+ default :
937
+ panic (fmt .Errorf ("match: query %q is not supported" , query ))
938
+ }
939
+ }
0 commit comments