Commit d6c9af6a authored by Russ Cox's avatar Russ Cox

cmd/go: update for go1 tag format

R=golang-dev, r, r
CC=golang-dev
https://golang.org/cl/5919048
parent 901ee5c1
...@@ -11,6 +11,7 @@ import ( ...@@ -11,6 +11,7 @@ import (
"go/build" "go/build"
"os" "os"
"path/filepath" "path/filepath"
"regexp"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
...@@ -323,9 +324,18 @@ func downloadPackage(p *Package) error { ...@@ -323,9 +324,18 @@ func downloadPackage(p *Package) error {
return nil return nil
} }
// goTag matches go release tags such as go1 and go1.2.3.
// The numbers involved must be small (at most 4 digits),
// have no unnecessary leading zeros, and the version cannot
// end in .0 - it is go1, not go1.0 or go1.0.0.
var goTag = regexp.MustCompile(
`^go((0|[1-9][0-9]{0,3})\.)*([1-9][0-9]{0,3})$`,
)
// selectTag returns the closest matching tag for a given version. // selectTag returns the closest matching tag for a given version.
// Closest means the latest one that is not after the current release. // Closest means the latest one that is not after the current release.
// Version "release.rN" matches tags of the form "go.rN" (N being a decimal). // Version "goX" (or "goX.Y" or "goX.Y.Z") matches tags of the same form.
// Version "release.rN" matches tags of the form "go.rN" (N being a floating-point number).
// Version "weekly.YYYY-MM-DD" matches tags like "go.weekly.YYYY-MM-DD". // Version "weekly.YYYY-MM-DD" matches tags like "go.weekly.YYYY-MM-DD".
func selectTag(goVersion string, tags []string) (match string) { func selectTag(goVersion string, tags []string) (match string) {
const rPrefix = "release.r" const rPrefix = "release.r"
...@@ -349,6 +359,7 @@ func selectTag(goVersion string, tags []string) (match string) { ...@@ -349,6 +359,7 @@ func selectTag(goVersion string, tags []string) (match string) {
} }
} }
} }
const wPrefix = "weekly." const wPrefix = "weekly."
if strings.HasPrefix(goVersion, wPrefix) { if strings.HasPrefix(goVersion, wPrefix) {
p := "go.weekly." p := "go.weekly."
...@@ -362,5 +373,54 @@ func selectTag(goVersion string, tags []string) (match string) { ...@@ -362,5 +373,54 @@ func selectTag(goVersion string, tags []string) (match string) {
} }
} }
} }
if goTag.MatchString(goVersion) {
v := goVersion
for _, t := range tags {
if !goTag.MatchString(t) {
continue
}
if cmpGoVersion(match, t) < 0 && cmpGoVersion(t, v) <= 0 {
match = t
}
}
}
return match return match
} }
// cmpGoVersion returns -1, 0, +1 reporting whether
// x < y, x == y, or x > y.
func cmpGoVersion(x, y string) int {
// Malformed strings compare less than well-formed strings.
if !goTag.MatchString(x) {
return -1
}
if !goTag.MatchString(y) {
return +1
}
// Compare numbers in sequence.
xx := strings.Split(x[len("go"):], ".")
yy := strings.Split(y[len("go"):], ".")
for i := 0; i < len(xx) && i < len(yy); i++ {
// The Atoi are guaranteed to succeed
// because the versions match goTag.
xi, _ := strconv.Atoi(xx[i])
yi, _ := strconv.Atoi(yy[i])
if xi < yi {
return -1
} else if xi > yi {
return +1
}
}
if len(xx) < len(yy) {
return -1
}
if len(xx) > len(yy) {
return +1
}
return 0
}
...@@ -18,6 +18,12 @@ var selectTagTestTags = []string{ ...@@ -18,6 +18,12 @@ var selectTagTestTags = []string{
"go.weekly.2011-10-12.1", "go.weekly.2011-10-12.1",
"go.weekly.2011-10-14", "go.weekly.2011-10-14",
"go.weekly.2011-11-01", "go.weekly.2011-11-01",
"go1",
"go1.0.1",
"go1.999",
"go1.9.2",
"go5",
// these should be ignored: // these should be ignored:
"release.r59", "release.r59",
"release.r59.1", "release.r59.1",
...@@ -30,6 +36,14 @@ var selectTagTestTags = []string{ ...@@ -30,6 +36,14 @@ var selectTagTestTags = []string{
"go.f00", "go.f00",
"go!r60", "go!r60",
"go.1999-01-01", "go.1999-01-01",
"go.2x",
"go.20000000000000",
"go.2.",
"go.2.0",
"go2x",
"go20000000000000",
"go2.",
"go2.0",
} }
var selectTagTests = []struct { var selectTagTests = []struct {
...@@ -56,11 +70,21 @@ var selectTagTests = []struct { ...@@ -56,11 +70,21 @@ var selectTagTests = []struct {
{"weekly.2011-11-01", "go.weekly.2011-11-01"}, {"weekly.2011-11-01", "go.weekly.2011-11-01"},
{"weekly.2014-01-01", "go.weekly.2011-11-01"}, {"weekly.2014-01-01", "go.weekly.2011-11-01"},
{"weekly.3000-01-01", "go.weekly.2011-11-01"}, {"weekly.3000-01-01", "go.weekly.2011-11-01"},
{"go1", "go1"},
{"go1.1", "go1.0.1"},
{"go1.998", "go1.9.2"},
{"go1.1000", "go1.999"},
{"go6", "go5"},
// faulty versions: // faulty versions:
{"release.f00", ""}, {"release.f00", ""},
{"weekly.1999-01-01", ""}, {"weekly.1999-01-01", ""},
{"junk", ""}, {"junk", ""},
{"", ""}, {"", ""},
{"go2x", ""},
{"go200000000000", ""},
{"go2.", ""},
{"go2.0", ""},
} }
func TestSelectTag(t *testing.T) { func TestSelectTag(t *testing.T) {
......
...@@ -71,7 +71,7 @@ var vcsHg = &vcsCmd{ ...@@ -71,7 +71,7 @@ var vcsHg = &vcsCmd{
// We allow both tag and branch names as 'tags' // We allow both tag and branch names as 'tags'
// for selecting a version. This lets people have // for selecting a version. This lets people have
// a go.release.r60 branch and a go.1 branch // a go.release.r60 branch and a go1 branch
// and make changes in both, without constantly // and make changes in both, without constantly
// editing .hgtags. // editing .hgtags.
tagCmd: []tagCmd{ tagCmd: []tagCmd{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment