1
0
mirror of https://github.com/golang/go synced 2024-11-21 23:34:42 -07:00

path/filepath: implement Base and Dir for windows

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5501069
This commit is contained in:
Alex Brainman 2011-12-23 13:23:07 +11:00
parent 0f14ebf993
commit 5962ef2c00
2 changed files with 53 additions and 7 deletions

View File

@ -426,6 +426,8 @@ func Base(path string) string {
for len(path) > 0 && os.IsPathSeparator(path[len(path)-1]) { for len(path) > 0 && os.IsPathSeparator(path[len(path)-1]) {
path = path[0 : len(path)-1] path = path[0 : len(path)-1]
} }
// Throw away volume name
path = path[len(VolumeName(path)):]
// Find the last element // Find the last element
i := len(path) - 1 i := len(path) - 1
for i >= 0 && !os.IsPathSeparator(path[i]) { for i >= 0 && !os.IsPathSeparator(path[i]) {
@ -447,8 +449,12 @@ func Base(path string) string {
// If the path consists entirely of separators, Dir returns a single separator. // If the path consists entirely of separators, Dir returns a single separator.
// The returned path does not end in a separator unless it is the root directory. // The returned path does not end in a separator unless it is the root directory.
func Dir(path string) string { func Dir(path string) string {
dir, _ := Split(path) vol := VolumeName(path)
dir = Clean(dir) i := len(path) - 1
for i >= len(vol) && !os.IsPathSeparator(path[i]) {
i--
}
dir := Clean(path[len(vol) : i+1])
last := len(dir) - 1 last := len(dir) - 1
if last > 0 && os.IsPathSeparator(dir[last]) { if last > 0 && os.IsPathSeparator(dir[last]) {
dir = dir[:last] dir = dir[:last]
@ -456,5 +462,5 @@ func Dir(path string) string {
if dir == "" { if dir == "" {
dir = "." dir = "."
} }
return dir return vol + dir
} }

View File

@ -423,9 +423,29 @@ var basetests = []PathTest{
{"a/b/c.x", "c.x"}, {"a/b/c.x", "c.x"},
} }
var winbasetests = []PathTest{
{`c:\`, `\`},
{`c:.`, `.`},
{`c:\a\b`, `b`},
{`c:a\b`, `b`},
{`c:a\b\c`, `c`},
{`\\host\share\`, `\`},
{`\\host\share\a`, `a`},
{`\\host\share\a\b`, `b`},
}
func TestBase(t *testing.T) { func TestBase(t *testing.T) {
for _, test := range basetests { tests := basetests
if s := filepath.ToSlash(filepath.Base(test.path)); s != test.result { if runtime.GOOS == "windows" {
// make unix tests work on windows
for i, _ := range tests {
tests[i].result = filepath.Clean(tests[i].result)
}
// add windows specific tests
tests = append(tests, winbasetests...)
}
for _, test := range tests {
if s := filepath.Base(test.path); s != test.result {
t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result) t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result)
} }
} }
@ -446,9 +466,29 @@ var dirtests = []PathTest{
{"a/b/c.x", "a/b"}, {"a/b/c.x", "a/b"},
} }
var windirtests = []PathTest{
{`c:\`, `c:\`},
{`c:.`, `c:.`},
{`c:\a\b`, `c:\a`},
{`c:a\b`, `c:a`},
{`c:a\b\c`, `c:a\b`},
{`\\host\share\`, `\\host\share\`},
{`\\host\share\a`, `\\host\share\`},
{`\\host\share\a\b`, `\\host\share\a`},
}
func TestDir(t *testing.T) { func TestDir(t *testing.T) {
for _, test := range dirtests { tests := dirtests
if s := filepath.ToSlash(filepath.Dir(test.path)); s != test.result { if runtime.GOOS == "windows" {
// make unix tests work on windows
for i, _ := range tests {
tests[i].result = filepath.Clean(tests[i].result)
}
// add windows specific tests
tests = append(tests, windirtests...)
}
for _, test := range tests {
if s := filepath.Dir(test.path); s != test.result {
t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result) t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
} }
} }