releaser-pleaser/versioning.go

110 lines
2.6 KiB
Go
Raw Normal View History

2024-08-01 23:00:56 +02:00
package rp
import (
"fmt"
"strings"
"github.com/blang/semver/v4"
"github.com/leodido/go-conventionalcommits"
)
2024-08-02 23:11:07 +02:00
type Releases struct {
Latest *Tag
Stable *Tag
}
2024-08-02 23:11:07 +02:00
func (r Releases) NextVersion(versionBump conventionalcommits.VersionBump, nextVersionType NextVersionType) (string, error) {
latest, err := parseSemverWithDefault(r.Latest)
if err != nil {
2024-08-02 23:11:07 +02:00
return "", fmt.Errorf("failed to parse latest version: %w", err)
}
2024-08-01 23:00:56 +02:00
2024-08-02 23:11:07 +02:00
stable, err := parseSemverWithDefault(r.Stable)
2024-08-01 23:00:56 +02:00
if err != nil {
2024-08-02 23:11:07 +02:00
return "", fmt.Errorf("failed to parse stable version: %w", err)
2024-08-01 23:00:56 +02:00
}
next := stable // Copy all fields
2024-08-01 23:00:56 +02:00
switch versionBump {
case conventionalcommits.UnknownVersion:
return "", fmt.Errorf("invalid latest bump (unknown)")
2024-08-01 23:00:56 +02:00
case conventionalcommits.PatchVersion:
err = next.IncrementPatch()
2024-08-01 23:00:56 +02:00
case conventionalcommits.MinorVersion:
err = next.IncrementMinor()
2024-08-01 23:00:56 +02:00
case conventionalcommits.MajorVersion:
err = next.IncrementMajor()
2024-08-01 23:00:56 +02:00
}
switch nextVersionType {
case NextVersionTypeUndefined, NextVersionTypeNormal:
next.Pre = make([]semver.PRVersion, 0)
2024-08-01 23:00:56 +02:00
case NextVersionTypeAlpha, NextVersionTypeBeta, NextVersionTypeRC:
id := uint64(0)
if len(latest.Pre) >= 2 && latest.Pre[0].String() == nextVersionType.String() {
if latest.Pre[1].String() == "" || !latest.Pre[1].IsNumeric() {
2024-08-01 23:00:56 +02:00
return "", fmt.Errorf("invalid format of previous tag")
}
id = latest.Pre[1].VersionNum + 1
2024-08-01 23:00:56 +02:00
}
setPRVersion(&next, nextVersionType.String(), id)
}
if err != nil {
return "", err
2024-08-01 23:00:56 +02:00
}
return "v" + next.String(), nil
2024-08-01 23:00:56 +02:00
}
func VersionBumpFromChangesets(changesets []Changeset) conventionalcommits.VersionBump {
2024-08-01 23:00:56 +02:00
bump := conventionalcommits.UnknownVersion
for _, changeset := range changesets {
for _, entry := range changeset.ChangelogEntries {
entryBump := conventionalcommits.UnknownVersion
switch {
case entry.BreakingChange:
entryBump = conventionalcommits.MajorVersion
case entry.Type == "feat":
entryBump = conventionalcommits.MinorVersion
case entry.Type == "fix":
entryBump = conventionalcommits.PatchVersion
}
if entryBump > bump {
bump = entryBump
}
}
}
return bump
}
func setPRVersion(version *semver.Version, prType string, count uint64) {
version.Pre = []semver.PRVersion{
{VersionStr: prType},
{VersionNum: count, IsNum: true},
}
}
2024-08-02 23:11:07 +02:00
func parseSemverWithDefault(tag *Tag) (semver.Version, error) {
version := "v0.0.0"
if tag != nil {
version = tag.Name
}
// The lib can not handle v prefixes
version = strings.TrimPrefix(version, "v")
parsedVersion, err := semver.Parse(version)
if err != nil {
return semver.Version{}, fmt.Errorf("failed to parse version %q: %w", version, err)
}
return parsedVersion, nil
}