parser_windows.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package parser
  2. import (
  3. "fmt"
  4. "os"
  5. "path"
  6. "path/filepath"
  7. "strings"
  8. )
  9. func normalizePath(path string) string {
  10. // use lower case, as Windows file systems will almost always be case insensitive
  11. return strings.ToLower(strings.Replace(path, "\\", "/", -1))
  12. }
  13. func getPkgPath(fname string, isDir bool) (string, error) {
  14. // path.IsAbs doesn't work properly on Windows; use filepath.IsAbs instead
  15. if !filepath.IsAbs(fname) {
  16. pwd, err := os.Getwd()
  17. if err != nil {
  18. return "", err
  19. }
  20. fname = path.Join(pwd, fname)
  21. }
  22. fname = normalizePath(fname)
  23. gopath := os.Getenv("GOPATH")
  24. if gopath == "" {
  25. var err error
  26. gopath, err = getDefaultGoPath()
  27. if err != nil {
  28. return "", fmt.Errorf("cannot determine GOPATH: %s", err)
  29. }
  30. }
  31. for _, p := range strings.Split(os.Getenv("GOPATH"), ";") {
  32. prefix := path.Join(normalizePath(p), "src") + "/"
  33. if rel := strings.TrimPrefix(fname, prefix); rel != fname {
  34. if !isDir {
  35. return path.Dir(rel), nil
  36. } else {
  37. return path.Clean(rel), nil
  38. }
  39. }
  40. }
  41. return "", fmt.Errorf("file '%v' is not in GOPATH", fname)
  42. }