package pruner import ( "backup-tool/helpers" "context" "github.com/minio/minio-go/v7" "log" "sort" ) func PruneFiles(bucket, endpoint string, keep int) error { ctx := context.Background() accessKeyID, secretAccessKey, err := helpers.GetCredentials() if err != nil { return err } client, err := helpers.CreateClient(accessKeyID, secretAccessKey, endpoint) if err != nil { return err } err = helpers.VerifyBucket(client, ctx, bucket) if err != nil { return err } var objects []minio.ObjectInfo for obj := range client.ListObjects(ctx, bucket, minio.ListObjectsOptions{}) { objects = append(objects, obj) } if len(objects) < keep { return nil } sort.Sort(BucketObjects(objects)) // last modified object will be at position 0 for _, object := range objects[keep:] { err := client.RemoveObject(ctx, bucket, object.Key, minio.RemoveObjectOptions{}) if err != nil { log.Printf("error deleting object %q: %s", object.Key, err.Error()) } else { log.Printf("deleted object %q", object.Key) } } return nil } type BucketObjects []minio.ObjectInfo func (b BucketObjects) Len() int { return len(b) } func (b BucketObjects) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func (b BucketObjects) Less(i, j int) bool { return b[i].LastModified.After(b[j].LastModified) } // return newest object first in list