func main() { for _, p := range os.Args[1:] { err := walk.Walk(p, func(path string, fi os.FileInfo, err error) error { if err != nil { fmt.Fprintf(os.Stderr, "%s: %v\n", path, err) } else { fmt.Println(path) } return nil }) if err != nil { log.Fatal(err) } } }
func TestWalkFileError(t *testing.T) { td, err := ioutil.TempDir("", "walktest") if err != nil { t.Fatal(err) } defer os.RemoveAll(td) touch(t, filepath.Join(td, "foo")) touch(t, filepath.Join(td, "bar")) dir := filepath.Join(td, "dir") if err := os.MkdirAll(filepath.Join(td, "dir"), 0755); err != nil { t.Fatal(err) } touch(t, filepath.Join(dir, "baz")) touch(t, filepath.Join(dir, "stat-error")) defer func() { *walk.LstatP = os.Lstat }() statErr := errors.New("some stat error") *walk.LstatP = func(path string) (os.FileInfo, error) { if strings.HasSuffix(path, "stat-error") { return nil, statErr } return os.Lstat(path) } got := map[string]error{} err = walk.Walk(td, func(path string, fi os.FileInfo, err error) error { rel, _ := filepath.Rel(td, path) got[filepath.ToSlash(rel)] = err return nil }) if err != nil { t.Errorf("Walk error: %v", err) } want := map[string]error{ ".": nil, "foo": nil, "bar": nil, "dir": nil, "dir/baz": nil, "dir/stat-error": statErr, } if !reflect.DeepEqual(got, want) { t.Errorf("Walked %#v; want %#v", got, want) } }
func TestWalk(t *testing.T) { makeTree(t) errors := make([]error, 0, 10) clear := true markFn := func(path string, info os.FileInfo, err error) error { return mark(path, info, err, &errors, clear) } // Expect no errors. err := walk.Walk(tree.name, markFn) if err != nil { t.Fatalf("no error expected, found: %s", err) } if len(errors) != 0 { t.Fatalf("unexpected errors: %s", errors) } checkMarks(t, true) errors = errors[0:0] // Test permission errors. Only possible if we're not root // and only on some file systems (AFS, FAT). To avoid errors during // all.bash on those file systems, skip during go test -short. if os.Getuid() > 0 && !testing.Short() { // introduce 2 errors: chmod top-level directories to 0 os.Chmod(filepath.Join(tree.name, tree.entries[1].name), 0) os.Chmod(filepath.Join(tree.name, tree.entries[3].name), 0) // 3) capture errors, expect two. // mark respective subtrees manually markTree(tree.entries[1]) markTree(tree.entries[3]) // correct double-marking of directory itself tree.entries[1].mark-- tree.entries[3].mark-- err := walk.Walk(tree.name, markFn) if err != nil { t.Fatalf("expected no error return from Walk, got %s", err) } if len(errors) != 2 { t.Errorf("expected 2 errors, got %d: %s", len(errors), errors) } // the inaccessible subtrees were marked manually checkMarks(t, true) errors = errors[0:0] // 4) capture errors, stop after first error. // mark respective subtrees manually markTree(tree.entries[1]) markTree(tree.entries[3]) // correct double-marking of directory itself tree.entries[1].mark-- tree.entries[3].mark-- clear = false // error will stop processing err = walk.Walk(tree.name, markFn) if err == nil { t.Fatalf("expected error return from Walk") } if len(errors) != 2 { t.Errorf("expected 2 errors, got %d: %s", len(errors), errors) } // the inaccessible subtrees were marked manually checkMarks(t, false) errors = errors[0:0] // restore permissions os.Chmod(filepath.Join(tree.name, tree.entries[1].name), 0770) os.Chmod(filepath.Join(tree.name, tree.entries[3].name), 0770) } // cleanup if err := os.RemoveAll(tree.name); err != nil { t.Errorf("removeTree: %v", err) } }