diff --git a/.release.yml b/.release.yml index 12da15b..00c33ff 100644 --- a/.release.yml +++ b/.release.yml @@ -1,25 +1,26 @@ -release: "github" -github: - repo: "go-semantic-release" - user: "nightapes" -commitFormat: angular -branch: - master: release -assets: - - name: ./build/go-semantic-release - compress: false - - name: ./build/go-semantic-release.exe - compress: false -changelog: - docker: - latest: true - repository: "nightapes/go-semantic-release" -hooks: - preRelease: - - docker build -t nightapes/go-semantic-release:latest . - - docker tag nightapes/go-semantic-release:latest docker.pkg.github.com/nightapes/go-semantic-release/go-semantic-release:$RELEASE_VERSION - - docker tag nightapes/go-semantic-release:latest nightapes/go-semantic-release:$RELEASE_VERSION - postRelease: - - docker push nightapes/go-semantic-release:latest - - docker push nightapes/go-semantic-release:$RELEASE_VERSION - - docker push docker.pkg.github.com/nightapes/go-semantic-release/go-semantic-release:$RELEASE_VERSION +release: "github" +github: + repo: "go-semantic-release" + user: "nightapes" +commitFormat: angular +branch: + master: release + beta: beta +assets: + - name: ./build/go-semantic-release + compress: false + - name: ./build/go-semantic-release.exe + compress: false +changelog: + docker: + latest: true + repository: "nightapes/go-semantic-release" +hooks: + preRelease: + - docker build -t nightapes/go-semantic-release:latest . + - docker tag nightapes/go-semantic-release:latest docker.pkg.github.com/nightapes/go-semantic-release/go-semantic-release:$RELEASE_VERSION + - docker tag nightapes/go-semantic-release:latest nightapes/go-semantic-release:$RELEASE_VERSION + postRelease: + - docker push nightapes/go-semantic-release:latest + - docker push nightapes/go-semantic-release:$RELEASE_VERSION + - docker push docker.pkg.github.com/nightapes/go-semantic-release/go-semantic-release:$RELEASE_VERSION diff --git a/internal/calculator/calculator.go b/internal/calculator/calculator.go index dfcaa22..6a1144f 100644 --- a/internal/calculator/calculator.go +++ b/internal/calculator/calculator.go @@ -19,9 +19,9 @@ func New() *Calculator { } //IncPrerelease increase prerelease by one -func (c *Calculator) IncPrerelease(preReleaseType string, version *semver.Version) (semver.Version, error) { +func (c *Calculator) IncPrerelease(preReleaseType string, version semver.Version) (semver.Version, error) { defaultPrerelease := preReleaseType + ".0" - if version.Prerelease() == "" || !strings.HasPrefix(version.Prerelease(), preReleaseType) { + if !c.hasPrerelease(version, preReleaseType) { return version.SetPrerelease(defaultPrerelease) } @@ -32,19 +32,31 @@ func (c *Calculator) IncPrerelease(preReleaseType string, version *semver.Versio log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String()) return version.SetPrerelease(defaultPrerelease) } - return version.SetPrerelease(preReleaseType + "." + strconv.Itoa((i + 1))) + return version.SetPrerelease(preReleaseType + "." + strconv.Itoa(i+1)) } log.Warnf("Could not parse release tag %s, use version %s", version.Prerelease(), version.String()) return version.SetPrerelease(defaultPrerelease) } +func (c *Calculator) hasPrerelease(version semver.Version, preReleaseType string) bool { + if version.Prerelease() == "" || !strings.HasPrefix(version.Prerelease(), preReleaseType) { + return false + } + return true +} + //CalculateNewVersion from given commits and lastversion func (c *Calculator) CalculateNewVersion(commits map[shared.Release][]shared.AnalyzedCommit, lastVersion *semver.Version, releaseType string, firstRelease bool) semver.Version { switch releaseType { case "beta", "alpha", "rc": + var version = *lastVersion + if !c.hasPrerelease(*lastVersion, releaseType) { + version, _ = c.inc(commits, lastVersion) + } + if len(commits["major"]) > 0 || len(commits["minor"]) > 0 || len(commits["patch"]) > 0 { - version, _ := c.IncPrerelease(releaseType, lastVersion) + version, _ := c.IncPrerelease(releaseType, version) return version } case "release": @@ -53,16 +65,23 @@ func (c *Calculator) CalculateNewVersion(commits map[shared.Release][]shared.Ana newVersion, _ := lastVersion.SetPrerelease("") return newVersion } - - if len(commits["major"]) > 0 { - return lastVersion.IncMajor() - } else if len(commits["minor"]) > 0 { - return lastVersion.IncMinor() - } else if len(commits["patch"]) > 0 { - return lastVersion.IncPatch() + version, done := c.inc(commits, lastVersion) + if done { + return version } } } return *lastVersion } + +func (c *Calculator) inc(commits map[shared.Release][]shared.AnalyzedCommit, lastVersion *semver.Version) (semver.Version, bool) { + if len(commits["major"]) > 0 { + return lastVersion.IncMajor(), true + } else if len(commits["minor"]) > 0 { + return lastVersion.IncMinor(), true + } else if len(commits["patch"]) > 0 { + return lastVersion.IncPatch(), true + } + return semver.Version{}, false +} diff --git a/internal/calculator/calculator_test.go b/internal/calculator/calculator_test.go index 5abe677..cc7405a 100644 --- a/internal/calculator/calculator_test.go +++ b/internal/calculator/calculator_test.go @@ -58,9 +58,11 @@ func TestCalculator_IncPrerelease(t *testing.T) { c := calculator.New() for _, test := range testConfigs { - next, err := c.IncPrerelease(test.preReleaseType, test.lastVersion) - assert.Equalf(t, test.hasError, err != nil, "Testcase %s should have error: %t -> %s", test.testCase, test.hasError, err) - assert.Equal(t, test.nextVersion, next.String()) + t.Run(test.testCase, func(t *testing.T) { + next, err := c.IncPrerelease(test.preReleaseType, *test.lastVersion) + assert.Equalf(t, test.hasError, err != nil, "Testcase %s should have error: %t -> %s", test.testCase, test.hasError, err) + assert.Equal(t, test.nextVersion, next.String()) + }) } } @@ -79,7 +81,7 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { testCase: "version with preRelease alpha", releaseType: "alpha", lastVersion: createVersion("1.0.0"), - nextVersion: "1.0.0-alpha.0", + nextVersion: "1.1.0-alpha.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "major": []shared.AnalyzedCommit{}, "minor": []shared.AnalyzedCommit{ @@ -94,7 +96,7 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { testCase: "version with preRelease beta", releaseType: "beta", lastVersion: createVersion("1.0.0"), - nextVersion: "1.0.0-beta.0", + nextVersion: "1.1.0-beta.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "major": []shared.AnalyzedCommit{}, "minor": []shared.AnalyzedCommit{ @@ -135,7 +137,7 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { testCase: "version with commits and rc release", releaseType: "rc", lastVersion: createVersion("1.0.0"), - nextVersion: "1.0.0-rc.0", + nextVersion: "2.0.0-rc.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "major": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, "minor": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, @@ -201,8 +203,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { c := calculator.New() for _, test := range testConfigs { - next := c.CalculateNewVersion(test.analyzedCommits, test.lastVersion, test.releaseType, test.isFirst) - assert.Equalf(t, test.nextVersion, next.String(), "Should have version %s for testcase %s", test.nextVersion, test.testCase) + t.Run(test.testCase, func(t *testing.T) { + next := c.CalculateNewVersion(test.analyzedCommits, test.lastVersion, test.releaseType, test.isFirst) + assert.Equalf(t, test.nextVersion, next.String(), "Should have version %s for testcase %s", test.nextVersion, test.testCase) + }) } } diff --git a/internal/changelog/changelog.go b/internal/changelog/changelog.go index 55a3d88..5158466 100644 --- a/internal/changelog/changelog.go +++ b/internal/changelog/changelog.go @@ -15,19 +15,19 @@ import ( ) const defaultCommitList string = `{{ range $index,$commit := .BreakingChanges -}} -{{ if eq $index 0 }} +{{ if eq $index 0 -}} ## BREAKING CHANGES -{{ end}} +{{ end -}} * {{ if $commit.Scope }}**{{$.Backtick}}{{$commit.Scope}}{{$.Backtick}}**{{ end }} {{$commit.ParsedBreakingChangeMessage}} introduced by commit: {{$commit.ParsedMessage}} {{if $.HasURL}} ([{{ printf "%.7s" $commit.Commit.Hash}}]({{ replace $.URL "{{hash}}" $commit.Commit.Hash}})){{end}} {{ end -}} -{{ range $key := .Order }} +{{ range $key := .Order -}} {{ $commits := index $.Commits $key -}} -{{ if $commits }} +{{ if $commits -}} ### {{ $key }} -{{ range $index,$commit := $commits }} -* {{ if $commit.Scope}}**{{$.Backtick}}{{$commit.Scope}}{{$.Backtick}}** {{end}}{{$commit.ParsedMessage}}{{if $.HasURL}} ([{{ printf "%.7s" $commit.Commit.Hash}}]({{ replace $.URL "{{hash}}" $commit.Commit.Hash}})){{end}} +{{ range $index,$commit := $commits -}} +* {{ if $commit.Scope }}**{{$.Backtick}}{{$commit.Scope}}{{$.Backtick}}** {{end}}{{$commit.ParsedMessage}}{{if $.HasURL}} ([{{ printf "%.7s" $commit.Commit.Hash}}]({{ replace $.URL "{{hash}}" $commit.Commit.Hash}})){{end}} {{ end -}} {{ end -}} {{ end -}}` diff --git a/internal/changelog/changelog_test.go b/internal/changelog/changelog_test.go index cf76435..8a22764 100644 --- a/internal/changelog/changelog_test.go +++ b/internal/changelog/changelog_test.go @@ -46,7 +46,7 @@ func TestChangelog(t *testing.T) { }, result: &shared.GeneratedChangelog{ Title: "v1.0.0 (2019-07-19)", - Content: "# v1.0.0 (2019-07-19)\n\n\n### Features\n\n* **`internal/changelog`** my first commit ([1234566](https://commit.url))\n\n", + Content: "# v1.0.0 (2019-07-19)\n### Features\n* **`internal/changelog`** my first commit ([1234566](https://commit.url))\n", }, hasError: false, }, @@ -69,7 +69,7 @@ func TestChangelog(t *testing.T) { }, result: &shared.GeneratedChangelog{ Title: "v1.0.0 (2019-07-19)", - Content: "# v1.0.0 (2019-07-19)\n\n\n### Features\n\n* my first commit ([1234566](https://commit.url))\n\n", + Content: "# v1.0.0 (2019-07-19)\n### Features\n* my first commit ([1234566](https://commit.url))\n", }, hasError: false, }, @@ -106,7 +106,7 @@ func TestChangelog(t *testing.T) { }, result: &shared.GeneratedChangelog{ Title: "v1.0.0 (2019-07-19)", - Content: "# v1.0.0 (2019-07-19)\n\n## BREAKING CHANGES\n\n* **`internal/changelog`** change api to v2 \nintroduced by commit: \nmy first break ([1234566](https://commit.url))\n\n\n### Features\n\n* **`internal/changelog`** my first commit ([1234566](https://commit.url))\n\n", + Content: "# v1.0.0 (2019-07-19)\n## BREAKING CHANGES\n* **`internal/changelog`** change api to v2 \nintroduced by commit: \nmy first break ([1234566](https://commit.url))\n### Features\n* **`internal/changelog`** my first commit ([1234566](https://commit.url))\n", }, hasError: false, }, @@ -134,9 +134,11 @@ func TestChangelog(t *testing.T) { }, time.Date(2019, 7, 19, 0, 0, 0, 0, time.UTC)) for _, config := range testConfigs { - generatedChangelog, err := cl.GenerateChanglog(templateConfig, config.analyzedCommits) - assert.Equalf(t, config.hasError, err != nil, "Testcase %s should have error: %t -> %s", config.testCase, config.hasError, err) - assert.Equalf(t, config.result, generatedChangelog, "Testcase %s should have generated changelog", config.testCase) + t.Run(config.testCase, func(t *testing.T) { + generatedChangelog, err := cl.GenerateChanglog(templateConfig, config.analyzedCommits) + assert.Equalf(t, config.hasError, err != nil, "Testcase %s should have error: %t -> %s", config.testCase, config.hasError, err) + assert.Equalf(t, config.result, generatedChangelog, "Testcase %s should have generated changelog", config.testCase) + }) } }