@@ -800,35 +800,48 @@ func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (
800800//
801801// It should return fs.ErrorNotImplemented if it can't return a DirEntry
802802func (f * Fs ) Stat (ctx context.Context , dir string , leaf string ) (fs.DirEntry , error ) {
803- //entriesList := make([][]upstream.Entry, len(f.upstreams))
804- //errs := Errors(make([]error, len(f.upstreams)))
805- //multithread(len(f.upstreams), func(i int) {
806- // u := f.upstreams[i]
807- // entries, err := u.List(ctx, dir)
808- // if err != nil {
809- // errs[i] = fmt.Errorf("%s: %w", u.Name(), err)
810- // return
811- // }
812- // uEntries := make([]upstream.Entry, len(entries))
813- // for j, e := range entries {
814- // uEntries[j], _ = u.WrapEntry(e)
815- // }
816- // entriesList[i] = uEntries
817- //})
818- //if len(errs) == len(errs.FilterNil()) {
819- // errs = errs.Map(func(e error) error {
820- // if errors.Is(e, fs.ErrorDirNotFound) {
821- // return nil
822- // }
823- // return e
824- // })
825- // if len(errs) == 0 {
826- // return nil, fs.ErrorDirNotFound
827- // }
828- // return nil, errs.Err()
829- //}
830- //return f.mergeDirEntries(entriesList)
831- return nil , fs .ErrorNotImplemented
803+ entriesList := make ([][]upstream.Entry , len (f .upstreams ))
804+ errs := Errors (make ([]error , len (f .upstreams )))
805+
806+ multithread (len (f .upstreams ), func (i int ) {
807+ u := f .upstreams [i ]
808+ stater , ok := u .Fs .(fs.Stater )
809+ if ! ok {
810+ errs [i ] = fs .ErrorNotImplemented
811+ return
812+ }
813+ entry , err := stater .Stat (ctx , dir , leaf )
814+ if err != nil {
815+ errs [i ] = fmt .Errorf ("%s: %w" , u .Name (), err )
816+ return
817+ }
818+ uEntries := make ([]upstream.Entry , 1 )
819+ uEntries [0 ], _ = u .WrapEntry (entry )
820+ entriesList [i ] = uEntries
821+ })
822+
823+ if len (errs ) == len (errs .FilterNil ()) {
824+ errs = errs .Map (func (e error ) error {
825+ if errors .Is (e , fs .ErrorDirNotFound ) {
826+ return nil
827+ }
828+ return e
829+ })
830+ if len (errs ) == 0 {
831+ return nil , fs .ErrorDirNotFound
832+ }
833+ return nil , errs .Err ()
834+ }
835+
836+ entries , err := f .mergeDirEntries (entriesList )
837+ if err != nil {
838+ return nil , err
839+ }
840+ if len (entries ) != 1 {
841+ return nil , fmt .Errorf ("internal error: expected 1 entry but got %d" , len (entries ))
842+ }
843+
844+ return entries [0 ], nil
832845}
833846
834847// NewObject creates a new remote union file object
0 commit comments