]> Cypherpunks repositories - gostls13.git/commitdiff
os: fix rename on Plan 9
authorDavid du Colombier <0intro@gmail.com>
Thu, 7 Jan 2016 06:45:59 +0000 (07:45 +0100)
committerRuss Cox <rsc@golang.org>
Fri, 8 Jan 2016 14:22:47 +0000 (14:22 +0000)
Rename should remove newname if the file already exists
and is not a directory.

Fixes #13844.

Change-Id: I85a5cc28e8d161637a8bc1de33f4a637d9154cd1
Reviewed-on: https://go-review.googlesource.com/18291
Reviewed-by: Russ Cox <rsc@golang.org>
src/os/file_plan9.go
src/os/os_test.go

index 085ebc4c8a649f300027e7d37232970d749e644e..c83fa028b991bba71ecddc889b7b6e4e95a84d79 100644 (file)
@@ -339,7 +339,9 @@ func rename(oldname, newname string) error {
 
        // If newname still contains slashes after removing the oldname
        // prefix, the rename is cross-directory and must be rejected.
-       // This case is caught by d.Marshal below.
+       if lastIndex(newname, '/') >= 0 {
+               return &LinkError{"rename", oldname, newname, ErrInvalid}
+       }
 
        var d syscall.Dir
 
@@ -351,6 +353,13 @@ func rename(oldname, newname string) error {
        if err != nil {
                return &LinkError{"rename", oldname, newname, err}
        }
+
+       // If newname already exists and is not a directory, rename replaces it.
+       f, err := Stat(dirname + newname)
+       if err == nil && !f.IsDir() {
+               Remove(dirname + newname)
+       }
+
        if err = syscall.Wstat(oldname, buf[:n]); err != nil {
                return &LinkError{"rename", oldname, newname, err}
        }
index 5689e775f7edcdec8b5ce30ee2e48e03c7d2de68..945724b2b259652d72b55e6cba57baab2b421647 100644 (file)
@@ -773,9 +773,6 @@ func TestRename(t *testing.T) {
 }
 
 func TestRenameOverwriteDest(t *testing.T) {
-       if runtime.GOOS == "plan9" {
-               t.Skip("skipping on plan9")
-       }
        defer chtmpdir(t)()
        from, to := "renamefrom", "renameto"
        // Just in case.