@@ -79,21 +79,45 @@ func (d *Alias) Get(ctx context.Context, path string) (model.Obj, error) {
79
79
if ! ok {
80
80
return nil , errs .ObjectNotFound
81
81
}
82
+ var ret * model.Object
83
+ provider := ""
82
84
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 })
84
87
if err != nil {
85
88
continue
86
89
}
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
+ },
94
118
}, nil
95
119
}
96
- return nil , errs . ObjectNotFound
120
+ return ret , nil
97
121
}
98
122
99
123
func (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) (
186
210
return nil , errs .ObjectNotFound
187
211
}
188
212
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
+
189
242
func (d * Alias ) MakeDir (ctx context.Context , parentDir model.Obj , dirName string ) error {
190
243
if ! d .Writable {
191
244
return errs .PermissionDenied
0 commit comments