mirror of
https://github.com/golang/go
synced 2024-11-19 13:04:45 -07:00
path/filepath: document and test behavior of SkipDir on files
This behavior is not what we might have designed from the start, but it has been present since Go 1. Rather than make a visible behavioral change that might cause programs to work differently in Go ≤1.4 vs Go ≥1.5, document what SkipDir on a non-directory has always meant. If code doesn't want this meaning, it is easy enough not to return SkipDir on non-directories. Fixes #10533. Change-Id: Ic0612f032044bc7c69bf62583a02037e4b47530b Reviewed-on: https://go-review.googlesource.com/11690 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
parent
69f0d4c6be
commit
4df6b1ec2f
@ -335,10 +335,11 @@ var SkipDir = errors.New("skip this directory")
|
|||||||
// If there was a problem walking to the file or directory named by path, the
|
// If there was a problem walking to the file or directory named by path, the
|
||||||
// incoming error will describe the problem and the function can decide how
|
// incoming error will describe the problem and the function can decide how
|
||||||
// to handle that error (and Walk will not descend into that directory). If
|
// to handle that error (and Walk will not descend into that directory). If
|
||||||
// an error is returned, processing stops. The sole exception is that if path
|
// an error is returned, processing stops. The sole exception is when the function
|
||||||
// is a directory and the function returns the special value SkipDir, the
|
// returns the special value SkipDir. If the function returns SkipDir when invoked
|
||||||
// contents of the directory are skipped and processing continues as usual on
|
// on a directory, Walk skips the directory's contents entirely.
|
||||||
// the next file.
|
// If the function returns SkipDir when invoked on a non-directory file,
|
||||||
|
// Walk skips the remaining files in the containing directory.
|
||||||
type WalkFunc func(path string, info os.FileInfo, err error) error
|
type WalkFunc func(path string, info os.FileInfo, err error) error
|
||||||
|
|
||||||
var lstat = os.Lstat // for testing
|
var lstat = os.Lstat // for testing
|
||||||
|
@ -510,6 +510,35 @@ func touch(t *testing.T, name string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWalkSkipDirOnFile(t *testing.T) {
|
||||||
|
td, err := ioutil.TempDir("", "walktest")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(td)
|
||||||
|
|
||||||
|
if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
touch(t, filepath.Join(td, "dir/foo1"))
|
||||||
|
touch(t, filepath.Join(td, "dir/foo2"))
|
||||||
|
|
||||||
|
sawFoo2 := false
|
||||||
|
filepath.Walk(td, func(path string, info os.FileInfo, err error) error {
|
||||||
|
if strings.HasSuffix(path, "foo2") {
|
||||||
|
sawFoo2 = true
|
||||||
|
}
|
||||||
|
if strings.HasSuffix(path, "foo1") {
|
||||||
|
return filepath.SkipDir
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if sawFoo2 {
|
||||||
|
t.Errorf("SkipDir on file foo1 did not block processing of foo2")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestWalkFileError(t *testing.T) {
|
func TestWalkFileError(t *testing.T) {
|
||||||
td, err := ioutil.TempDir("", "walktest")
|
td, err := ioutil.TempDir("", "walktest")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user