in experimental/s3_storage.go [41:110]
func (f *s3Storage) Walk(path string, baseDir string, fn walkFunc) error {
path = f.fullPath(path)
if path != "/" && path[len(path)-1] != '/' {
path = path + "/"
}
baseDir = f.fullPath(baseDir)
if baseDir != "/" && baseDir[len(baseDir)-1] != '/' {
baseDir = baseDir + "/"
}
atomic.AddInt64(&f.apiCalls, 1)
resp, err := f.S3.ListObjects(&s3.ListObjectsInput{
Bucket: aws.String(f.Bucket),
Prefix: aws.String(path),
MaxKeys: aws.Int64(listMax),
})
if err != nil {
return err
}
for {
lastKey := ""
for _, key := range resp.Contents {
lastKey = *key.Key
keyPath := *key.Key
if strings.HasPrefix(keyPath, baseDir) {
keyPath = keyPath[len(baseDir):]
}
if keyPath == "" {
continue
}
if strings.HasSuffix(keyPath, "/") {
logrus.Debugln("S3 Walk:", keyPath, "for", baseDir)
continue
}
fi := fileInfo{
fullPath: *key.Key,
size: *key.Size,
etag: *key.ETag,
lastModified: *key.LastModified,
}
err = fn(keyPath, fi, err)
if err != nil {
return err
}
}
if *resp.IsTruncated {
atomic.AddInt64(&f.apiCalls, 1)
resp, err = f.S3.ListObjects(&s3.ListObjectsInput{
Bucket: aws.String(f.Bucket),
Prefix: aws.String(path),
MaxKeys: aws.Int64(listMax),
Marker: aws.String(lastKey),
})
if err != nil {
return err
}
} else {
break
}
}
return nil
}