mirror of
https://github.com/golang/go.git
synced 2025-05-29 11:25:43 +00:00
os: fix rename on Plan 9
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>
This commit is contained in:
parent
9a2d717fa9
commit
161f2e85ee
@ -339,7 +339,9 @@ func rename(oldname, newname string) error {
|
|||||||
|
|
||||||
// If newname still contains slashes after removing the oldname
|
// If newname still contains slashes after removing the oldname
|
||||||
// prefix, the rename is cross-directory and must be rejected.
|
// 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
|
var d syscall.Dir
|
||||||
|
|
||||||
@ -351,6 +353,13 @@ func rename(oldname, newname string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return &LinkError{"rename", oldname, newname, err}
|
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 {
|
if err = syscall.Wstat(oldname, buf[:n]); err != nil {
|
||||||
return &LinkError{"rename", oldname, newname, err}
|
return &LinkError{"rename", oldname, newname, err}
|
||||||
}
|
}
|
||||||
|
@ -773,9 +773,6 @@ func TestRename(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRenameOverwriteDest(t *testing.T) {
|
func TestRenameOverwriteDest(t *testing.T) {
|
||||||
if runtime.GOOS == "plan9" {
|
|
||||||
t.Skip("skipping on plan9")
|
|
||||||
}
|
|
||||||
defer chtmpdir(t)()
|
defer chtmpdir(t)()
|
||||||
from, to := "renamefrom", "renameto"
|
from, to := "renamefrom", "renameto"
|
||||||
// Just in case.
|
// Just in case.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user