diff options
Diffstat (limited to 'libgo/go/path')
-rw-r--r-- | libgo/go/path/filepath/example_unix_test.go | 39 | ||||
-rw-r--r-- | libgo/go/path/filepath/match_test.go | 3 | ||||
-rw-r--r-- | libgo/go/path/filepath/path.go | 9 | ||||
-rw-r--r-- | libgo/go/path/filepath/path_plan9.go | 7 | ||||
-rw-r--r-- | libgo/go/path/filepath/path_test.go | 57 | ||||
-rw-r--r-- | libgo/go/path/filepath/path_unix.go | 7 | ||||
-rw-r--r-- | libgo/go/path/filepath/path_windows.go | 33 | ||||
-rw-r--r-- | libgo/go/path/path_test.go | 27 |
8 files changed, 143 insertions, 39 deletions
diff --git a/libgo/go/path/filepath/example_unix_test.go b/libgo/go/path/filepath/example_unix_test.go new file mode 100644 index 00000000000..f3fe076c3c7 --- /dev/null +++ b/libgo/go/path/filepath/example_unix_test.go @@ -0,0 +1,39 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !windows,!plan9 + +package filepath_test + +import ( + "fmt" + "path/filepath" +) + +func ExampleSplitList() { + fmt.Println("On Unix:", filepath.SplitList("/a/b/c:/usr/bin")) + // Output: + // On Unix: [/a/b/c /usr/bin] +} + +func ExampleRel() { + paths := []string{ + "/a/b/c", + "/b/c", + "./b/c", + } + base := "/a" + + fmt.Println("On Unix:") + for _, p := range paths { + rel, err := filepath.Rel(base, p) + fmt.Printf("%q: %q %v\n", p, rel, err) + } + + // Output: + // On Unix: + // "/a/b/c": "b/c" <nil> + // "/b/c": "../b/c" <nil> + // "./b/c": "" Rel: can't make b/c relative to /a +} diff --git a/libgo/go/path/filepath/match_test.go b/libgo/go/path/filepath/match_test.go index e3d365881cc..1095cc5c454 100644 --- a/libgo/go/path/filepath/match_test.go +++ b/libgo/go/path/filepath/match_test.go @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package filepath_test +package filepath import ( - . "path/filepath" "runtime" "strings" "testing" diff --git a/libgo/go/path/filepath/path.go b/libgo/go/path/filepath/path.go index bbd738d8c81..f8c7e4b2f42 100644 --- a/libgo/go/path/filepath/path.go +++ b/libgo/go/path/filepath/path.go @@ -176,10 +176,7 @@ func FromSlash(path string) string { // usually found in PATH or GOPATH environment variables. // Unlike strings.Split, SplitList returns an empty slice when passed an empty string. func SplitList(path string) []string { - if path == "" { - return []string{} - } - return strings.Split(path, string(ListSeparator)) + return splitList(path) } // Split splits path immediately following the final Separator, @@ -374,6 +371,7 @@ func walk(path string, info os.FileInfo, walkFn WalkFunc) error { // and directories are filtered by walkFn. The files are walked in lexical // order, which makes the output deterministic but means that for very // large directories Walk can be inefficient. +// Walk does not follow symbolic links. func Walk(root string, walkFn WalkFunc) error { info, err := os.Lstat(root) if err != nil { @@ -436,7 +434,8 @@ func Base(path string) string { } // Dir returns all but the last element of path, typically the path's directory. -// Trailing path separators are removed before processing. +// After dropping the final element, the path is Cleaned and trailing +// slashes are removed. // 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. diff --git a/libgo/go/path/filepath/path_plan9.go b/libgo/go/path/filepath/path_plan9.go index 0c938d89da1..12e85aae00c 100644 --- a/libgo/go/path/filepath/path_plan9.go +++ b/libgo/go/path/filepath/path_plan9.go @@ -21,3 +21,10 @@ func volumeNameLen(path string) int { func HasPrefix(p, prefix string) bool { return strings.HasPrefix(p, prefix) } + +func splitList(path string) []string { + if path == "" { + return []string{} + } + return strings.Split(path, string(ListSeparator)) +} diff --git a/libgo/go/path/filepath/path_test.go b/libgo/go/path/filepath/path_test.go index bee4d95bc7c..607bfed11ba 100644 --- a/libgo/go/path/filepath/path_test.go +++ b/libgo/go/path/filepath/path_test.go @@ -91,7 +91,6 @@ var wincleantests = []PathTest{ } func TestClean(t *testing.T) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) tests := cleantests if runtime.GOOS == "windows" { for i := range tests { @@ -108,22 +107,20 @@ func TestClean(t *testing.T) { } } - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - allocs := -ms.Mallocs - const rounds = 100 - for i := 0; i < rounds; i++ { - for _, test := range tests { - filepath.Clean(test.result) - } + if runtime.GOMAXPROCS(0) > 1 { + t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1") + return } - runtime.ReadMemStats(&ms) - allocs += ms.Mallocs - /* Fails with gccgo, which has no escape analysis. - if allocs >= rounds { - t.Errorf("Clean cleaned paths: %d allocations per test round, want zero", allocs/rounds) + + t.Log("Skipping AllocsPerRun for gccgo") + return + + for _, test := range tests { + allocs := testing.AllocsPerRun(100, func() { filepath.Clean(test.result) }) + if allocs > 0 { + t.Errorf("Clean(%q): %v allocs, want zero", test.result, allocs) + } } - */ } const sep = filepath.Separator @@ -159,10 +156,36 @@ var splitlisttests = []SplitListTest{ {string([]byte{lsep, 'a', lsep, 'b'}), []string{"", "a", "b"}}, } +var winsplitlisttests = []SplitListTest{ + // quoted + {`"a"`, []string{`a`}}, + + // semicolon + {`";"`, []string{`;`}}, + {`"a;b"`, []string{`a;b`}}, + {`";";`, []string{`;`, ``}}, + {`;";"`, []string{``, `;`}}, + + // partially quoted + {`a";"b`, []string{`a;b`}}, + {`a; ""b`, []string{`a`, ` b`}}, + {`"a;b`, []string{`a;b`}}, + {`""a;b`, []string{`a`, `b`}}, + {`"""a;b`, []string{`a;b`}}, + {`""""a;b`, []string{`a`, `b`}}, + {`a";b`, []string{`a;b`}}, + {`a;b";c`, []string{`a`, `b;c`}}, + {`"a";b";c`, []string{`a`, `b;c`}}, +} + func TestSplitList(t *testing.T) { - for _, test := range splitlisttests { + tests := splitlisttests + if runtime.GOOS == "windows" { + tests = append(tests, winsplitlisttests...) + } + for _, test := range tests { if l := filepath.SplitList(test.list); !reflect.DeepEqual(l, test.result) { - t.Errorf("SplitList(%q) = %s, want %s", test.list, l, test.result) + t.Errorf("SplitList(%#q) = %#q, want %#q", test.list, l, test.result) } } } diff --git a/libgo/go/path/filepath/path_unix.go b/libgo/go/path/filepath/path_unix.go index 3b48d14e083..cff7b2c65c5 100644 --- a/libgo/go/path/filepath/path_unix.go +++ b/libgo/go/path/filepath/path_unix.go @@ -23,3 +23,10 @@ func volumeNameLen(path string) int { func HasPrefix(p, prefix string) bool { return strings.HasPrefix(p, prefix) } + +func splitList(path string) []string { + if path == "" { + return []string{} + } + return strings.Split(path, string(ListSeparator)) +} diff --git a/libgo/go/path/filepath/path_windows.go b/libgo/go/path/filepath/path_windows.go index db2b57ec00a..e99997257d7 100644 --- a/libgo/go/path/filepath/path_windows.go +++ b/libgo/go/path/filepath/path_windows.go @@ -70,3 +70,36 @@ func HasPrefix(p, prefix string) bool { } return strings.HasPrefix(strings.ToLower(p), strings.ToLower(prefix)) } + +func splitList(path string) []string { + // The same implementation is used in LookPath in os/exec; + // consider changing os/exec when changing this. + + if path == "" { + return []string{} + } + + // Split path, respecting but preserving quotes. + list := []string{} + start := 0 + quo := false + for i := 0; i < len(path); i++ { + switch c := path[i]; { + case c == '"': + quo = !quo + case c == ListSeparator && !quo: + list = append(list, path[start:i]) + start = i + 1 + } + } + list = append(list, path[start:]) + + // Remove quotes. + for i, s := range list { + if strings.Contains(s, `"`) { + list[i] = strings.Replace(s, `"`, ``, -1) + } + } + + return list +} diff --git a/libgo/go/path/path_test.go b/libgo/go/path/path_test.go index 926b57355a0..62974401126 100644 --- a/libgo/go/path/path_test.go +++ b/libgo/go/path/path_test.go @@ -64,7 +64,6 @@ var cleantests = []PathTest{ } func TestClean(t *testing.T) { - defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(1)) for _, test := range cleantests { if s := Clean(test.path); s != test.result { t.Errorf("Clean(%q) = %q, want %q", test.path, s, test.result) @@ -74,22 +73,20 @@ func TestClean(t *testing.T) { } } - var ms runtime.MemStats - runtime.ReadMemStats(&ms) - allocs := -ms.Mallocs - const rounds = 100 - for i := 0; i < rounds; i++ { - for _, test := range cleantests { - Clean(test.result) - } + if runtime.GOMAXPROCS(0) > 1 { + t.Log("skipping AllocsPerRun checks; GOMAXPROCS>1") + return } - runtime.ReadMemStats(&ms) - allocs += ms.Mallocs - /* Fails with gccgo, which has no escape analysis. - if allocs >= rounds { - t.Errorf("Clean cleaned paths: %d allocations per test round, want zero", allocs/rounds) + + t.Log("Skipping AllocsPerRun for gccgo") + return + + for _, test := range cleantests { + allocs := testing.AllocsPerRun(100, func() { Clean(test.result) }) + if allocs > 0 { + t.Errorf("Clean(%q): %v allocs, want zero", test.result, allocs) + } } - */ } type SplitTest struct { |