refactor/rename: don't make backups; overwrite in place, preserving inode.

This avoids littering the tree, and confusing some editors (e.g. Atom)
that expect the inode number to remain constant.

Change-Id: I2faeda1ed1b01e5e4cc720744ea3c99ab29e7333
Reviewed-on: https://go-review.googlesource.com/7664
Reviewed-by: Robert Griesemer <gri@golang.org>
diff --git a/refactor/rename/rename.go b/refactor/rename/rename.go
index 2f86e2e6..d37f5b0 100644
--- a/refactor/rename/rename.go
+++ b/refactor/rename/rename.go
@@ -8,6 +8,7 @@
 package rename // import "golang.org/x/tools/refactor/rename"
 
 import (
+	"bytes"
 	"errors"
 	"fmt"
 	"go/ast"
@@ -15,9 +16,9 @@
 	"go/format"
 	"go/parser"
 	"go/token"
+	"io/ioutil"
 	"os"
 	"path"
-	"path/filepath"
 	"sort"
 	"strconv"
 	"strings"
@@ -459,48 +460,15 @@
 	return ""
 }
 
-func writeFile(name string, fset *token.FileSet, f *ast.File, mode os.FileMode) error {
-	out, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
-	if err != nil {
-		// assume error includes the filename
-		return fmt.Errorf("failed to open file: %s", err)
-	}
-
-	// Oddly, os.OpenFile doesn't preserve all the mode bits, hence
-	// this chmod.  (We use 0600 above to avoid a brief
-	// vulnerability if the user has an insecure umask.)
-	os.Chmod(name, mode) // ignore error
-
-	if err := format.Node(out, fset, f); err != nil {
-		out.Close() // ignore error
-		return fmt.Errorf("failed to write file: %s", err)
-	}
-
-	return out.Close()
-}
-
-var rewriteFile = func(fset *token.FileSet, f *ast.File, orig string) (err error) {
-	backup := orig + ".gorename.backup"
+var rewriteFile = func(fset *token.FileSet, f *ast.File, filename string) (err error) {
 	// TODO(adonovan): print packages and filenames in a form useful
 	// to editors (so they can reload files).
 	if Verbose {
-		fmt.Fprintf(os.Stderr, "\t%s\n", orig)
+		fmt.Fprintf(os.Stderr, "\t%s\n", filename)
 	}
-	// save file mode
-	var mode os.FileMode = 0666
-	if fi, err := os.Stat(orig); err == nil {
-		mode = fi.Mode()
+	var buf bytes.Buffer
+	if err := format.Node(&buf, fset, f); err != nil {
+		return fmt.Errorf("failed to pretty-print syntax tree: %v", err)
 	}
-	if err := os.Rename(orig, backup); err != nil {
-		return fmt.Errorf("failed to make backup %s -> %s: %s",
-			orig, filepath.Base(backup), err)
-	}
-	if err := writeFile(orig, fset, f, mode); err != nil {
-		// Restore the file from the backup.
-		os.Remove(orig)         // ignore error
-		os.Rename(backup, orig) // ignore error
-		return err
-	}
-	os.Remove(backup) // ignore error
-	return nil
+	return ioutil.WriteFile(filename, buf.Bytes(), 0644)
 }