From e302b7b8ee5377c4e9682c71e963e82d902b31f7 Mon Sep 17 00:00:00 2001 From: diamondburned Date: Wed, 3 Jul 2019 18:39:32 -0700 Subject: [PATCH 1/5] Uses `go version' and zversion.go to detect version, fixes #433 --- target.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/target.go b/target.go index 53255f8b5d..71a01e8e32 100644 --- a/target.go +++ b/target.go @@ -10,6 +10,7 @@ import ( "os/exec" "os/user" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -384,14 +385,24 @@ func isGoroot(goroot string) bool { // getGorootVersion returns the major and minor version for a given GOROOT path. // If the goroot cannot be determined, (0, 0) is returned. func getGorootVersion(goroot string) (major, minor int, err error) { - data, err := ioutil.ReadFile(filepath.Join(goroot, "VERSION")) - if err != nil { - return 0, 0, err + var s string + + if out, err := exec.Command("go", "version"); err == nil { + s = strings.Fields(out)[2] + } else { + data, err := ioutil.ReadFile(filepath.Join(goroot, "src", "runtime", "internal", "sys", "zversion.go")) + if err != nil { + return 0, 0, err + } + + r := regexp.MustCompile("const TheVersion = `(.*)`") + s = string(r.FindSubmatch(data)[1]) } - s := string(data) - if s[:2] != "go" { + + if s == "" || s[:2] != "go" { return 0, 0, errors.New("could not parse Go version: version does not start with 'go' prefix") } + parts := strings.Split(s[2:], ".") if len(parts) < 2 { return 0, 0, errors.New("could not parse Go version: version has less than two parts") From 7b7285f4d8c540a6ac871cdcae50547b554c3a20 Mon Sep 17 00:00:00 2001 From: diamondburned Date: Wed, 3 Jul 2019 18:51:11 -0700 Subject: [PATCH 2/5] Restored old $GOROOT/VERSION behavior --- target.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/target.go b/target.go index 71a01e8e32..97ede1731c 100644 --- a/target.go +++ b/target.go @@ -389,14 +389,24 @@ func getGorootVersion(goroot string) (major, minor int, err error) { if out, err := exec.Command("go", "version"); err == nil { s = strings.Fields(out)[2] - } else { - data, err := ioutil.ReadFile(filepath.Join(goroot, "src", "runtime", "internal", "sys", "zversion.go")) - if err != nil { - return 0, 0, err - } + + } else if data, err := ioutil.ReadFile(filepath.Join( + goroot, "src", "runtime", "internal", "sys", "zversion.go")); err != nil { r := regexp.MustCompile("const TheVersion = `(.*)`") - s = string(r.FindSubmatch(data)[1]) + matches := r.FindSubmatch(data) + if len(matches) != 2 { + return 0, 0, errors.New("Invalid go version output: " + data) + } + + s = string(matches[1]) + + } else if data, err := ioutil.ReadFile(filepath.Join(goroot, "VERSION")); err != nil { + s = string(data) + } + + if err != nil { + return } if s == "" || s[:2] != "go" { From 5fed8d61e0488462d8c6b391bb80bafa70d35ec3 Mon Sep 17 00:00:00 2001 From: diamondburned Date: Wed, 3 Jul 2019 18:55:12 -0700 Subject: [PATCH 3/5] Fixed error handling --- target.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target.go b/target.go index 97ede1731c..36bf690275 100644 --- a/target.go +++ b/target.go @@ -391,7 +391,7 @@ func getGorootVersion(goroot string) (major, minor int, err error) { s = strings.Fields(out)[2] } else if data, err := ioutil.ReadFile(filepath.Join( - goroot, "src", "runtime", "internal", "sys", "zversion.go")); err != nil { + goroot, "src", "runtime", "internal", "sys", "zversion.go")); err == nil { r := regexp.MustCompile("const TheVersion = `(.*)`") matches := r.FindSubmatch(data) @@ -401,7 +401,7 @@ func getGorootVersion(goroot string) (major, minor int, err error) { s = string(matches[1]) - } else if data, err := ioutil.ReadFile(filepath.Join(goroot, "VERSION")); err != nil { + } else if data, err := ioutil.ReadFile(filepath.Join(goroot, "VERSION")); err == nil { s = string(data) } From 2605b104d66c627a14b510b2ad19096de8c96c36 Mon Sep 17 00:00:00 2001 From: diamondburned Date: Wed, 3 Jul 2019 20:07:36 -0700 Subject: [PATCH 4/5] Fixed err return Removed redundant error Uses `go version' and zversion.go to detect version, fixes #433 --- target.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/target.go b/target.go index 36bf690275..7614b66a5b 100644 --- a/target.go +++ b/target.go @@ -403,10 +403,9 @@ func getGorootVersion(goroot string) (major, minor int, err error) { } else if data, err := ioutil.ReadFile(filepath.Join(goroot, "VERSION")); err == nil { s = string(data) - } - if err != nil { - return + } else { + return 0, 0, err } if s == "" || s[:2] != "go" { From 60dc5d956da15108273753e70196a42e304ad74c Mon Sep 17 00:00:00 2001 From: "diamondburned (Forefront)" Date: Fri, 5 Jul 2019 14:35:06 -0700 Subject: [PATCH 5/5] Removed `go version' check --- target.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/target.go b/target.go index 7614b66a5b..679fa196d5 100644 --- a/target.go +++ b/target.go @@ -387,16 +387,13 @@ func isGoroot(goroot string) bool { func getGorootVersion(goroot string) (major, minor int, err error) { var s string - if out, err := exec.Command("go", "version"); err == nil { - s = strings.Fields(out)[2] - - } else if data, err := ioutil.ReadFile(filepath.Join( + if data, err := ioutil.ReadFile(filepath.Join( goroot, "src", "runtime", "internal", "sys", "zversion.go")); err == nil { r := regexp.MustCompile("const TheVersion = `(.*)`") matches := r.FindSubmatch(data) if len(matches) != 2 { - return 0, 0, errors.New("Invalid go version output: " + data) + return 0, 0, errors.New("Invalid go version output:\n" + string(data)) } s = string(matches[1])