1
0
mirror of https://github.com/golang/go synced 2024-11-25 02:07:58 -07:00

os: make MkdirAll work with symlinks

Fixes #1149.

R=adg
CC=golang-dev
https://golang.org/cl/3564041
This commit is contained in:
Ryan Hitchman 2010-12-10 10:43:45 +11:00 committed by Andrew Gerrand
parent ae60526848
commit 8959851a96
3 changed files with 34 additions and 10 deletions

View File

@ -863,13 +863,14 @@ func TestAppend(t *testing.T) {
} }
func TestStatDirWithTrailingSlash(t *testing.T) { func TestStatDirWithTrailingSlash(t *testing.T) {
// Create new dir, in _obj so it will get // Create new dir, in _test so it will get
// cleaned up by make if not by us. // cleaned up by make if not by us.
path := "_obj/_TestStatDirWithSlash_" path := "_test/_TestStatDirWithSlash_"
err := MkdirAll(path, 0777) err := MkdirAll(path, 0777)
if err != nil { if err != nil {
t.Fatalf("MkdirAll %q: %s", path, err) t.Fatalf("MkdirAll %q: %s", path, err)
} }
defer RemoveAll(path)
// Stat of path should succeed. // Stat of path should succeed.
_, err = Stat(path) _, err = Stat(path)
@ -882,6 +883,4 @@ func TestStatDirWithTrailingSlash(t *testing.T) {
if err != nil { if err != nil {
t.Fatal("stat failed:", err) t.Fatal("stat failed:", err)
} }
RemoveAll("_obj/_TestMkdirAll_")
} }

View File

@ -14,7 +14,7 @@ package os
// and returns nil. // and returns nil.
func MkdirAll(path string, perm uint32) Error { func MkdirAll(path string, perm uint32) Error {
// If path exists, stop with success or error. // If path exists, stop with success or error.
dir, err := Lstat(path) dir, err := Stat(path)
if err == nil { if err == nil {
if dir.IsDirectory() { if dir.IsDirectory() {
return nil return nil

View File

@ -7,17 +7,19 @@ package os_test
import ( import (
. "os" . "os"
"testing" "testing"
"runtime"
"syscall" "syscall"
) )
func TestMkdirAll(t *testing.T) { func TestMkdirAll(t *testing.T) {
// Create new dir, in _obj so it will get // Create new dir, in _test so it will get
// cleaned up by make if not by us. // cleaned up by make if not by us.
path := "_obj/_TestMkdirAll_/dir/./dir2" path := "_test/_TestMkdirAll_/dir/./dir2"
err := MkdirAll(path, 0777) err := MkdirAll(path, 0777)
if err != nil { if err != nil {
t.Fatalf("MkdirAll %q: %s", path, err) t.Fatalf("MkdirAll %q: %s", path, err)
} }
defer RemoveAll("_test/_TestMkdirAll_")
// Already exists, should succeed. // Already exists, should succeed.
err = MkdirAll(path, 0777) err = MkdirAll(path, 0777)
@ -58,13 +60,11 @@ func TestMkdirAll(t *testing.T) {
if perr.Path != fpath { if perr.Path != fpath {
t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", ffpath, perr.Path, fpath) t.Fatalf("MkdirAll %q returned wrong error path: %q not %q", ffpath, perr.Path, fpath)
} }
RemoveAll("_obj/_TestMkdirAll_")
} }
func TestRemoveAll(t *testing.T) { func TestRemoveAll(t *testing.T) {
// Work directory. // Work directory.
path := "_obj/_TestRemoveAll_" path := "_test/_TestRemoveAll_"
fpath := path + "/file" fpath := path + "/file"
dpath := path + "/dir" dpath := path + "/dir"
@ -154,3 +154,28 @@ func TestRemoveAll(t *testing.T) {
t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path) t.Fatalf("Lstat %q succeeded after RemoveAll (final)", path)
} }
} }
func TestMkdirAllWithSymlink(t *testing.T) {
if runtime.GOOS == "windows" {
t.Log("Skipping test: symlinks don't exist under Windows")
return
}
err := Mkdir("_test/dir", 0755)
if err != nil {
t.Fatal(`Mkdir "_test/dir":`, err)
}
defer RemoveAll("_test/dir")
err = Symlink("dir", "_test/link")
if err != nil {
t.Fatal(`Symlink "dir", "_test/link":`, err)
}
defer RemoveAll("_test/link")
path := "_test/link/foo"
err = MkdirAll(path, 0755)
if err != nil {
t.Errorf("MkdirAll %q: %s", path, err)
}
}