From 6a66ca1770c3eb599ffdcc29b99bb36b920b597e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 13 Apr 2016 17:24:14 -0400 Subject: [PATCH] Add support for Windows paths, fix file handling errors for Windows --- bootstrap/bootstrap.go | 13 +++++++++---- parser/parser_unix.go | 2 ++ parser/parser_windows.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 parser/parser_windows.go diff --git a/bootstrap/bootstrap.go b/bootstrap/bootstrap.go index 3b04fb1..d7cd30b 100644 --- a/bootstrap/bootstrap.go +++ b/bootstrap/bootstrap.go @@ -119,9 +119,13 @@ func (g *Generator) writeMain() (path string, err error) { fmt.Fprintln(f, " }") fmt.Fprintln(f, "}") - p := f.Name() - os.Rename(p, p+".go") - return p + ".go", f.Close() + src := f.Name() + if err := f.Close(); err != nil { + return src, err + } + + dest := src + ".go" + return dest, os.Rename(src, dest) } func (g *Generator) Run() error { @@ -144,7 +148,6 @@ func (g *Generator) Run() error { if err != nil { return err } - defer f.Close() if !g.LeaveTemps { defer os.Remove(f.Name()) // will not remove after rename } @@ -156,6 +159,8 @@ func (g *Generator) Run() error { return err } + f.Close() + if !g.NoFormat { cmd = exec.Command("gofmt", "-w", f.Name()) cmd.Stderr = os.Stderr diff --git a/parser/parser_unix.go b/parser/parser_unix.go index 472be63..2142aaa 100644 --- a/parser/parser_unix.go +++ b/parser/parser_unix.go @@ -1,3 +1,5 @@ +// +build !windows + package parser import ( diff --git a/parser/parser_windows.go b/parser/parser_windows.go new file mode 100644 index 0000000..76140a9 --- /dev/null +++ b/parser/parser_windows.go @@ -0,0 +1,33 @@ +package parser + +import ( + "fmt" + "os" + "path" + "strings" +) + +func normalizePath(path string) string { + return strings.Replace(path, "\\", "/", -1) +} + +func getPkgPath(fname string) (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 { + return path.Dir(rel), nil + } + } + + return "", fmt.Errorf("file '%v' is not in GOPATH", fname) +}