1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:34:40 -07:00

path: Dir

There was Base but not Dir, so fill in the gap.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5504076
This commit is contained in:
Rob Pike 2011-12-22 14:08:34 -08:00
parent c0589a21c9
commit b6122b0a64
2 changed files with 49 additions and 8 deletions

View File

@ -160,3 +160,21 @@ func Base(path string) string {
func IsAbs(path string) bool { func IsAbs(path string) bool {
return len(path) > 0 && path[0] == '/' return len(path) > 0 && path[0] == '/'
} }
// Dir returns the all but the last element of path, typically the path's directory.
// Trailing path separators are removed before processing.
// If the path is empty, Dir returns ".".
// 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.
func Dir(path string) string {
dir, _ := Split(path)
dir = Clean(dir)
last := len(dir) - 1
if last > 0 && dir[last] == '/' {
dir = dir[:last]
}
if dir == "" {
dir = "."
}
return dir
}

View File

@ -8,11 +8,11 @@ import (
"testing" "testing"
) )
type CleanTest struct { type PathTest struct {
path, clean string path, result string
} }
var cleantests = []CleanTest{ var cleantests = []PathTest{
// Already clean // Already clean
{"", "."}, {"", "."},
{"abc", "abc"}, {"abc", "abc"},
@ -64,8 +64,8 @@ var cleantests = []CleanTest{
func TestClean(t *testing.T) { func TestClean(t *testing.T) {
for _, test := range cleantests { for _, test := range cleantests {
if s := Clean(test.path); s != test.clean { if s := Clean(test.path); s != test.result {
t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.clean) t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result)
} }
} }
} }
@ -148,7 +148,7 @@ func TestExt(t *testing.T) {
} }
} }
var basetests = []CleanTest{ var basetests = []PathTest{
// Already clean // Already clean
{"", "."}, {"", "."},
{".", "."}, {".", "."},
@ -165,8 +165,31 @@ var basetests = []CleanTest{
func TestBase(t *testing.T) { func TestBase(t *testing.T) {
for _, test := range basetests { for _, test := range basetests {
if s := Base(test.path); s != test.clean { if s := Base(test.path); s != test.result {
t.Errorf("Base(%q) = %q, want %q", test.path, s, test.clean) t.Errorf("Base(%q) = %q, want %q", test.path, s, test.result)
}
}
}
var dirtests = []PathTest{
{"", "."},
{".", "."},
{"/.", "/"},
{"/", "/"},
{"////", "/"},
{"/foo", "/"},
{"x/", "x"},
{"abc", "."},
{"abc/def", "abc"},
{"a/b/.x", "a/b"},
{"a/b/c.", "a/b"},
{"a/b/c.x", "a/b"},
}
func TestDir(t *testing.T) {
for _, test := range dirtests {
if s := Dir(test.path); s != test.result {
t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
} }
} }
} }