mirror of
https://github.com/astaxie/beego.git
synced 2024-11-14 07:00:56 +00:00
581e48679e
Fix issue 3866
90 lines
1.6 KiB
Go
90 lines
1.6 KiB
Go
package utils
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// GetGOPATHs returns all paths in GOPATH variable.
|
|
func GetGOPATHs() []string {
|
|
gopath := os.Getenv("GOPATH")
|
|
if gopath == "" && compareGoVersion(runtime.Version(), "go1.8") >= 0 {
|
|
gopath = defaultGOPATH()
|
|
}
|
|
return filepath.SplitList(gopath)
|
|
}
|
|
|
|
func compareGoVersion(a, b string) int {
|
|
reg := regexp.MustCompile("^\\d*")
|
|
|
|
a = strings.TrimPrefix(a, "go")
|
|
b = strings.TrimPrefix(b, "go")
|
|
|
|
versionsA := strings.Split(a, ".")
|
|
versionsB := strings.Split(b, ".")
|
|
|
|
for i := 0; i < len(versionsA) && i < len(versionsB); i++ {
|
|
versionA := versionsA[i]
|
|
versionB := versionsB[i]
|
|
|
|
vA, err := strconv.Atoi(versionA)
|
|
if err != nil {
|
|
str := reg.FindString(versionA)
|
|
if str != "" {
|
|
vA, _ = strconv.Atoi(str)
|
|
} else {
|
|
vA = -1
|
|
}
|
|
}
|
|
|
|
vB, err := strconv.Atoi(versionB)
|
|
if err != nil {
|
|
str := reg.FindString(versionB)
|
|
if str != "" {
|
|
vB, _ = strconv.Atoi(str)
|
|
} else {
|
|
vB = -1
|
|
}
|
|
}
|
|
|
|
if vA > vB {
|
|
// vA = 12, vB = 8
|
|
return 1
|
|
} else if vA < vB {
|
|
// vA = 6, vB = 8
|
|
return -1
|
|
} else if vA == -1 {
|
|
// vA = rc1, vB = rc3
|
|
return strings.Compare(versionA, versionB)
|
|
}
|
|
|
|
// vA = vB = 8
|
|
continue
|
|
}
|
|
|
|
if len(versionsA) > len(versionsB) {
|
|
return 1
|
|
} else if len(versionsA) == len(versionsB) {
|
|
return 0
|
|
}
|
|
|
|
return -1
|
|
}
|
|
|
|
func defaultGOPATH() string {
|
|
env := "HOME"
|
|
if runtime.GOOS == "windows" {
|
|
env = "USERPROFILE"
|
|
} else if runtime.GOOS == "plan9" {
|
|
env = "home"
|
|
}
|
|
if home := os.Getenv(env); home != "" {
|
|
return filepath.Join(home, "go")
|
|
}
|
|
return ""
|
|
}
|