Commit 62b5c7c6 authored by Rob Pike's avatar Rob Pike

add path.Base, analogous to Unix basename

R=rsc
CC=golang-dev
https://golang.org/cl/1633042
parent 5f0319c0
......@@ -186,3 +186,25 @@ func Walk(root string, v Visitor, errors chan<- os.Error) {
}
walk(root, f, v, errors)
}
// Base returns the last path element of the slash-separated name.
// Trailing slashes are removed before extracting the last element. If the name is
// empty, "." is returned. If it consists entirely of slashes, "/" is returned.
func Base(name string) string {
if name == "" {
return "."
}
// Strip trailing slashes.
for len(name) > 0 && name[len(name)-1] == '/' {
name = name[0 : len(name)-1]
}
// Find the last element
if i := strings.LastIndex(name, "/"); i >= 0 {
name = name[i+1:]
}
// If empty now, it had only slashes.
if name == "" {
return "/"
}
return name
}
......@@ -284,3 +284,26 @@ func TestWalk(t *testing.T) {
t.Errorf("removeTree: %v", err)
}
}
var basetests = []CleanTest{
// Already clean
CleanTest{"", "."},
CleanTest{".", "."},
CleanTest{"/.", "."},
CleanTest{"/", "/"},
CleanTest{"////", "/"},
CleanTest{"x/", "x"},
CleanTest{"abc", "abc"},
CleanTest{"abc/def", "def"},
CleanTest{"a/b/.x", ".x"},
CleanTest{"a/b/c.", "c."},
CleanTest{"a/b/c.x", "c.x"},
}
func TestBase(t *testing.T) {
for _, test := range basetests {
if s := Base(test.path); s != test.clean {
t.Errorf("Base(%q) = %q, want %q", test.path, s, test.clean)
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment