From 837ced40470c99741073ae5dd4d187587b8a6325 Mon Sep 17 00:00:00 2001 From: flat20 Date: Tue, 18 Apr 2017 19:43:39 +0100 Subject: [PATCH] Updated getPkgPath to use package filepath, rather than path. Fixes an issue with os.Getwd() returning a random letter case drive letter on Windows, making the working directory unequal to GOPATH. --- parser/parser.go | 30 ++++++++++++++++++++++++++ parser/parser_test.go | 26 +++++++++++++++++++++++ parser/parser_unix.go | 30 ++------------------------ parser/parser_windows.go | 46 ++++++++-------------------------------- 4 files changed, 67 insertions(+), 65 deletions(-) create mode 100644 parser/parser_test.go diff --git a/parser/parser.go b/parser/parser.go index 1c0b94c..b8b9852 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -1,9 +1,13 @@ package parser import ( + "fmt" "go/ast" "go/parser" "go/token" + "os" + "path" + "path/filepath" "strings" ) @@ -89,3 +93,29 @@ func (p *Parser) Parse(fname string, isDir bool) error { } return nil } + +func getPkgPath(fname string, isDir bool) (string, error) { + fname, err := filepath.Abs(fname) + if err != nil { + return "", err + } + + for _, p := range filepath.SplitList(os.Getenv("GOPATH")) { + gopath := filepath.Join(p, "src") + pkg, err := filepath.Rel(gopath, fname) + if err != nil { + continue + } + + if pkg != fname { + p := normalizePath(pkg) + + if !isDir { + return path.Dir(p), nil + } + return p, nil + } + } + + return "", fmt.Errorf("file '%v' is not in GOPATH", fname) +} diff --git a/parser/parser_test.go b/parser/parser_test.go new file mode 100644 index 0000000..7be4654 --- /dev/null +++ b/parser/parser_test.go @@ -0,0 +1,26 @@ +package parser + +import "testing" + +func TestGetPkgPath(t *testing.T) { + cases := []struct { + fname string + isDir bool + }{ + {"parser.go", false}, + {".", true}, + } + exp := "github.com/mailru/easyjson/parser" + + for _, tc := range cases { + + pkg, err := getPkgPath(tc.fname, tc.isDir) + if err != nil { + t.Error(err) + } + if pkg != exp { + t.Errorf("in: \"%s\" isDir: %v want: %s got: %s", tc.fname, tc.isDir, exp, pkg) + } + } + +} diff --git a/parser/parser_unix.go b/parser/parser_unix.go index a1b9d84..a5a9451 100644 --- a/parser/parser_unix.go +++ b/parser/parser_unix.go @@ -2,32 +2,6 @@ package parser -import ( - "fmt" - "os" - "path" - "strings" -) - -func getPkgPath(fname string, isDir bool) (string, error) { - if !path.IsAbs(fname) { - pwd, err := os.Getwd() - if err != nil { - return "", err - } - fname = path.Join(pwd, fname) - } - - for _, p := range strings.Split(os.Getenv("GOPATH"), ":") { - prefix := path.Join(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) +func normalizePath(path string) string { + return path } diff --git a/parser/parser_windows.go b/parser/parser_windows.go index 64974aa..cd4be7c 100644 --- a/parser/parser_windows.go +++ b/parser/parser_windows.go @@ -1,37 +1,9 @@ -package parser - -import ( - "fmt" - "os" - "path" - "strings" -) - -func normalizePath(path string) string { - return strings.Replace(path, "\\", "/", -1) -} - -func getPkgPath(fname string, isDir bool) (string, error) { - if !path.IsAbs(fname) { - pwd, err := os.Getwd() - if err != nil { - return "", err - } - fname = path.Join(pwd, fname) - } - - fname = normalizePath(fname) - - 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) -} +package parser + +import ( + "strings" +) + +func normalizePath(path string) string { + return strings.Replace(path, "\\", "/", -1) +}