diff options
author | Ian Lance Taylor <iant@golang.org> | 2022-03-12 16:18:23 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2022-03-28 22:03:07 +0000 |
commit | 460fd63cccd2f1d16fc4b1b761545b1649e14e28 (patch) | |
tree | d578069779c03ac6c2dc2ae2b427ce0d62014db6 /src/io | |
parent | 3c7f9b80222376fa01f8c6e3b411281c23dd74ed (diff) | |
download | go-460fd63cccd2f1d16fc4b1b761545b1649e14e28.tar.gz go-460fd63cccd2f1d16fc4b1b761545b1649e14e28.zip |
io/fs, path/filepath: honor SkipDir on second WalkDirFunc error call
Fixes #51617
Change-Id: I03e9e575d9bad1481e7e4f051b50a077ba5f2fe0
Reviewed-on: https://go-review.googlesource.com/c/go/+/392154
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
Diffstat (limited to 'src/io')
-rw-r--r-- | src/io/fs/walk.go | 3 | ||||
-rw-r--r-- | src/io/fs/walk_test.go | 33 |
2 files changed, 36 insertions, 0 deletions
diff --git a/src/io/fs/walk.go b/src/io/fs/walk.go index 534876bad3..52a51bbd37 100644 --- a/src/io/fs/walk.go +++ b/src/io/fs/walk.go @@ -76,6 +76,9 @@ func walkDir(fsys FS, name string, d DirEntry, walkDirFn WalkDirFunc) error { // Second call, to report ReadDir error. err = walkDirFn(name, d, err) if err != nil { + if err == SkipDir && d.IsDir() { + err = nil + } return err } } diff --git a/src/io/fs/walk_test.go b/src/io/fs/walk_test.go index 5e127e71cd..04358beb24 100644 --- a/src/io/fs/walk_test.go +++ b/src/io/fs/walk_test.go @@ -8,6 +8,8 @@ import ( . "io/fs" "os" pathpkg "path" + "path/filepath" + "reflect" "testing" "testing/fstest" ) @@ -122,3 +124,34 @@ func TestWalkDir(t *testing.T) { } checkMarks(t, true) } + +func TestIssue51617(t *testing.T) { + dir := t.TempDir() + for _, sub := range []string{"a", filepath.Join("a", "bad"), filepath.Join("a", "next")} { + if err := os.Mkdir(filepath.Join(dir, sub), 0755); err != nil { + t.Fatal(err) + } + } + bad := filepath.Join(dir, "a", "bad") + if err := os.Chmod(bad, 0); err != nil { + t.Fatal(err) + } + defer os.Chmod(bad, 0700) // avoid errors on cleanup + var saw []string + err := WalkDir(os.DirFS(dir), ".", func(path string, d DirEntry, err error) error { + if err != nil { + return filepath.SkipDir + } + if d.IsDir() { + saw = append(saw, path) + } + return nil + }) + if err != nil { + t.Fatal(err) + } + want := []string{".", "a", "a/bad", "a/next"} + if !reflect.DeepEqual(saw, want) { + t.Errorf("got directories %v, want %v", saw, want) + } +} |