mirror of
https://github.com/rclone/rclone.git
synced 2024-11-25 17:57:44 +08:00
c87097109b
This also updates the interface which has gained a ctx parameter in the mean time.
50 lines
1.0 KiB
Go
50 lines
1.0 KiB
Go
package s3
|
|
|
|
import (
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/rclone/gofakes3"
|
|
)
|
|
|
|
func (b *s3Backend) entryListR(bucket, fdPath, name string, addPrefix bool, response *gofakes3.ObjectList) error {
|
|
fp := path.Join(bucket, fdPath)
|
|
|
|
dirEntries, err := getDirEntries(fp, b.vfs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, entry := range dirEntries {
|
|
object := entry.Name()
|
|
|
|
// workround for control-chars detect
|
|
objectPath := path.Join(fdPath, object)
|
|
|
|
if !strings.HasPrefix(object, name) {
|
|
continue
|
|
}
|
|
|
|
if entry.IsDir() {
|
|
if addPrefix {
|
|
response.AddPrefix(gofakes3.URLEncode(objectPath))
|
|
continue
|
|
}
|
|
err := b.entryListR(bucket, path.Join(fdPath, object), "", false, response)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
item := &gofakes3.Content{
|
|
Key: gofakes3.URLEncode(objectPath),
|
|
LastModified: gofakes3.NewContentTime(entry.ModTime()),
|
|
ETag: getFileHash(entry),
|
|
Size: entry.Size(),
|
|
StorageClass: gofakes3.StorageStandard,
|
|
}
|
|
response.Add(item)
|
|
}
|
|
}
|
|
return nil
|
|
}
|