@@ -160,14 +160,20 @@ func (fs *Fs) OpenFile(name string, flag int, _ os.FileMode) (afero.File, error)
160
160
161
161
// Remove a file
162
162
func (fs Fs ) Remove (name string ) error {
163
- if _ , err := fs .Stat (name ); err != nil {
163
+ fi , err := fs .Stat (name )
164
+ if err != nil {
164
165
return err
165
166
}
166
- return fs .forceRemove (name )
167
+ return fs .forceRemove (name , fi . IsDir () )
167
168
}
168
169
169
170
// forceRemove doesn't error if a file does not exist.
170
- func (fs Fs ) forceRemove (name string ) error {
171
+ func (fs Fs ) forceRemove (name string , isDir bool ) error {
172
+ if isDir {
173
+ if ! strings .HasSuffix (name , "/" ) {
174
+ name = name + "/"
175
+ }
176
+ }
171
177
_ , err := fs .s3API .DeleteObject (& s3.DeleteObjectInput {
172
178
Bucket : aws .String (fs .bucket ),
173
179
Key : aws .String (name ),
@@ -189,13 +195,13 @@ func (fs *Fs) RemoveAll(name string) error {
189
195
return err
190
196
}
191
197
} else {
192
- if err := fs .forceRemove (fullpath ); err != nil {
198
+ if err := fs .forceRemove (fullpath , false ); err != nil {
193
199
return err
194
200
}
195
201
}
196
202
}
197
203
// finally remove the "file" representing the directory
198
- if err := fs .forceRemove (s3dir .Name () + "/" ); err != nil {
204
+ if err := fs .forceRemove (s3dir .Name (), true ); err != nil {
199
205
return err
200
206
}
201
207
return nil
@@ -209,6 +215,23 @@ func (fs Fs) Rename(oldname, newname string) error {
209
215
if oldname == newname {
210
216
return nil
211
217
}
218
+ fi , err := fs .Stat (oldname )
219
+ if err != nil {
220
+ return err
221
+ }
222
+ return fs .rename (oldname , newname , fi .IsDir ())
223
+ }
224
+ func (fs Fs ) rename (oldname , newname string , isDir bool ) error {
225
+
226
+ if isDir {
227
+ if ! strings .HasSuffix (oldname , "/" ) {
228
+ oldname = oldname + "/"
229
+ }
230
+ if ! strings .HasSuffix (newname , "/" ) {
231
+ newname = newname + "/"
232
+ }
233
+ }
234
+
212
235
_ , err := fs .s3API .CopyObject (& s3.CopyObjectInput {
213
236
Bucket : aws .String (fs .bucket ),
214
237
CopySource : aws .String (fs .bucket + oldname ),
@@ -217,6 +240,32 @@ func (fs Fs) Rename(oldname, newname string) error {
217
240
if err != nil {
218
241
return err
219
242
}
243
+
244
+ // Wait to see if the item got copied
245
+ err = fs .s3API .WaitUntilObjectExists (& s3.HeadObjectInput {
246
+ Bucket : aws .String (fs .bucket ),
247
+ Key : aws .String (newname ),
248
+ })
249
+ if err != nil {
250
+ return err
251
+ }
252
+
253
+ if isDir {
254
+ s3dir := NewFile (& fs , oldname )
255
+ fis , err := s3dir .Readdir (0 )
256
+ if err != nil {
257
+ return err
258
+ }
259
+ for _ , fi := range fis {
260
+ src := oldname + fi .Name ()
261
+ dst := newname + fi .Name ()
262
+ err = fs .rename (src , dst , fi .IsDir ())
263
+ if err != nil {
264
+ return err
265
+ }
266
+ }
267
+ }
268
+
220
269
_ , err = fs .s3API .DeleteObject (& s3.DeleteObjectInput {
221
270
Bucket : aws .String (fs .bucket ),
222
271
Key : aws .String (oldname ),
0 commit comments