Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit de0ae60

Browse files
committedNov 24, 2023
rename bug fix, rename dir will mv all subfiles
1 parent 43a107e commit de0ae60

File tree

1 file changed

+54
-5
lines changed

1 file changed

+54
-5
lines changed
 

‎s3_fs.go

+54-5
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,20 @@ func (fs *Fs) OpenFile(name string, flag int, _ os.FileMode) (afero.File, error)
160160

161161
// Remove a file
162162
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 {
164165
return err
165166
}
166-
return fs.forceRemove(name)
167+
return fs.forceRemove(name, fi.IsDir())
167168
}
168169

169170
// 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+
}
171177
_, err := fs.s3API.DeleteObject(&s3.DeleteObjectInput{
172178
Bucket: aws.String(fs.bucket),
173179
Key: aws.String(name),
@@ -189,13 +195,13 @@ func (fs *Fs) RemoveAll(name string) error {
189195
return err
190196
}
191197
} else {
192-
if err := fs.forceRemove(fullpath); err != nil {
198+
if err := fs.forceRemove(fullpath, false); err != nil {
193199
return err
194200
}
195201
}
196202
}
197203
// 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 {
199205
return err
200206
}
201207
return nil
@@ -209,6 +215,23 @@ func (fs Fs) Rename(oldname, newname string) error {
209215
if oldname == newname {
210216
return nil
211217
}
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+
212235
_, err := fs.s3API.CopyObject(&s3.CopyObjectInput{
213236
Bucket: aws.String(fs.bucket),
214237
CopySource: aws.String(fs.bucket + oldname),
@@ -217,6 +240,32 @@ func (fs Fs) Rename(oldname, newname string) error {
217240
if err != nil {
218241
return err
219242
}
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+
220269
_, err = fs.s3API.DeleteObject(&s3.DeleteObjectInput{
221270
Bucket: aws.String(fs.bucket),
222271
Key: aws.String(oldname),

0 commit comments

Comments
 (0)
Please sign in to comment.