package parser import ( "fmt" "os" "path" "path/filepath" "strings" ) func normalizePath(path string) string { // use lower case, as Windows file systems will almost always be case insensitive return strings.ToLower(strings.Replace(path, "\\", "/", -1)) } func getPkgPath(fname string, isDir bool) (string, error) { // path.IsAbs doesn't work properly on Windows; use filepath.IsAbs instead if !filepath.IsAbs(fname) { pwd, err := os.Getwd() if err != nil { return "", err } fname = path.Join(pwd, fname) } fname = normalizePath(fname) gopath := os.Getenv("GOPATH") if gopath == "" { var err error gopath, err = getDefaultGoPath() if err != nil { return "", fmt.Errorf("cannot determine GOPATH: %s", err) } } for _, p := range strings.Split(os.Getenv("GOPATH"), ";") { prefix := path.Join(normalizePath(p), "src") + "/" if rel := strings.TrimPrefix(fname, prefix); rel != fname { if !isDir { return path.Dir(rel), nil } else { return path.Clean(rel), nil } } } return "", fmt.Errorf("file '%v' is not in GOPATH", fname) }