Commit bc43cc3d authored by Stephen Weinberg's avatar Stephen Weinberg Committed by Russ Cox

path: make Join variadic

R=rsc, r
CC=golang-dev
https://golang.org/cl/198049
parent 0e47c75f
...@@ -115,13 +115,15 @@ func Split(path string) (dir, file string) { ...@@ -115,13 +115,15 @@ func Split(path string) (dir, file string) {
return "", path return "", path
} }
// Join joins dir and file into a single path, adding a separating // Join joins any number of path elemets into a single path, adding a
// slash if necessary. If dir is empty, it returns file. // separating slash if necessary. All empty strings are ignored.
func Join(dir, file string) string { func Join(elem ...string) string {
if dir == "" { for i, e := range elem {
return file if e != "" {
return Clean(strings.Join(elem[i:], "/"))
}
} }
return Clean(dir + "/" + file) return ""
} }
// Ext returns the file name extension used by path. // Ext returns the file name extension used by path.
......
...@@ -92,23 +92,39 @@ func TestSplit(t *testing.T) { ...@@ -92,23 +92,39 @@ func TestSplit(t *testing.T) {
} }
type JoinTest struct { type JoinTest struct {
dir, file, path string elem []string
path string
} }
var jointests = []JoinTest{ var jointests = []JoinTest{
JoinTest{"a", "b", "a/b"}, // zero parameters
JoinTest{"a", "", "a"}, JoinTest{[]string{}, ""},
JoinTest{"", "b", "b"},
JoinTest{"/", "a", "/a"}, // one parameter
JoinTest{"/", "", "/"}, JoinTest{[]string{""}, ""},
JoinTest{"a/", "b", "a/b"}, JoinTest{[]string{"a"}, "a"},
JoinTest{"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) { func TestJoin(t *testing.T) {
for _, test := range jointests { for _, test := range jointests {
if p := Join(test.dir, test.file); p != test.path { if p := join(test.elem); p != test.path {
t.Errorf("Join(%q, %q) = %q, want %q", test.dir, test.file, p, test.path) t.Errorf("join(%q) = %q, want %q", test.elem, p, test.path)
} }
} }
} }
......
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