in cmd/acr/purge.go [253:317]
func getTagsToDelete(ctx context.Context,
acrClient api.AcrCLIClientInterface,
repoName string,
filter *regexp2.Regexp,
timeToCompare time.Time,
lastTag string,
keep int,
skippedTagsCount int) (*[]acr.TagAttributesBase, string, int, error) {
var matches bool
var lastUpdateTime time.Time
resultTags, err := acrClient.GetAcrTags(ctx, repoName, "timedesc", lastTag)
if err != nil {
if resultTags != nil && resultTags.Response.Response != nil && resultTags.StatusCode == http.StatusNotFound {
fmt.Printf("%s repository not found\n", repoName)
return nil, "", skippedTagsCount, nil
}
// An empty lastTag string is returned so there will not be any tag purged.
return nil, "", skippedTagsCount, err
}
newLastTag := ""
if resultTags != nil && resultTags.TagsAttributes != nil && len(*resultTags.TagsAttributes) > 0 {
tags := *resultTags.TagsAttributes
tagsEligibleForDeletion := []acr.TagAttributesBase{}
for _, tag := range tags {
matches, err = filter.MatchString(*tag.Name)
if err != nil {
// The only error that regexp2 will return is a timeout error
return nil, "", skippedTagsCount, err
}
if !matches {
// If a tag does not match the regex then it not added to the list no matter the LastUpdateTime
continue
}
lastUpdateTime, err = time.Parse(time.RFC3339Nano, *tag.LastUpdateTime)
if err != nil {
return nil, "", skippedTagsCount, err
}
// If a tag did match the regex filter, is older than the specified duration and can be deleted then it is returned
// as a tag to delete.
if lastUpdateTime.Before(timeToCompare) && *(*tag.ChangeableAttributes).DeleteEnabled && *(*tag.ChangeableAttributes).WriteEnabled {
tagsEligibleForDeletion = append(tagsEligibleForDeletion, tag)
}
}
newLastTag = common.GetLastTagFromResponse(resultTags)
// No more tags to keep
if keep == 0 || skippedTagsCount == keep {
return &tagsEligibleForDeletion, newLastTag, skippedTagsCount, nil
}
tagsToDelete := []acr.TagAttributesBase{}
for _, tag := range tagsEligibleForDeletion {
// Keep at least the configured number of tags
if skippedTagsCount < keep {
skippedTagsCount++
} else {
tagsToDelete = append(tagsToDelete, tag)
}
}
return &tagsToDelete, newLastTag, skippedTagsCount, nil
}
// In case there are no more tags return empty string as lastTag so that the purgeTags function stops
return nil, "", skippedTagsCount, nil
}