func aliasesToBump()

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
}