]> Cypherpunks repositories - gostls13.git/commitdiff
path: make Join variadic
authorStephen Weinberg <stephen@q5comm.com>
Fri, 5 Feb 2010 10:39:33 +0000 (02:39 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 5 Feb 2010 10:39:33 +0000 (02:39 -0800)
R=rsc, r
CC=golang-dev
https://golang.org/cl/198049

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

index e03f2ecf60e2fa9da74406f98a920ceea4cfe143..c45f77be5522452459678c27b1742414f6cbb6fb 100644 (file)
@@ -115,13 +115,15 @@ func Split(path string) (dir, file string) {
        return "", path
 }
 
-// Join joins dir and file into a single path, adding a separating
-// slash if necessary.  If dir is empty, it returns file.
-func Join(dir, file string) string {
-       if dir == "" {
-               return file
+// Join joins any number of path elemets into a single path, adding a
+// separating slash if necessary.  All empty strings are ignored.
+func Join(elem ...string) string {
+       for i, e := range elem {
+               if e != "" {
+                       return Clean(strings.Join(elem[i:], "/"))
+               }
        }
-       return Clean(dir + "/" + file)
+       return ""
 }
 
 // Ext returns the file name extension used by path.
index 296712e5223183dc6916cee6e4294f32d7c84f5a..cd5978c1566788fb7cab7dfb318990db6aa82dd9 100644 (file)
@@ -92,23 +92,39 @@ func TestSplit(t *testing.T) {
 }
 
 type JoinTest struct {
-       dir, file, path string
+       elem []string
+       path string
 }
 
 var jointests = []JoinTest{
-       JoinTest{"a", "b", "a/b"},
-       JoinTest{"a", "", "a"},
-       JoinTest{"", "b", "b"},
-       JoinTest{"/", "a", "/a"},
-       JoinTest{"/", "", "/"},
-       JoinTest{"a/", "b", "a/b"},
-       JoinTest{"a/", "", "a"},
+       // zero parameters
+       JoinTest{[]string{}, ""},
+
+       // one parameter
+       JoinTest{[]string{""}, ""},
+       JoinTest{[]string{"a"}, "a"},
+
+       // two parameters
+       JoinTest{[]string{"a", "b"}, "a/b"},
+       JoinTest{[]string{"a", ""}, "a"},
+       JoinTest{[]string{"", "b"}, "b"},
+       JoinTest{[]string{"/", "a"}, "/a"},
+       JoinTest{[]string{"/", ""}, "/"},
+       JoinTest{[]string{"a/", "b"}, "a/b"},
+       JoinTest{[]string{"a/", ""}, "a"},
+       JoinTest{[]string{"", ""}, ""},
+}
+
+// join takes a []string and passes it to Join.
+func join(elem []string, args ...string) string {
+       args = elem
+       return Join(args)
 }
 
 func TestJoin(t *testing.T) {
        for _, test := range jointests {
-               if p := Join(test.dir, test.file); p != test.path {
-                       t.Errorf("Join(%q, %q) = %q, want %q", test.dir, test.file, p, test.path)
+               if p := join(test.elem); p != test.path {
+                       t.Errorf("join(%q) = %q, want %q", test.elem, p, test.path)
                }
        }
 }