internal/history: rename Version to GoVer

Make it more clear that this type represents a Go-specific version,
rather than a version that follows the Semantic Versioning 2.0.0
specification. The type already has Go-specific methods, for example
IsMajor reports true for "1.14" and IsMinor reports true for "1.14.1".
This is consistent with the terminology used by Go releases, but
very surprising if considered from the perspective of semver.

Document some differences of the Go-specific version convention
compared to semver, and describe the X, Y, Z fields in more detail.

This change makes it viable to add a String method to GoVer type
documented to print a Go-specific version string, which will be
useful in more places in CL 229483.

For golang/go#32450.

Change-Id: If7482fdb4a739ff5b89b7133402d94412057f590
Reviewed-on: https://go-review.googlesource.com/c/website/+/229481
Reviewed-by: Carlos Amedee <carlos@golang.org>
This commit is contained in:
Dmitri Shuralyov 2020-04-22 09:56:18 -04:00
Родитель e9020e8d94
Коммит b4ea521127
2 изменённых файлов: 36 добавлений и 21 удалений

Просмотреть файл

@ -78,9 +78,9 @@ func (h releaseHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// sortReleases returns a sorted list of Go releases, suitable to be
// displayed on the Release History page. Releases are arranged into
// major releases, each with minor revisions.
func sortReleases(rs map[history.Version]history.Release) []Major {
func sortReleases(rs map[history.GoVer]history.Release) []Major {
var major []Major
byMajorVersion := make(map[history.Version]Major)
byMajorVersion := make(map[history.GoVer]Major)
for v, r := range rs {
switch {
case v.IsMajor():
@ -108,8 +108,8 @@ func sortReleases(rs map[history.Version]history.Release) []Major {
// majorOf takes a Go version like 1.5, 1.5.1, 1.5.2, etc.,
// and returns the corresponding major version like 1.5.
func majorOf(v history.Version) history.Version {
return history.Version{X: v.X, Y: v.Y, Z: 0}
func majorOf(v history.GoVer) history.GoVer {
return history.GoVer{X: v.X, Y: v.Y, Z: 0}
}
type releaseTemplateData struct {
@ -125,20 +125,13 @@ type Major struct {
// Release represents a Go release entry as displayed on the release history page.
type Release struct {
ver history.Version
ver history.GoVer
rel history.Release
}
// V returns the Go release version string, like "1.14", "1.14.1", "1.14.2", etc.
func (r Release) V() string {
switch {
case r.ver.Z != 0:
return fmt.Sprintf("%d.%d.%d", r.ver.X, r.ver.Y, r.ver.Z)
case r.ver.Y != 0:
return fmt.Sprintf("%d.%d", r.ver.X, r.ver.Y)
default:
return fmt.Sprintf("%d", r.ver.X)
}
return r.ver.String()
}
// Date returns the date of the release, formatted for display on the release history page.

Просмотреть файл

@ -6,6 +6,7 @@
package history
import (
"fmt"
"html/template"
"time"
)
@ -29,7 +30,7 @@ type Release struct {
//
// It contains entries for releases of Go 1.9 and newer.
// Older releases are listed in doc/devel/release.html.
var Releases = map[Version]Release{
var Releases = map[GoVer]Release{
{1, 14, 2}: {
Date: Date{2020, 4, 8},
@ -457,20 +458,41 @@ of non-Git repositories under certain conditions.`,
},
}
// Version represents the version of a Go release.
type Version struct {
X int // 1 or higher.
Y int // 0 or higher.
Z int // 0 or higher.
// GoVer represents a Go release version.
//
// In contrast to Semantic Versioning 2.0.0,
// trailing zero components are omitted,
// a version like Go 1.14 is considered a major Go release,
// a version like Go 1.14.1 is considered a minor Go release.
//
// See proposal golang.org/issue/32450 for background, details,
// and a discussion of the costs involved in making a change.
type GoVer struct {
X int // X is the 1st component of a Go X.Y.Z version. It must be 1 or higher.
Y int // Y is the 2nd component of a Go X.Y.Z version. It must be 0 or higher.
Z int // Z is the 3rd component of a Go X.Y.Z version. It must be 0 or higher.
}
// String returns the Go release version string,
// like "1.14", "1.14.1", "1.14.2", and so on.
func (v GoVer) String() string {
switch {
case v.Z != 0:
return fmt.Sprintf("%d.%d.%d", v.X, v.Y, v.Z)
case v.Y != 0:
return fmt.Sprintf("%d.%d", v.X, v.Y)
default:
return fmt.Sprintf("%d", v.X)
}
}
// IsMajor reports whether version v is considered to be a major Go release.
// For example, Go 1.14 and 1.13 are major Go releases.
func (v Version) IsMajor() bool { return v.Z == 0 }
func (v GoVer) IsMajor() bool { return v.Z == 0 }
// IsMinor reports whether version v is considered to be a minor Go release.
// For example, Go 1.14.1 and 1.13.9 are minor Go releases.
func (v Version) IsMinor() bool { return v.Z != 0 }
func (v GoVer) IsMinor() bool { return v.Z != 0 }
// Date represents the date (year, month, day) of a Go release.
//