]> Cypherpunks repositories - gostls13.git/commitdiff
path/filepath: implement documented SkipDir behavior
authorJan Mercl <befelemepeseveze@gmail.com>
Sat, 2 Jun 2012 17:00:09 +0000 (13:00 -0400)
committerRuss Cox <rsc@golang.org>
Sat, 2 Jun 2012 17:00:09 +0000 (13:00 -0400)
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 e4b4da43cb0677c6b0305d4a86156b4333b8cf5d..e6097d51466ad39e49be27fd7ea8b8a49d01cb0c 100644 (file)
@@ -874,3 +874,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)
+       }
+}