func calculateNextVersion()

in release/release.go [158:214]


func calculateNextVersion(parsed semver.Parsed, increment changelog.SemVerIncrement, config repotools.ModuleConfig) (string, error) {
	if increment == changelog.ReleaseBump {
		// Release Bumps are used to elevate pre-release tag versions to released versions
		// Examples:
		//   v1.4.0-preview   => v1.4.0
		//   v1.4.0-preview.1 => v1.4.0

		if len(parsed.Prerelease) == 0 {
			return "", fmt.Errorf("changelog annotation requests release bump, but latest tag is not a pre-release")
		}
		parsed.Prerelease = ""
	} else if len(parsed.Prerelease) > 0 {
		// The existing tag is a pre-release so just increment the pre-release tag number
		// Examples:
		//   v1.4.0-preview   => v1.4.0-preview.1
		//   v1.4.0-preview.2 => v1.4.0-preview.3
		//   v1.4.0-preview   => v1.4.0-rc (if different pre-release identifier is configured)

		if err := incrementPrerelease(&parsed.Prerelease, config.PreRelease); err != nil {
			return "", err
		}
	} else if len(parsed.Prerelease) == 0 && len(config.PreRelease) > 0 {
		// The latest tag was not a pre-release but module is configured for pre-release
		// It is assumed that the target final version is intended to be a minor bump, so we simulate that here
		// when constructing the pre-release tag.
		// Example: v1.3.6 => v1.3.6-preview

		if err := incrementStrInt(&parsed.Patch); err != nil {
			return "", err
		}

		identifier := config.PreRelease

		if !strings.HasPrefix(identifier, "-") {
			identifier = "-" + identifier
		}

		parsed.Prerelease = identifier

	} else if increment == changelog.MinorBump {
		// Module should be bumped by a minor version
		// Example: v1.2.3 => v1.3.0

		if err := incrementStrInt(&parsed.Minor); err != nil {
			return "", err
		}
		parsed.Patch = "0"
	} else {
		// Patch Bump
		// Example: v1.2.3 => v1.2.4
		if err := incrementStrInt(&parsed.Patch); err != nil {
			return "", err
		}
	}

	return parsed.String(), nil
}