in oss/lib/revert_versioning.go [220:287]
func (revert *RevertCommand) revertObjects(bucket *oss.Bucket) error {
pre := oss.Prefix(revert.revertOption.object)
keyMarker := oss.KeyMarker("")
versionIdMarker := oss.VersionIdMarker("")
listOptions := []oss.Option{pre, keyMarker, versionIdMarker, oss.MaxKeys(1000)}
if revert.revertOption.payer != "" {
listOptions = append(listOptions, oss.RequestPayer(oss.PayerType(revert.revertOption.payer)))
}
bStopped := false
batchCount := 0
for {
if bStopped {
break
}
batchCount++
lor, err := bucket.ListObjectVersions(listOptions...)
if err != nil {
return err
}
var objectVersions []oss.DeleteObject
for _, deleteMarker := range lor.ObjectDeleteMarkers {
if !revert.revertOption.recursive && deleteMarker.Key != revert.revertOption.object {
bStopped = true
break
}
if deleteMarker.IsLatest && revert.filterDeleteMarker(&deleteMarker) {
objectVersions = append(objectVersions, oss.DeleteObject{
Key: deleteMarker.Key,
VersionId: deleteMarker.VersionId,
})
}
}
if len(objectVersions) > 0 {
deleteOptions := append(revert.revertOption.options, oss.DeleteObjectsQuiet(true))
delRes, err := bucket.DeleteObjectVersions(objectVersions, deleteOptions...)
if err != nil {
return err
}
if len(delRes.DeletedObjectsDetail) > 0 {
fmt.Printf("\n")
for _, object := range delRes.DeletedObjectsDetail {
fmt.Printf("delete deleteMarker failure, key:%s,version:%s\n", object.Key, object.VersionId)
}
return fmt.Errorf("delete deleteMarker failure")
}
revert.revertOption.revertCount += int64(len(objectVersions))
for _, object := range objectVersions {
LogInfo("revert %s %s\n", object.Key, object.VersionId)
}
}
keyMarker = oss.KeyMarker(lor.NextKeyMarker)
versionIdMarker := oss.VersionIdMarker(lor.NextVersionIdMarker)
listOptions = []oss.Option{pre, keyMarker, versionIdMarker, oss.MaxKeys(1000)}
if revert.revertOption.payer != "" {
listOptions = append(listOptions, oss.RequestPayer(oss.PayerType(revert.revertOption.payer)))
}
fmt.Printf("\rrevert versioning object count is %d, batch list count is %d", revert.revertOption.revertCount, batchCount)
if !lor.IsTruncated {
break
}
}
fmt.Printf("\n")
return nil
}