Added more detailed error description

pull/136/head
Pagran 5 years ago
parent 50eaea4396
commit 4b8009f6d1

@ -30,6 +30,7 @@ import (
"path/filepath"
"regexp"
"runtime"
"strconv"
"strings"
"unicode"
@ -115,7 +116,9 @@ var (
const (
garbleMapFile = "garble.map"
supportedGoVersion = "go1.15"
minGoVersion = 1.15
maxGoVersion = 1.16
supportedGoVersion = "1.15.x"
)
func saveListedPackages(w io.Writer, flags, patterns []string) error {
@ -236,27 +239,49 @@ func main1() int {
return 0
}
func checkGoVersion() error {
func checkGoVersion() bool {
out, err := exec.Command("go", "version").CombinedOutput()
if err != nil {
return fmt.Errorf("%v: %s", err, out)
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)
return false
}
rawVersion := string(bytes.TrimSpace(out))
rawVersion := string(bytes.TrimPrefix(bytes.TrimSpace(out), []byte("go version ")))
if strings.Contains(rawVersion, "weekly") || strings.Contains(rawVersion, "devel") {
fmt.Printf("Warning! Unstable \"%s\" version is used", rawVersion)
return nil
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
}
version := regexp.MustCompile(`go([1-9][0-9]*)(\.(0|[1-9][0-9]*))?`).FindString(rawVersion)
if version == "" {
return fmt.Errorf("unsupported \"%s\" version", rawVersion)
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
Possible reasons:
1. Incorrectly installed golang
2. Unsupported golang version installed (supported %s)
`, versionStr, supportedGoVersion)
return false
}
if version != supportedGoVersion {
return fmt.Errorf("unsupported %s version", version)
// 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)
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)
return false
}
return nil
return true
}
func mainErr(args []string) error {
@ -265,8 +290,8 @@ func mainErr(args []string) error {
case "help":
flagSet.Usage()
case "build", "test":
if err := checkGoVersion(); err != nil {
return err
if !checkGoVersion() {
return nil
}
// Split the flags from the package arguments, since we'll need
// to run 'go list' on the same set of packages.

Loading…
Cancel
Save