Compare commits

...

3 commits

Author SHA1 Message Date
renovate[bot]
84c5f2d490
deps: update module github.com/xanzy/go-gitlab to v0.115.0 2025-05-22 13:39:23 +00:00
fe3c9488b3
chore(main): release v0.5.1 (#175)
### Bug Fixes

- invalid version for subsequent pre-releases (#174)
2025-05-22 15:38:41 +02:00
d9c081d280
fix: invalid version for subsequent pre-releases (#174)
If two pre-releases were cut in a row, the second pre-release version
would only consider the semantic changes since the previous pre-release,
but base its new version of the latest tag.

Example:

- stable tag: `1.2.0`
- latest tag: `1.3.0-rc.1`
- 1 commit since with `fix:` tag

The resulting releaser-pleaser tag would be: `1.2.1-rc.2`. It should be
`1.3.0-rc.2` instead.

This is now fixed by considering different commit ranges for versioning
and changelog.

For a stable version we want the list of changes since the stable tag.

For a prerelease version we want the list of changes since the latest
tag. To avoid repeating the same features over and over in a series of
multiple pre-releases.

This behaviour already existed and worked.

For a stable version, we want to consider all changes since the stable
tag.

For a prerelease version, we also want to consider all changes since the
stable tag. This was broken and only used the changes since the latest
tag.
2025-05-22 15:27:49 +02:00
6 changed files with 52 additions and 31 deletions

View file

@ -1,5 +1,11 @@
# Changelog
## [v0.5.1](https://github.com/apricote/releaser-pleaser/releases/tag/v0.5.1)
### Bug Fixes
- invalid version for subsequent pre-releases (#174)
## [v0.5.0](https://github.com/apricote/releaser-pleaser/releases/tag/v0.5.0)
### Features

View file

@ -21,7 +21,7 @@ inputs:
outputs: {}
runs:
using: 'docker'
image: docker://ghcr.io/apricote/releaser-pleaser:v0.5.0 # x-releaser-pleaser-version
image: docker://ghcr.io/apricote/releaser-pleaser:v0.5.1 # x-releaser-pleaser-version
args:
- run
- --forge=github

2
go.mod
View file

@ -12,7 +12,7 @@ require (
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
github.com/teekennedy/goldmark-markdown v0.5.1
github.com/xanzy/go-gitlab v0.114.0
github.com/xanzy/go-gitlab v0.115.0
github.com/yuin/goldmark v1.7.12
)

4
go.sum
View file

@ -104,8 +104,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/teekennedy/goldmark-markdown v0.5.1 h1:2lIlJ3AcIwaD1wFl4dflJSJFMhRTKEsEj+asVsu6M/0=
github.com/teekennedy/goldmark-markdown v0.5.1/go.mod h1:so260mNSPELuRyynZY18719dRYlD+OSnAovqsyrOMOM=
github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy19M=
github.com/xanzy/go-gitlab v0.114.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY=
github.com/xanzy/go-gitlab v0.115.0 h1:6DmtItNcVe+At/liXSgfE/DZNZrGfalQmBRmOcJjOn8=
github.com/xanzy/go-gitlab v0.115.0/go.mod h1:5XCDtM7AM6WMKmfDdOiEpyRWUqui2iS9ILfvCZ2gJ5M=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY=

View file

@ -179,34 +179,16 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error {
logger.InfoContext(ctx, "no latest tag found")
}
// By default, we want to show everything that has happened since the last stable release
lastReleaseCommit := releases.Stable
if releaseOverrides.NextVersionType.IsPrerelease() {
// if the new release will be a prerelease,
// only show changes since the latest release (stable or prerelease)
lastReleaseCommit = releases.Latest
}
commits, err := rp.forge.CommitsSince(ctx, lastReleaseCommit)
// For stable releases, we want to consider all changes since the last stable release for version and changelog.
// For prereleases, we want to consider all changes...
// - since the last stable release for the version
// - since the latest release (stable or prerelease) for the changelog
analyzedCommitsForVersioning, err := rp.analyzedCommitsSince(ctx, releases.Stable)
if err != nil {
return err
}
commits, err = parsePRBodyForCommitOverrides(commits)
if err != nil {
return err
}
logger.InfoContext(ctx, "Found releasable commits", "length", len(commits))
analyzedCommits, err := rp.commitParser.Analyze(commits)
if err != nil {
return err
}
logger.InfoContext(ctx, "Analyzed commits", "length", len(analyzedCommits))
if len(analyzedCommits) == 0 {
if len(analyzedCommitsForVersioning) == 0 {
if pr != nil {
logger.InfoContext(ctx, "closing existing pull requests, no commits available", "pr.id", pr.ID, "pr.title", pr.Title)
err = rp.forge.ClosePullRequest(ctx, pr)
@ -220,7 +202,7 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error {
return nil
}
versionBump := versioning.BumpFromCommits(analyzedCommits)
versionBump := versioning.BumpFromCommits(analyzedCommitsForVersioning)
// TODO: Set version in release pr
nextVersion, err := rp.versioning.NextVersion(releases, versionBump, releaseOverrides.NextVersionType)
if err != nil {
@ -228,6 +210,14 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error {
}
logger.InfoContext(ctx, "next version", "version", nextVersion)
analyzedCommitsForChangelog := analyzedCommitsForVersioning
if releaseOverrides.NextVersionType.IsPrerelease() && releases.Latest != releases.Stable {
analyzedCommitsForChangelog, err = rp.analyzedCommitsSince(ctx, releases.Latest)
if err != nil {
return err
}
}
logger.DebugContext(ctx, "cloning repository", "clone.url", rp.forge.CloneURL())
repo, err := git.CloneRepo(ctx, logger, rp.forge.CloneURL(), rp.targetBranch, rp.forge.GitAuth())
if err != nil {
@ -242,7 +232,7 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error {
return err
}
changelogData := changelog.New(commitparser.ByType(analyzedCommits), nextVersion, rp.forge.ReleaseURL(nextVersion), releaseOverrides.Prefix, releaseOverrides.Suffix)
changelogData := changelog.New(commitparser.ByType(analyzedCommitsForChangelog), nextVersion, rp.forge.ReleaseURL(nextVersion), releaseOverrides.Prefix, releaseOverrides.Suffix)
changelogEntry, err := changelog.Entry(logger, changelog.DefaultTemplate(), changelogData, changelog.Formatting{})
if err != nil {
@ -330,3 +320,28 @@ func (rp *ReleaserPleaser) runReconcileReleasePR(ctx context.Context) error {
return nil
}
func (rp *ReleaserPleaser) analyzedCommitsSince(ctx context.Context, since *git.Tag) ([]commitparser.AnalyzedCommit, error) {
logger := rp.logger.With("method", "analyzedCommitsSince", "tag.hash", since.Hash, "tag.name", since.Name)
commits, err := rp.forge.CommitsSince(ctx, since)
if err != nil {
return nil, err
}
commits, err = parsePRBodyForCommitOverrides(commits)
if err != nil {
return nil, err
}
logger.InfoContext(ctx, "Found releasable commits", "length", len(commits))
analyzedCommits, err := rp.commitParser.Analyze(commits)
if err != nil {
return nil, err
}
logger.InfoContext(ctx, "Analyzed commits", "length", len(analyzedCommits))
return analyzedCommits, nil
}

View file

@ -30,7 +30,7 @@ releaser-pleaser:
# There is no way to run a pipeline when the MR description is updated :(
- if: $CI_COMMIT_BRANCH == "$[[ inputs.branch ]]"
image:
name: ghcr.io/apricote/releaser-pleaser:v0.5.0 # x-releaser-pleaser-version
name: ghcr.io/apricote/releaser-pleaser:v0.5.1 # x-releaser-pleaser-version
entrypoint: [ "" ]
variables:
GITLAB_TOKEN: $[[ inputs.token ]]