]> Cypherpunks repositories - gostls13.git/commitdiff
path/filepath: Dir
authorRob Pike <r@golang.org>
Thu, 22 Dec 2011 21:58:58 +0000 (13:58 -0800)
committerRob Pike <r@golang.org>
Thu, 22 Dec 2011 21:58:58 +0000 (13:58 -0800)
There was Base but not Dir, so fill in the gap.

R=n13m3y3r, r, rsc, gustavo
CC=golang-dev
https://golang.org/cl/5503067

src/pkg/path/filepath/path.go
src/pkg/path/filepath/path_test.go

index 68cbae664497ece2ae6fd40b96b516b4b7407d11..f1cda7c53045d59e7b26277aa2bf0912755d3c9e 100644 (file)
@@ -147,6 +147,7 @@ func SplitList(path string) []string {
 // separating it into a directory and file name component.
 // If there is no Separator in path, Split returns an empty dir
 // and file set to path.
+// The returned values have the property that path = dir+file.
 func Split(path string) (dir, file string) {
        vol := VolumeName(path)
        i := len(path) - 1
@@ -439,3 +440,21 @@ func Base(path string) string {
        }
        return path
 }
+
+// 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 && os.IsPathSeparator(dir[last]) {
+               dir = dir[:last]
+       }
+       if dir == "" {
+               dir = "."
+       }
+       return dir
+}
index 67d8858fc333f10a380dde528788b45666fe0861..49a7135b4aed9923376143e03ef3c4cda2cd9a7a 100644 (file)
@@ -431,6 +431,29 @@ func TestBase(t *testing.T) {
        }
 }
 
+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 := filepath.ToSlash(filepath.Dir(test.path)); s != test.result {
+                       t.Errorf("Dir(%q) = %q, want %q", test.path, s, test.result)
+               }
+       }
+}
+
 type IsAbsTest struct {
        path  string
        isAbs bool