]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1] path/filepath: implement documented SkipDir behavior
authorJan Mercl <befelemepeseveze@gmail.com>
Wed, 13 Jun 2012 20:24:35 +0000 (16:24 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 13 Jun 2012 20:24:35 +0000 (16:24 -0400)
««« backport 4ef88bab4b0d
path/filepath: implement documented SkipDir behavior

Currently walk() doesn't check for err == SkipDir when iterating
a directory list, but such promise is made in the docs for WalkFunc.

Fixes #3486.

R=rsc, r
CC=golang-dev
https://golang.org/cl/6257059

»»»

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

index a4e429baec18a51afaca0c8831b004637ccb540a..815021bd040149f669d2f1109abd547a3d49af96 100644 (file)
@@ -320,8 +320,11 @@ func walk(path string, info os.FileInfo, walkFn WalkFunc) error {
        }
 
        for _, fileInfo := range list {
-               if err = walk(Join(path, fileInfo.Name()), fileInfo, walkFn); err != nil {
-                       return err
+               err = walk(Join(path, fileInfo.Name()), fileInfo, walkFn)
+               if err != nil {
+                       if !fileInfo.IsDir() || err != SkipDir {
+                               return err
+                       }
                }
        }
        return nil
index b8766588cf5937d091b6facc8ebd656442e8a156..59e79350b7e3273e1cae45eba93443dd7b559c1e 100644 (file)
@@ -869,3 +869,26 @@ func TestDriveLetterInEvalSymlinks(t *testing.T) {
                t.Errorf("Results of EvalSymlinks do not match: %q and %q", flp, fup)
        }
 }
+
+func TestBug3486(t *testing.T) { // http://code.google.com/p/go/issues/detail?id=3486
+       root := os.Getenv("GOROOT")
+       lib := filepath.Join(root, "lib")
+       src := filepath.Join(root, "src")
+       seenSrc := false
+       filepath.Walk(root, func(pth string, info os.FileInfo, err error) error {
+               if err != nil {
+                       t.Fatal(err)
+               }
+
+               switch pth {
+               case lib:
+                       return filepath.SkipDir
+               case src:
+                       seenSrc = true
+               }
+               return nil
+       })
+       if !seenSrc {
+               t.Fatalf("%q not seen", src)
+       }
+}