1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-07-15 01:34:21 +02:00

feat: allow to customize release notes update behavior (#2702)

* feat: allow to customize release notes update behavior

closes #1384

Signed-off-by: Carlos A Becker <caarlos0@gmail.com>

* fix: make it a bit better

Signed-off-by: Carlos A Becker <caarlos0@gmail.com>

* fix: jsonschema

Signed-off-by: Carlos A Becker <caarlos0@gmail.com>
This commit is contained in:
Carlos Alexandro Becker
2021-11-26 09:59:15 -03:00
committed by GitHub
parent f659701fef
commit b8f61718f3
8 changed files with 114 additions and 10 deletions

View File

@ -252,9 +252,7 @@ func (c *giteaClient) CreateRelease(ctx *context.Context, body string) (string,
}
if release != nil {
if release.Note != "" {
body = release.Note
}
body = getReleaseNotes(release.Note, body, ctx.Config.Release.ReleaseNotesMode)
release, err = c.updateRelease(ctx, title, body, release.ID)
if err != nil {
return "", err

View File

@ -235,10 +235,7 @@ func (c *githubClient) CreateRelease(ctx *context.Context, body string) (string,
data,
)
} else {
// keep the pre-existing release notes
if release.GetBody() != "" {
data.Body = release.Body
}
data.Body = github.String(getReleaseNotes(release.GetBody(), body, ctx.Config.Release.ReleaseNotesMode))
release, _, err = c.client.Repositories.EditRelease(
ctx,
ctx.Config.Release.GitHub.Owner,

View File

@ -310,8 +310,8 @@ func (c *gitlabClient) CreateRelease(ctx *context.Context, body string) (release
log.WithField("name", release.Name).Info("release created")
} else {
desc := body
if release != nil && release.DescriptionHTML != "" {
desc = release.DescriptionHTML
if release != nil {
desc = getReleaseNotes(release.DescriptionHTML, body, ctx.Config.Release.ReleaseNotesMode)
}
release, _, err = c.client.Releases.UpdateRelease(projectID, tagName, &gitlab.UpdateReleaseOptions{

View File

@ -0,0 +1,19 @@
package client
import "github.com/goreleaser/goreleaser/pkg/config"
func getReleaseNotes(existing, current string, mode config.ReleaseNotesMode) string {
switch mode {
case config.ReleaseNotesModeAppend:
return existing + "\n\n" + current
case config.ReleaseNotesModeReplace:
return current
case config.ReleaseNotesModePrepend:
return current + "\n\n" + existing
default:
if existing != "" {
return existing
}
return current
}
}

View File

@ -0,0 +1,37 @@
package client
import (
"testing"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/stretchr/testify/require"
)
func TestGetReleaseNotes(t *testing.T) {
const existing = "existing rel notes"
const current = "current rel notes"
t.Run("keep and existing empty", func(t *testing.T) {
require.Equal(t, current, getReleaseNotes("", current, config.ReleaseNotesModeKeepExisting))
})
t.Run("keep", func(t *testing.T) {
require.Equal(t, existing, getReleaseNotes(existing, current, config.ReleaseNotesModeKeepExisting))
})
t.Run("replace", func(t *testing.T) {
require.Equal(t, current, getReleaseNotes(existing, current, config.ReleaseNotesModeReplace))
})
t.Run("append", func(t *testing.T) {
require.Equal(t, "existing rel notes\n\ncurrent rel notes", getReleaseNotes(existing, current, config.ReleaseNotesModeAppend))
})
t.Run("prepend", func(t *testing.T) {
require.Equal(t, "current rel notes\n\nexisting rel notes", getReleaseNotes(existing, current, config.ReleaseNotesModePrepend))
})
t.Run("invalid", func(t *testing.T) {
require.Equal(t, existing, getReleaseNotes(existing, current, config.ReleaseNotesMode("invalid")))
})
}

View File

@ -450,6 +450,15 @@ type Archive struct {
AllowDifferentBinaryCount bool `yaml:"allow_different_binary_count,omitempty"`
}
type ReleaseNotesMode string
const (
ReleaseNotesModeKeepExisting ReleaseNotesMode = "keep-existing"
ReleaseNotesModeAppend ReleaseNotesMode = "append"
ReleaseNotesModeReplace ReleaseNotesMode = "replace"
ReleaseNotesModePrepend ReleaseNotesMode = "prepend"
)
// Release config used for the GitHub/GitLab release.
type Release struct {
GitHub Repo `yaml:"github,omitempty"`
@ -464,6 +473,8 @@ type Release struct {
DiscussionCategoryName string `yaml:"discussion_category_name,omitempty"`
Header string `yaml:"header,omitempty"`
Footer string `yaml:"footer,omitempty"`
ReleaseNotesMode ReleaseNotesMode `yaml:"mode,omitempty" jsonschema:"title=enum=keep-existing,enum=append,enum=prepend,enum=replace,default=keep-existing"`
}
// Milestone config used for VCS milestone.

View File

@ -41,6 +41,17 @@ release:
# Default is false.
prerelease: auto
# What to do with the release notes in case there the release already exists.
#
# Valid options are:
# - `keep-existing`: keep the existing notes
# - `append`: append the current release notes to the existing notes
# - `prepend`: prepend the current release notes to the existing notes
# - `replace`: replace existing notes
#
# Default is `keep-existing`.
mode: append
# Header template for the release body.
# Defaults to empty.
header: |
@ -82,7 +93,7 @@ release:
## GitLab
Second, let's see what can be customized in the `release` section for GitLab.
Let's see what can be customized in the `release` section for GitLab.
```yaml
# .goreleaser.yml
@ -108,6 +119,17 @@ release:
# Defaults to false.
disable: true
# What to do with the release notes in case there the release already exists.
#
# Valid options are:
# - `keep-existing`: keep the existing notes
# - `append`: append the current release notes to the existing notes
# - `prepend`: prepend the current release notes to the existing notes
# - `replace`: replace existing notes
#
# Default is `keep-existing`.
mode: append
# You can add extra pre-existing files to the release.
# The filename on the release will be the last part of the path (base).
# If another file with the same name exists, the last one found will be used.
@ -157,6 +179,17 @@ release:
# Defaults to false.
disable: true
# What to do with the release notes in case there the release already exists.
#
# Valid options are:
# - `keep-existing`: keep the existing notes
# - `append`: append the current release notes to the existing notes
# - `prepend`: prepend the current release notes to the existing notes
# - `replace`: replace existing notes
#
# Default is `keep-existing`.
mode: append
# You can add extra pre-existing files to the release.
# The filename on the release will be the last part of the path (base).
# If another file with the same name exists, the last one found will be used.

9
www/docs/static/schema.json generated vendored
View File

@ -1718,6 +1718,15 @@
},
"footer": {
"type": "string"
},
"mode": {
"enum": [
"append",
"prepend",
"replace"
],
"type": "string",
"default": "keep-existing"
}
},
"additionalProperties": false,