mirror of
https://github.com/rclone/rclone.git
synced 2025-01-11 08:49:37 +01:00
union: enable ListR when upstreams contain local
Enable fast list functions for union backend when: - at least one of the upstreams supports fast list - upstreams only consist of backends that support fast list and local backend. Fixes #3000
This commit is contained in:
parent
aba89e2737
commit
33d9310c49
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/rclone/rclone/fs/config/configstruct"
|
"github.com/rclone/rclone/fs/config/configstruct"
|
||||||
"github.com/rclone/rclone/fs/hash"
|
"github.com/rclone/rclone/fs/hash"
|
||||||
"github.com/rclone/rclone/fs/operations"
|
"github.com/rclone/rclone/fs/operations"
|
||||||
|
"github.com/rclone/rclone/fs/walk"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Register with Fs
|
// Register with Fs
|
||||||
@ -597,17 +598,13 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e
|
|||||||
// Don't implement this unless you have a more efficient way
|
// Don't implement this unless you have a more efficient way
|
||||||
// of listing recursively that doing a directory traversal.
|
// of listing recursively that doing a directory traversal.
|
||||||
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
|
func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
|
||||||
for _, u := range f.upstreams {
|
|
||||||
if u.Features().ListR == nil {
|
|
||||||
return errors.Errorf("ListR Unsupported for branch: %s", u.Name())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var entriess [][]upstream.Entry
|
var entriess [][]upstream.Entry
|
||||||
errs := Errors(make([]error, len(f.upstreams)))
|
errs := Errors(make([]error, len(f.upstreams)))
|
||||||
var mutex sync.Mutex
|
var mutex sync.Mutex
|
||||||
multithread(len(f.upstreams), func(i int) {
|
multithread(len(f.upstreams), func(i int) {
|
||||||
u := f.upstreams[i]
|
u := f.upstreams[i]
|
||||||
err := u.Features().ListR(ctx, dir, func(entries fs.DirEntries) error {
|
var err error
|
||||||
|
callback := func(entries fs.DirEntries) error {
|
||||||
uEntries := make([]upstream.Entry, len(entries))
|
uEntries := make([]upstream.Entry, len(entries))
|
||||||
for j, e := range entries {
|
for j, e := range entries {
|
||||||
uEntries[j], _ = u.WrapEntry(e)
|
uEntries[j], _ = u.WrapEntry(e)
|
||||||
@ -616,7 +613,13 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
|
|||||||
entriess = append(entriess, uEntries)
|
entriess = append(entriess, uEntries)
|
||||||
mutex.Unlock()
|
mutex.Unlock()
|
||||||
return nil
|
return nil
|
||||||
})
|
}
|
||||||
|
do := u.Features().ListR
|
||||||
|
if do != nil {
|
||||||
|
err = do(ctx, dir, callback)
|
||||||
|
} else {
|
||||||
|
err = walk.ListR(ctx, u, dir, true, -1, walk.ListAll, callback)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs[i] = errors.Wrap(err, u.Name())
|
errs[i] = errors.Wrap(err, u.Name())
|
||||||
return
|
return
|
||||||
@ -813,6 +816,19 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
|
|||||||
features = features.Mask(f) // Mask all upstream fs
|
features = features.Mask(f) // Mask all upstream fs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable ListR when upstreams either support ListR or is local
|
||||||
|
// But not when all upstreams are local
|
||||||
|
if features.ListR == nil {
|
||||||
|
for _, u := range upstreams {
|
||||||
|
if u.Features().ListR != nil {
|
||||||
|
features.ListR = f.ListR
|
||||||
|
} else if !u.Features().IsLocal {
|
||||||
|
features.ListR = nil
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
f.features = features
|
f.features = features
|
||||||
|
|
||||||
// Get common intersection of hashes
|
// Get common intersection of hashes
|
||||||
|
Loading…
Reference in New Issue
Block a user