Skip to content

Commit 995b788

Browse files
committed
wip: union: implement the stat function
Signed-off-by: Anagh Kumar Baranwal <6824881+darthShadow@users.noreply.github.com>
1 parent 8d781cc commit 995b788

File tree

1 file changed

+42
-29
lines changed

1 file changed

+42
-29
lines changed

backend/union/union.go

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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
802802
func (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

Comments
 (0)