feat: update S3 delete operation to recursively remove objects under a directory prefix
Release / release (pull_request) Successful in 1m37s
Release / release (pull_request) Successful in 1m37s
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go-v2/config"
|
"github.com/aws/aws-sdk-go-v2/config"
|
||||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
appcfg "goexplore/internal/config"
|
appcfg "goexplore/internal/config"
|
||||||
"goexplore/internal/explorer"
|
"goexplore/internal/explorer"
|
||||||
)
|
)
|
||||||
@@ -243,11 +244,61 @@ func (e *S3Explorer) Delete(path string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to delete the exact object (might be a file or a folder marker)
|
||||||
_, err = e.client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
|
_, err = e.client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
|
||||||
Bucket: aws.String(bucket),
|
Bucket: aws.String(bucket),
|
||||||
Key: aws.String(subpath),
|
Key: aws.String(subpath),
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
// Ignore error; it might just be a prefix with no exact marker
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also treat subpath as a folder prefix and delete all matching objects
|
||||||
|
prefix := subpath
|
||||||
|
if !strings.HasSuffix(prefix, "/") {
|
||||||
|
prefix += "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
var continuationToken *string
|
||||||
|
for {
|
||||||
|
listInput := &s3.ListObjectsV2Input{
|
||||||
|
Bucket: aws.String(bucket),
|
||||||
|
Prefix: aws.String(prefix),
|
||||||
|
ContinuationToken: continuationToken,
|
||||||
|
}
|
||||||
|
listOutput, err := e.client.ListObjectsV2(context.TODO(), listInput)
|
||||||
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(listOutput.Contents) > 0 {
|
||||||
|
var objectsToDelete []types.ObjectIdentifier
|
||||||
|
for _, obj := range listOutput.Contents {
|
||||||
|
objectsToDelete = append(objectsToDelete, types.ObjectIdentifier{
|
||||||
|
Key: obj.Key,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = e.client.DeleteObjects(context.TODO(), &s3.DeleteObjectsInput{
|
||||||
|
Bucket: aws.String(bucket),
|
||||||
|
Delete: &types.Delete{
|
||||||
|
Objects: objectsToDelete,
|
||||||
|
Quiet: aws.Bool(true),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if listOutput.IsTruncated != nil && *listOutput.IsTruncated {
|
||||||
|
continuationToken = listOutput.NextContinuationToken
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *S3Explorer) Rename(src, dst string) error {
|
func (e *S3Explorer) Rename(src, dst string) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user