aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2009-12-04 11:46:56 -0800
committerIan Lance Taylor <iant@golang.org>2009-12-04 11:46:56 -0800
commit0b5cc3169361981e221bb9f9b42226352979444f (patch)
tree4b675ae93e57f0c54e6fe7f447f7091720dc221a
parentd1740bb3a6e9868c2d0786438b907b96b80f1a0f (diff)
downloadgo-0b5cc3169361981e221bb9f9b42226352979444f.tar.gz
go-0b5cc3169361981e221bb9f9b42226352979444f.zip
Add os.Rename.
R=rsc https://golang.org/cl/166058
-rw-r--r--src/pkg/os/file.go11
-rw-r--r--src/pkg/os/os_test.go21
2 files changed, 31 insertions, 1 deletions
diff --git a/src/pkg/os/file.go b/src/pkg/os/file.go
index dc722055a5..03c6d57018 100644
--- a/src/pkg/os/file.go
+++ b/src/pkg/os/file.go
@@ -370,7 +370,7 @@ func Remove(name string) Error {
return &PathError{"remove", name, Errno(e)};
}
-// LinkError records an error during a link or symlink
+// LinkError records an error during a link or symlink or rename
// system call and the paths that caused it.
type LinkError struct {
Op string;
@@ -418,6 +418,15 @@ func Readlink(name string) (string, Error) {
return "", nil;
}
+// Rename renames a file.
+func Rename(oldname, newname string) Error {
+ e := syscall.Rename(oldname, newname);
+ if e != 0 {
+ return &LinkError{"rename", oldname, newname, Errno(e)}
+ }
+ return nil;
+}
+
// Chmod changes the mode of the named file to mode.
// If the file is a symbolic link, it changes the uid and gid of the link's target.
func Chmod(name string, mode int) Error {
diff --git a/src/pkg/os/os_test.go b/src/pkg/os/os_test.go
index ed3d955cb3..7ff2bddb3c 100644
--- a/src/pkg/os/os_test.go
+++ b/src/pkg/os/os_test.go
@@ -315,6 +315,27 @@ func TestLongSymlink(t *testing.T) {
}
}
+func TestRename(t *testing.T) {
+ from, to := "renamefrom", "renameto";
+ Remove(to); // Just in case.
+ file, err := Open(from, O_CREAT|O_WRONLY, 0666);
+ if err != nil {
+ t.Fatalf("open %q failed: %v", to, err)
+ }
+ if err = file.Close(); err != nil {
+ t.Errorf("close %q failed: %v", to, err)
+ }
+ err = Rename(from, to);
+ if err != nil {
+ t.Fatalf("rename %q, %q failed: %v", to, from, err)
+ }
+ defer Remove(to);
+ _, err = Stat(to);
+ if err != nil {
+ t.Errorf("stat %q failed: %v", to, err)
+ }
+}
+
func TestForkExec(t *testing.T) {
r, w, err := Pipe();
if err != nil {