|
9 | 9 | "github.com/argoproj-labs/argocd-image-updater/registry-scanner/pkg/log"
|
10 | 10 |
|
11 | 11 | "github.com/Masterminds/semver/v3"
|
| 12 | + "github.com/k1LoW/calver" |
12 | 13 | )
|
13 | 14 |
|
14 | 15 | // ImageTag is a representation of an image tag with metadata
|
@@ -172,6 +173,29 @@ func (il ImageTagList) SortBySemVer() SortableImageTagList {
|
172 | 173 | return sil
|
173 | 174 | }
|
174 | 175 |
|
| 176 | +func (il ImageTagList) SortByCalVer() SortableImageTagList { |
| 177 | + il.lock.RLock() |
| 178 | + defer il.lock.RUnlock() |
| 179 | + sil := make(SortableImageTagList, 0, len(il.items)) |
| 180 | + calvers := make([]calver.Calver, 0, len(il.items)) |
| 181 | + for _, v := range il.items { |
| 182 | + cv, err := calver.Parse(v.TagName) |
| 183 | + if err != nil { |
| 184 | + // Fallback to alphabetical order if parsing fails |
| 185 | + sil = append(sil, v) |
| 186 | + } else { |
| 187 | + calvers = append(calvers, cv) |
| 188 | + } |
| 189 | + } |
| 190 | + sort.Slice(calvers, func(i, j int) bool { |
| 191 | + return calvers[i].String() < calvers[j].String() |
| 192 | + }) |
| 193 | + for _, cv := range calvers { |
| 194 | + sil = append(sil, il.items[cv.String()]) |
| 195 | + } |
| 196 | + return sil |
| 197 | +} |
| 198 | + |
175 | 199 | // Should only be used in a method that holds a lock on the ImageTagList
|
176 | 200 | func (il ImageTagList) unlockedContains(tag *ImageTag) bool {
|
177 | 201 | if _, ok := il.items[tag.TagName]; ok {
|
|
0 commit comments