func()

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
}