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 ""
 | 
						|
}
 |