From e86168430f0aab8f971763e4b00c2aae7bec55f0 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Fri, 10 Feb 2017 11:30:22 +0200 Subject: [PATCH] cmd/fix,cmd/gofmt: flush to disk before diffing Flush file content to disk before diffing files, may cause unpredictable results on Windows. Convert from \r\n to \n when comparing diff result. Change-Id: Ibcd6154a2382dba1338ee5674333611aea16bb65 Reviewed-on: https://go-review.googlesource.com/36750 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer --- src/cmd/fix/main.go | 39 ++++++++++++++++++++++++++----------- src/cmd/gofmt/gofmt.go | 35 ++++++++++++++++++++------------- src/cmd/gofmt/gofmt_test.go | 5 +++++ 3 files changed, 55 insertions(+), 24 deletions(-) diff --git a/src/cmd/fix/main.go b/src/cmd/fix/main.go index 3b4130b3bf..f06abae171 100644 --- a/src/cmd/fix/main.go +++ b/src/cmd/fix/main.go @@ -17,6 +17,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "sort" "strings" ) @@ -237,25 +238,41 @@ func isGoFile(f os.FileInfo) bool { return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") } +func writeTempFile(dir, prefix string, data []byte) (string, error) { + file, err := ioutil.TempFile(dir, prefix) + if err != nil { + return "", err + } + _, err = file.Write(data) + if err1 := file.Close(); err == nil { + err = err1 + } + if err != nil { + os.Remove(file.Name()) + return "", err + } + return file.Name(), nil +} + func diff(b1, b2 []byte) (data []byte, err error) { - f1, err := ioutil.TempFile("", "go-fix") + f1, err := writeTempFile("", "go-fix", b1) if err != nil { - return nil, err + return } - defer os.Remove(f1.Name()) - defer f1.Close() + defer os.Remove(f1) - f2, err := ioutil.TempFile("", "go-fix") + f2, err := writeTempFile("", "go-fix", b2) if err != nil { - return nil, err + return } - defer os.Remove(f2.Name()) - defer f2.Close() + defer os.Remove(f2) - f1.Write(b1) - f2.Write(b2) + cmd := "diff" + if runtime.GOOS == "plan9" { + cmd = "/bin/ape/diff" + } - data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() + data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput() if len(data) > 0 { // diff exits with a non-zero status when the files don't match. // Ignore that failure as long as we get output. diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index ff38df7ee4..d5b7be327a 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -225,36 +225,45 @@ func gofmtMain() { } } +func writeTempFile(dir, prefix string, data []byte) (string, error) { + file, err := ioutil.TempFile(dir, prefix) + if err != nil { + return "", err + } + _, err = file.Write(data) + if err1 := file.Close(); err == nil { + err = err1 + } + if err != nil { + os.Remove(file.Name()) + return "", err + } + return file.Name(), nil +} + func diff(b1, b2 []byte, filename string) (data []byte, err error) { - f1, err := ioutil.TempFile("", "gofmt") + f1, err := writeTempFile("", "gofmt", b1) if err != nil { return } - defer os.Remove(f1.Name()) - defer f1.Close() + defer os.Remove(f1) - f2, err := ioutil.TempFile("", "gofmt") + f2, err := writeTempFile("", "gofmt", b2) if err != nil { return } - defer os.Remove(f2.Name()) - defer f2.Close() - - f1.Write(b1) - f2.Write(b2) + defer os.Remove(f2) cmd := "diff" if runtime.GOOS == "plan9" { cmd = "/bin/ape/diff" } - data, err = exec.Command(cmd, "-u", f1.Name(), f2.Name()).CombinedOutput() + data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput() if len(data) > 0 { // diff exits with a non-zero status when the files don't match. // Ignore that failure as long as we get output. - err = nil - - data, err = replaceTempFilename(data, filename) + return replaceTempFilename(data, filename) } return } diff --git a/src/cmd/gofmt/gofmt_test.go b/src/cmd/gofmt/gofmt_test.go index 76fb250f4d..16b653b646 100644 --- a/src/cmd/gofmt/gofmt_test.go +++ b/src/cmd/gofmt/gofmt_test.go @@ -198,6 +198,11 @@ func TestDiff(t *testing.T) { if err != nil { t.Fatal(err) } + + if runtime.GOOS == "windows" { + b = bytes.Replace(b, []byte{'\r', '\n'}, []byte{'\n'}, -1) + } + bs := bytes.SplitN(b, []byte{'\n'}, 3) line0, line1 := bs[0], bs[1] -- 2.51.0