Rewrite version detection algo

pull/136/head
Pagran 5 years ago
parent 4b8009f6d1
commit 3e68a9709c

@ -20,6 +20,7 @@ import (
"go/token"
"go/types"
"golang.org/x/mod/module"
"golang.org/x/mod/semver"
"golang.org/x/tools/go/ast/astutil"
"io"
"io/ioutil"
@ -28,10 +29,9 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"
"runtime"
"strconv"
"strings"
"time"
"unicode"
"mvdan.cc/garble/internal/literals"
@ -115,12 +115,15 @@ var (
)
const (
garbleMapFile = "garble.map"
minGoVersion = 1.15
maxGoVersion = 1.16
supportedGoVersion = "1.15.x"
garbleMapFile = "garble.map"
minGoVersion = "v1.15.0"
supportedGoVersions = "1.15.x"
gitDateLayout = "Mon Jan 2 15:04:05 2006 -0700"
)
var minGoVersionDate = time.Date(2020, 8, 11, 0, 0, 0, 0, time.UTC)
func saveListedPackages(w io.Writer, flags, patterns []string) error {
args := []string{"list", "-json", "-deps", "-export"}
args = append(args, flags...)
@ -244,40 +247,38 @@ func checkGoVersion() bool {
if err != nil {
fmt.Printf(`Can't get go version: %v
Possible reasons:
1. Golang not installed
2. Environment variables $PATH or $GOROOT set incorrectly
3. Unsupported golang version installed (supported %s)
`, err, supportedGoVersion)
This is likely due to go not being installed/setup correctly.
How to install go: https://golang.org/doc/install
`, err)
return false
}
rawVersion := string(bytes.TrimPrefix(bytes.TrimSpace(out), []byte("go version ")))
if strings.Contains(rawVersion, "weekly") || strings.Contains(rawVersion, "devel") {
fmt.Printf(`You use the unstable "%s" golang version.
Garble has not been tested on this version, recommend using supported golang version %s`, rawVersion, supportedGoVersion)
return true
}
versionStr := regexp.MustCompile(`go([1-9][0-9]*)(\.(0|[1-9][0-9]*))?`).FindString(rawVersion)
if versionStr == "" {
fmt.Printf(`Can't recognize golang version: %s
tagIdx := strings.IndexByte(rawVersion, ' ')
tag := rawVersion[:tagIdx]
if tag == "devel" {
commitAndDate := rawVersion[tagIdx+1:]
// Remove commit hash and architecture from version
date := commitAndDate[strings.IndexByte(commitAndDate, ' ')+1 : strings.LastIndexByte(commitAndDate, ' ')]
Possible reasons:
1. Incorrectly installed golang
2. Unsupported golang version installed (supported %s)
`, versionStr, supportedGoVersion)
return false
}
versionDate, err := time.Parse(gitDateLayout, date)
if err != nil {
fmt.Printf(`Can't recognize devel build timestamp: %v`, err)
return true
}
if versionDate.After(minGoVersionDate) {
return true
}
// Error while parsing version is impossible because earlier the string was checked through regexp
version, _ := strconv.ParseFloat(strings.TrimPrefix(versionStr, "go"), 64)
if version < minGoVersion {
fmt.Printf("Outdated golang version %.2f is used, please upgrade golang to %s", version, supportedGoVersion)
fmt.Printf("You use the old unstable \"%s\" golang version, please upgrade golang to %s", rawVersion, supportedGoVersions)
return false
}
if version >= maxGoVersion {
fmt.Printf("Too new golang version %.2f is used, please downgrade golang to %s or try upgrade garble", version, supportedGoVersion)
version := "v" + strings.TrimPrefix(tag, "go")
if semver.Compare(version, minGoVersion) < 0 {
fmt.Printf("Outdated golang version %s is used, please upgrade golang to %s", version, supportedGoVersions)
return false
}

Loading…
Cancel
Save