internal/diff: flush to disk before diffing

Flush strings to disk before diffing files.

Change-Id: I91c47bfe352ee833a164fa7de00341e96498bc96
Reviewed-on: https://go-review.googlesource.com/39235
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/diff/diff.go b/internal/diff/diff.go
index 09d3047..bc6b9a2 100644
--- a/internal/diff/diff.go
+++ b/internal/diff/diff.go
@@ -12,6 +12,22 @@
 	"runtime"
 )
 
+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
+}
+
 // Diff returns a human-readable description of the differences between s1 and s2.
 // If the "diff" command is available, it returns the output of unified diff on s1 and s2.
 // If the result is non-empty, the strings differ or the diff command failed.
@@ -22,29 +38,24 @@
 	if _, err := exec.LookPath("diff"); err != nil {
 		return fmt.Sprintf("diff command unavailable\nold: %q\nnew: %q", s1, s2)
 	}
-	f1, err := ioutil.TempFile("", "benchfmt_test")
+	f1, err := writeTempFile("", "benchfmt_test", []byte(s1))
 	if err != nil {
 		return err.Error()
 	}
-	defer os.Remove(f1.Name())
-	defer f1.Close()
+	defer os.Remove(f1)
 
-	f2, err := ioutil.TempFile("", "benchfmt_test")
+	f2, err := writeTempFile("", "benchfmt_test", []byte(s2))
 	if err != nil {
 		return err.Error()
 	}
-	defer os.Remove(f2.Name())
-	defer f2.Close()
-
-	f1.Write([]byte(s1))
-	f2.Write([]byte(s2))
+	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.
@@ -54,5 +65,4 @@
 		data = append(data, []byte(err.Error())...)
 	}
 	return string(data)
-
 }