@@ -79,21 +79,45 @@ func (d *Alias) Get(ctx context.Context, path string) (model.Obj, error) {
7979 if ! ok {
8080 return nil , errs .ObjectNotFound
8181 }
82+ var ret * model.Object
83+ provider := ""
8284 for _ , dst := range dsts {
83- obj , err := fs .Get (ctx , stdpath .Join (dst , sub ), & fs.GetArgs {NoLog : true })
85+ rawPath := stdpath .Join (dst , sub )
86+ obj , err := fs .Get (ctx , rawPath , & fs.GetArgs {NoLog : true })
8487 if err != nil {
8588 continue
8689 }
87- return & model.Object {
88- Path : path ,
89- Name : obj .GetName (),
90- Size : obj .GetSize (),
91- Modified : obj .ModTime (),
92- IsFolder : obj .IsDir (),
93- HashInfo : obj .GetHash (),
90+ storage , err := fs .GetStorage (rawPath , & fs.GetStoragesArgs {})
91+ if ret == nil {
92+ ret = & model.Object {
93+ Path : path ,
94+ Name : obj .GetName (),
95+ Size : obj .GetSize (),
96+ Modified : obj .ModTime (),
97+ IsFolder : obj .IsDir (),
98+ HashInfo : obj .GetHash (),
99+ }
100+ if ! d .ProviderPassThrough || err != nil {
101+ break
102+ }
103+ provider = storage .Config ().Name
104+ } else if err != nil || provider != storage .GetStorage ().Driver {
105+ provider = ""
106+ break
107+ }
108+ }
109+ if ret == nil {
110+ return nil , errs .ObjectNotFound
111+ }
112+ if provider != "" {
113+ return & model.ObjectProvider {
114+ Object : * ret ,
115+ Provider : model.Provider {
116+ Provider : provider ,
117+ },
94118 }, nil
95119 }
96- return nil , errs . ObjectNotFound
120+ return ret , nil
97121}
98122
99123func (d * Alias ) List (ctx context.Context , dir model.Obj , args model.ListArgs ) ([]model.Obj , error ) {
@@ -186,6 +210,35 @@ func (d *Alias) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (
186210 return nil , errs .ObjectNotFound
187211}
188212
213+ func (d * Alias ) Other (ctx context.Context , args model.OtherArgs ) (interface {}, error ) {
214+ root , sub := d .getRootAndPath (args .Obj .GetPath ())
215+ dsts , ok := d .pathMap [root ]
216+ if ! ok {
217+ return nil , errs .ObjectNotFound
218+ }
219+ for _ , dst := range dsts {
220+ rawPath := stdpath .Join (dst , sub )
221+ storage , actualPath , err := op .GetStorageAndActualPath (rawPath )
222+ if err != nil {
223+ continue
224+ }
225+ other , ok := storage .(driver.Other )
226+ if ! ok {
227+ continue
228+ }
229+ obj , err := op .GetUnwrap (ctx , storage , actualPath )
230+ if err != nil {
231+ continue
232+ }
233+ return other .Other (ctx , model.OtherArgs {
234+ Obj : obj ,
235+ Method : args .Method ,
236+ Data : args .Data ,
237+ })
238+ }
239+ return nil , errs .NotImplement
240+ }
241+
189242func (d * Alias ) MakeDir (ctx context.Context , parentDir model.Obj , dirName string ) error {
190243 if ! d .Writable {
191244 return errs .PermissionDenied
0 commit comments