...
1 package driver
2
3 import (
4 "context"
5 "errors"
6 "sort"
7
8 "github.com/sirupsen/logrus"
9 )
10
11
12
13
14 var ErrSkipDir = errors.New("skip this directory")
15
16
17 type WalkFn func(fileInfo FileInfo) error
18
19
20
21
22
23
24 func WalkFallback(ctx context.Context, driver StorageDriver, from string, f WalkFn) error {
25 children, err := driver.List(ctx, from)
26 if err != nil {
27 return err
28 }
29 sort.Stable(sort.StringSlice(children))
30 for _, child := range children {
31
32
33
34
35 fileInfo, err := driver.Stat(ctx, child)
36 if err != nil {
37 switch err.(type) {
38 case PathNotFoundError:
39
40 logrus.WithField("path", child).Infof("ignoring deleted path")
41 continue
42 default:
43 return err
44 }
45 }
46 err = f(fileInfo)
47 if err == nil && fileInfo.IsDir() {
48 if err := WalkFallback(ctx, driver, child, f); err != nil {
49 return err
50 }
51 } else if err == ErrSkipDir {
52
53 if !fileInfo.IsDir() {
54 return nil
55 }
56 } else if err != nil {
57 return err
58 }
59 }
60 return nil
61 }
62
View as plain text