Skip to content

Commit e3b2a7f

Browse files
committed
x/exp/cmd/gorelease: diagnostic about proposed prerelease
Adds diagnostics about: - Prereleases with suffixes that sort lower than pseudo-versions. - Prereleases with plus signs. Fixes golang/go#37565 Change-Id: I210df3a0c37912963e750c632d1dc4a556e94e88 Reviewed-on: https://go-review.googlesource.com/c/exp/+/257077 Trust: Jean de Klerk <deklerk@google.com> Trust: Jay Conrod <jayconrod@google.com> Run-TryBot: Jean de Klerk <deklerk@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Jay Conrod <jayconrod@google.com>
1 parent c827fd4 commit e3b2a7f

File tree

9 files changed

+71
-0
lines changed

9 files changed

+71
-0
lines changed

cmd/gorelease/gorelease.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@
5353
//
5454
// For more information on semantic versioning, see https://semver.org.
5555
//
56+
// Note: gorelease does not accept build metadata in releases (like
57+
// v1.0.0+debug). Although it is valid semver, the Go tool and other tools in
58+
// the ecosystem do not support it, so its use is not recommended.
59+
//
5660
// gorelease accepts the following flags:
5761
//
5862
// -base=version: The version that the current version of the module will be
@@ -167,6 +171,9 @@ func runRelease(w io.Writer, dir string, args []string) (success bool, err error
167171
return false, usageErrorf("no arguments allowed")
168172
}
169173
if releaseVersion != "" {
174+
if semver.Build(releaseVersion) != "" {
175+
return false, usageErrorf("release version %q is not a canonical semantic version: build metadata is not supported", releaseVersion)
176+
}
170177
if c := semver.Canonical(releaseVersion); c != releaseVersion {
171178
return false, usageErrorf("release version %q is not a canonical semantic version", releaseVersion)
172179
}
@@ -250,6 +257,11 @@ func loadLocalModule(modRoot, repoRoot, version string) (m moduleInfo, err error
250257
version: version,
251258
goModPath: filepath.Join(modRoot, "go.mod"),
252259
}
260+
261+
if version != "" && semver.Compare(version, "v0.0.0-99999999999999-zzzzzzzzzzzz") < 0 {
262+
m.diagnostics = append(m.diagnostics, fmt.Sprintf("Version %s is lower than most pseudo-versions. Consider releasing v0.1.0-0 instead.", version))
263+
}
264+
253265
m.goModData, err = ioutil.ReadFile(m.goModPath)
254266
if err != nil {
255267
return moduleInfo{}, err

cmd/gorelease/report.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ func (r *report) Text(w io.Writer) error {
8686
} else {
8787
if r.release.tagPrefix == "" {
8888
fmt.Fprintf(buf, "%s is a valid semantic version for this release.\n", r.release.version)
89+
90+
if semver.Compare(r.release.version, "v0.0.0-99999999999999-zzzzzzzzzzzz") < 0 {
91+
fmt.Fprintf(buf, `Note: %s sorts lower in MVS than pseudo-versions, which may be
92+
unexpected for users. So, it may be better to choose a different suffix.`, r.release.version)
93+
}
8994
} else {
9095
fmt.Fprintf(buf, "%[1]s (with tag %[2]s%[1]s) is a valid semantic version for this release\n", r.release.version, r.release.tagPrefix)
9196
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- go.mod --
2+
module example.com/prerelease
3+
4+
go 1.12
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This directory contains tests for pre-release versions.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
mod=example.com/prerelease
2+
release=v0.0.0-2
3+
success=false
4+
-- want --
5+
Inferred base version: none
6+
Version v0.0.0-2 is lower than most pseudo-versions. Consider releasing v0.1.0-0 instead.
7+
-- go.mod --
8+
module example.com/prerelease
9+
10+
go 1.12
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
mod=example.com/prerelease
2+
release=v0.0.0-3
3+
success=false
4+
-- want --
5+
Inferred base version: none
6+
Version v0.0.0-3 is lower than most pseudo-versions. Consider releasing v0.1.0-0 instead.
7+
-- go.mod --
8+
module example.com/prerelease
9+
10+
go 1.12
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
mod=example.com/prerelease
2+
release=v0.0.0-beta2
3+
-- want --
4+
Inferred base version: none
5+
v0.0.0-beta2 is a valid semantic version for this release.
6+
-- go.mod --
7+
module example.com/prerelease
8+
9+
go 1.12
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
mod=example.com/prerelease
2+
release=v1.0.0-alpha+001
3+
error=true
4+
-- want --
5+
usage: gorelease [-base=version] [-version=version]
6+
release version "v1.0.0-alpha+001" is not a canonical semantic version: build metadata is not supported
7+
For more information, run go doc golang.org/x/exp/cmd/gorelease
8+
-- go.mod --
9+
module example.com/prerelease
10+
11+
go 1.12
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
mod=example.com/prerelease
2+
release=v0.0.0-some-words-only-suffix
3+
-- want --
4+
Inferred base version: none
5+
v0.0.0-some-words-only-suffix is a valid semantic version for this release.
6+
-- go.mod --
7+
module example.com/prerelease
8+
9+
go 1.12

0 commit comments

Comments
 (0)