in cmd/acr/purge.go [179:220]
func purgeTags(ctx context.Context, acrClient api.AcrCLIClientInterface, poolSize int, loginURL string, repoName string, ago string, tagFilter string, keep int, regexpMatchTimeoutSeconds int64) (int, error) {
fmt.Printf("Deleting tags for repository: %s\n", repoName)
agoDuration, err := parseDuration(ago)
if err != nil {
return -1, err
}
timeToCompare := time.Now().UTC()
// Since the parseDuration function returns a negative duration, it is added to the current duration in order to be able to easily compare
// with the LastUpdatedTime attribute a tag has.
timeToCompare = timeToCompare.Add(agoDuration)
tagRegex, err := common.BuildRegexFilter(tagFilter, regexpMatchTimeoutSeconds)
if err != nil {
return -1, err
}
lastTag := ""
skippedTagsCount := 0
deletedTagsCount := 0
// In order to only have a limited amount of http requests, a purger is used that will start goroutines to delete tags.
purger := worker.NewPurger(poolSize, acrClient, loginURL, repoName)
// GetTagsToDelete will return an empty lastTag when there are no more tags.
for {
tagsToDelete, newLastTag, newSkippedTagsCount, err := getTagsToDelete(ctx, acrClient, repoName, tagRegex, timeToCompare, lastTag, keep, skippedTagsCount)
if err != nil {
return -1, err
}
lastTag = newLastTag
skippedTagsCount = newSkippedTagsCount
if tagsToDelete != nil {
count, purgeErr := purger.PurgeTags(ctx, tagsToDelete)
if purgeErr != nil {
return -1, purgeErr
}
deletedTagsCount += count
}
if len(lastTag) == 0 {
break
}
}
return deletedTagsCount, nil
}