aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/path
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2010-06-09 19:59:22 -0700
committerRob Pike <r@golang.org>2010-06-09 19:59:22 -0700
commit62b5c7c69d8f77e97ccdb0958f33b515801f11d6 (patch)
treee17a7f849babe48bd6aa5c3fd8b048af83c89dcc /src/pkg/path
parent5f0319c0a64672f6fa761bfb2258915d2bac0dee (diff)
downloadgo-62b5c7c69d8f77e97ccdb0958f33b515801f11d6.tar.xz
add path.Base, analogous to Unix basename
R=rsc CC=golang-dev https://golang.org/cl/1633042
Diffstat (limited to 'src/pkg/path')
-rw-r--r--src/pkg/path/path.go22
-rw-r--r--src/pkg/path/path_test.go23
2 files changed, 45 insertions, 0 deletions
diff --git a/src/pkg/path/path.go b/src/pkg/path/path.go
index 86bfe64555..9c1d09374c 100644
--- a/src/pkg/path/path.go
+++ b/src/pkg/path/path.go
@@ -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
+}
diff --git a/src/pkg/path/path_test.go b/src/pkg/path/path_test.go
index e2458f20c4..6915b48bbb 100644
--- a/src/pkg/path/path_test.go
+++ b/src/pkg/path/path_test.go
@@ -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)
+ }
+ }
+}