in container_images/registry-image-forked/commands/out.go [263:349]
func aliasesToBump(req resource.OutRequest, repo name.Repository, ver *semver.Version) ([]name.Tag, error) {
variant := req.Source.Variant
repo, err := req.Source.NewRepository()
if err != nil {
return nil, fmt.Errorf("resolve repository name: %w", err)
}
opts, err := req.Source.AuthOptions(repo, []string{transport.PullScope})
if err != nil {
return nil, err
}
versions, err := remote.List(repo, opts...)
if err != nil && !isNewImage(err) {
return nil, fmt.Errorf("list repository tags: %w", err)
}
aliases := []name.Tag{}
bumpLatest := true
bumpMajor := true
bumpMinor := true
for _, v := range versions {
versionStr := v
if variant != "" {
if !strings.HasSuffix(versionStr, "-"+variant) {
// don't compare across variants
continue
}
versionStr = strings.TrimSuffix(versionStr, "-"+variant)
}
remoteVer, err := semver.NewVersion(versionStr)
if err != nil {
continue
}
// don't compare to prereleases or other variants
if remoteVer.Prerelease() != "" {
continue
}
if remoteVer.GreaterThan(ver) {
bumpLatest = false
}
if remoteVer.Major() == ver.Major() && remoteVer.Minor() > ver.Minor() {
bumpMajor = false
}
if remoteVer.Major() == ver.Major() && remoteVer.Minor() == ver.Minor() && remoteVer.Patch() > ver.Patch() {
bumpMinor = false
bumpMajor = false
}
}
if bumpLatest {
latestTag := "latest"
if variant != "" {
latestTag = variant
}
aliases = append(aliases, repo.Tag(latestTag))
}
if bumpMajor {
tagName := fmt.Sprintf("%d", ver.Major())
if variant != "" {
tagName += "-" + variant
}
aliases = append(aliases, repo.Tag(tagName))
}
if bumpMinor {
tagName := fmt.Sprintf("%d.%d", ver.Major(), ver.Minor())
if variant != "" {
tagName += "-" + variant
}
aliases = append(aliases, repo.Tag(tagName))
}
return aliases, nil
}