Skip to content

Commit 4682f4a

Browse files
committed
cmd/releasebot, cmd/release: add darwin-arm64 target for Go 1.16
For golang/go#42756. Change-Id: Ia28fb6878617715fb674ccfad0c5801c8925270b Reviewed-on: https://go-review.googlesource.com/c/build/+/278436 Run-TryBot: Dmitri Shuralyov <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Alexander Rakoczy <[email protected]> Trust: Dmitri Shuralyov <[email protected]>
1 parent 75c2a88 commit 4682f4a

File tree

3 files changed

+152
-19
lines changed

3 files changed

+152
-19
lines changed

cmd/release/release.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,13 @@ var builds = []*Build{
206206
Race: true,
207207
Builder: "darwin-amd64-10_15",
208208
},
209+
{
210+
GoQuery: ">= go1.16beta1", // Go 1.16 Beta 1 is the first Go (pre-)release with the darwin/arm64 port.
211+
OS: "darwin",
212+
Arch: "arm64",
213+
Race: true,
214+
Builder: "darwin-arm64-11_0-toothrot",
215+
},
209216
{
210217
OS: "linux",
211218
Arch: "s390x",

cmd/releasebot/main.go

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ import (
3232

3333
// A Target is a release target.
3434
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+
3539
Name string // Target name as accepted by cmd/release. For example, "linux-amd64".
3640
TestOnly bool // Run tests only; don't produce a release artifact.
3741
}
@@ -50,6 +54,7 @@ var releaseTargets = []Target{
5054
{Name: "windows-386"},
5155
{Name: "windows-amd64"},
5256
{Name: "darwin-amd64"},
57+
{Name: "darwin-arm64", GoQuery: ">= go1.16beta1"},
5358
{Name: "linux-s390x"},
5459
{Name: "linux-ppc64le"},
5560

@@ -88,8 +93,9 @@ func main() {
8893
fmt.Fprintln(os.Stderr, "need to provide a valid mode and a release name")
8994
usage()
9095
}
96+
releaseVersion := flag.Arg(0)
9197
for _, target := range strings.Fields(*skipTestFlag) {
92-
if t, ok := releaseTarget(target); !ok {
98+
if t, ok := releaseTarget(target, releaseVersion); !ok {
9399
fmt.Fprintf(os.Stderr, "target %q in -skip-test=%q is not a known target\n", target, *skipTestFlag)
94100
usage()
95101
} else if !t.TestOnly {
@@ -108,13 +114,11 @@ func main() {
108114
loadGithubAuth()
109115
loadGCSAuth()
110116

111-
release := flag.Arg(0)
112-
113117
w := &Work{
114118
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"),
118122
Security: *security,
119123
}
120124

@@ -147,6 +151,9 @@ func main() {
147151
log.Fatalf("cannot understand version %q", w.Version)
148152
}
149153

154+
// Select release targets for this Go version.
155+
w.ReleaseTargets = matchTargets(w.Version)
156+
150157
// Find milestones.
151158
var err error
152159
w.Milestone, err = getMilestone(w.Version)
@@ -244,14 +251,15 @@ type Work struct {
244251
RCRelease bool
245252
Security bool // cut a security release from the internal Gerrit
246253

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
255263

256264
releaseMu sync.Mutex
257265
ReleaseInfo map[string]*ReleaseInfo // map and info protected by releaseMu
@@ -560,7 +568,7 @@ func (w *Work) printReleaseTable(md *bytes.Buffer) {
560568
// TODO: print sha256
561569
w.releaseMu.Lock()
562570
defer w.releaseMu.Unlock()
563-
for _, target := range releaseTargets {
571+
for _, target := range w.ReleaseTargets {
564572
fmt.Fprintf(md, "- %s", mdEscape(target.Name))
565573
if target.TestOnly {
566574
fmt.Fprintf(md, " (test only)")
@@ -671,7 +679,7 @@ to %s and press enter.
671679
}
672680

673681
var wg sync.WaitGroup
674-
for _, target := range releaseTargets {
682+
for _, target := range w.ReleaseTargets {
675683
w.releaseMu.Lock()
676684
w.ReleaseInfo[target.Name] = new(ReleaseInfo)
677685
w.releaseMu.Unlock()
@@ -706,7 +714,7 @@ to %s and press enter.
706714

707715
// Check for release errors and stop if any.
708716
w.releaseMu.Lock()
709-
for _, target := range releaseTargets {
717+
for _, target := range w.ReleaseTargets {
710718
for _, out := range w.ReleaseInfo[target.Name].Outputs {
711719
if out.Error != "" || len(w.Errors) > 0 {
712720
w.logError("RELEASE BUILD FAILED\n")
@@ -889,12 +897,43 @@ func (w *Work) mustIncludeSecurityBranch() {
889897
}
890898
}
891899

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) {
894903
for _, t := range releaseTargets {
904+
if !match(t.GoQuery, goVer) {
905+
continue
906+
}
895907
if t.Name == name {
896908
return t, true
897909
}
898910
}
899911
return Target{}, false
900912
}
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+
}

cmd/releasebot/main_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright 2020 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"testing"
9+
10+
"github.com/google/go-cmp/cmp"
11+
)
12+
13+
func TestTargetSelectionPerGoVersion(t *testing.T) {
14+
targetNames := func(targets []Target) (names []string) {
15+
for _, t := range targets {
16+
names = append(names, t.Name)
17+
}
18+
return names
19+
}
20+
21+
for _, tc := range []struct {
22+
goVer []string // Go versions to test.
23+
want []string // Expected release targets.
24+
}{
25+
{
26+
goVer: []string{"go1.16beta1", "go1.16rc1", "go1.16", "go1.16.1"},
27+
want: []string{
28+
"src",
29+
"linux-386",
30+
"linux-armv6l",
31+
"linux-amd64",
32+
"linux-arm64",
33+
"freebsd-386",
34+
"freebsd-amd64",
35+
"windows-386",
36+
"windows-amd64",
37+
"darwin-amd64",
38+
"darwin-arm64", // New to Go 1.16.
39+
"linux-s390x",
40+
"linux-ppc64le",
41+
"linux-amd64-longtest",
42+
"windows-amd64-longtest",
43+
},
44+
},
45+
{
46+
goVer: []string{"go1.15.7", "go1.14.14"},
47+
want: []string{
48+
"src",
49+
"linux-386",
50+
"linux-armv6l",
51+
"linux-amd64",
52+
"linux-arm64",
53+
"freebsd-386",
54+
"freebsd-amd64",
55+
"windows-386",
56+
"windows-amd64",
57+
"darwin-amd64",
58+
"linux-s390x",
59+
"linux-ppc64le",
60+
"linux-amd64-longtest",
61+
"windows-amd64-longtest",
62+
},
63+
},
64+
} {
65+
for _, goVer := range tc.goVer {
66+
t.Run(goVer, func(t *testing.T) {
67+
got := matchTargets(goVer)
68+
if diff := cmp.Diff(tc.want, targetNames(got)); diff != "" {
69+
t.Errorf("release target mismatch (-want +got):\n%s", diff)
70+
}
71+
})
72+
}
73+
}
74+
}
75+
76+
func TestAllQueriesSupported(t *testing.T) {
77+
for _, r := range releaseTargets {
78+
t.Run(r.Name, func(t *testing.T) {
79+
defer func() {
80+
if err := recover(); err != nil {
81+
t.Errorf("target %s uses an unsupported version query:\n%v", r.Name, err)
82+
}
83+
}()
84+
match(r.GoQuery, "go1.15.7") // Shouldn't panic for any r.GoQuery.
85+
})
86+
}
87+
}

0 commit comments

Comments
 (0)