From 8db8b0d72c0dd284e5107c99686d43a2b3909fdf Mon Sep 17 00:00:00 2001 From: Sebastian Beisch Date: Thu, 21 Jan 2021 21:41:14 +0100 Subject: [PATCH 1/4] feat(analyzer): add conventional commit format See: [conventional](https://www.conventionalcommits.org/en/v1.0.0/#summaryhttps://www.conventionalcommits.org/en/v1.0.0/#summary) --- .github/workflows/main.yml | 2 +- README.md | 17 +- go.mod | 15 +- go.sum | 33 ++- internal/analyzer/analyzer.go | 3 + internal/analyzer/angular.go | 2 +- internal/analyzer/angular_test.go | 80 ++++---- internal/analyzer/conventional.go | 130 ++++++++++++ internal/analyzer/conventional_test.go | 261 ++++++++++++++++++++++++ internal/cache/cache_test.go | 4 +- internal/calculator/calculator_test.go | 76 +++---- internal/changelog/changelog_test.go | 89 +++++++- internal/ci/ci_test.go | 2 +- internal/hooks/hooks.go | 3 +- internal/releaser/github/github_test.go | 8 +- internal/releaser/gitlab/gitlab.go | 1 - internal/releaser/gitlab/gitlab_test.go | 6 +- internal/releaser/util/util_test.go | 4 +- pkg/config/config_test.go | 2 +- 19 files changed, 613 insertions(+), 125 deletions(-) create mode 100644 internal/analyzer/conventional.go create mode 100644 internal/analyzer/conventional_test.go diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9ea2f51..4d595dd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: - name: Lint run: | export PATH=$PATH:$(go env GOPATH)/bin - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0 + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.3 golangci-lint run ./... - name: Run tests diff --git a/README.md b/README.md index 082dc68..244f33e 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,20 @@ hooks: #### CommitFormat -Set the commit format, at the moment we support ony [angular](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit-message-format), more coming soon. +Supported formats: + +* [angular](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit-message-format) + + ```yml + commitFormat: angular + ``` + +* [conventional](https://www.conventionalcommits.org/en/v1.0.0/#summaryhttps://www.conventionalcommits.org/en/v1.0.0/#summary) + + ```yml + commitFormat: conventional + ``` -```yml -commitFormat: angular -``` #### Branch diff --git a/go.mod b/go.mod index 9bf4735..932db98 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.13 require ( github.com/Masterminds/semver v1.5.0 - github.com/Microsoft/go-winio v0.4.15 // indirect + github.com/Microsoft/go-winio v0.4.16 // indirect github.com/go-git/go-billy/v5 v5.0.0 github.com/go-git/go-git/v5 v5.2.0 github.com/golang/protobuf v1.4.3 // indirect @@ -14,12 +14,13 @@ require ( github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.7.0 github.com/spf13/cobra v1.1.1 - github.com/stretchr/testify v1.4.0 + github.com/stretchr/testify v1.7.0 github.com/xanzy/ssh-agent v0.3.0 // indirect - golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 // indirect - golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 // indirect - golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 - golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf // indirect + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect + golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3 + golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 // indirect google.golang.org/appengine v1.6.7 // indirect - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.4.0 + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index a9b8f1f..e7e5e0f 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,8 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15 h1:qkLXKzb1QoVatRyd/YlXZ/Kg0m5K3SPuoD82jjSOaBc= -github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -288,6 +288,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= @@ -316,8 +318,8 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -378,16 +380,16 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTiq8voBeTuweGVkY6Puw= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3 h1:BaN3BAqnopnKjvl+15DYP6LLrbBHfbfmlFYzmFj/Q9Q= +golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -429,9 +431,12 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf h1:kt3wY1Lu5MJAnKTfoMR52Cu4gwvna4VTzNOiT8tY73s= -golang.org/x/sys v0.0.0-20201107080550-4d91cf3a1aaf/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -588,6 +593,12 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/analyzer/analyzer.go b/internal/analyzer/analyzer.go index 14cde1c..8607f91 100644 --- a/internal/analyzer/analyzer.go +++ b/internal/analyzer/analyzer.go @@ -38,6 +38,9 @@ func New(format string, config config.ChangelogConfig) (*Analyzer, error) { case ANGULAR: analyzer.analyzeCommits = newAngular() log.Debugf("Commit format set to %s", ANGULAR) + case CONVENTIONAL: + analyzer.analyzeCommits = newConventional() + log.Debugf("Commit format set to %s", CONVENTIONAL) default: return nil, fmt.Errorf("invalid commit format: %s", format) } diff --git a/internal/analyzer/angular.go b/internal/analyzer/angular.go index e9ce0b5..bd0ef50 100644 --- a/internal/analyzer/angular.go +++ b/internal/analyzer/angular.go @@ -17,7 +17,7 @@ type angular struct { log *log.Entry } -// ANGULAR identifer +// ANGULAR identifier const ANGULAR = "angular" func newAngular() *angular { diff --git a/internal/analyzer/angular_test.go b/internal/analyzer/angular_test.go index 1076b72..6f85479 100644 --- a/internal/analyzer/angular_test.go +++ b/internal/analyzer/angular_test.go @@ -19,8 +19,8 @@ func TestAngular(t *testing.T) { { testCase: "feat", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -33,12 +33,12 @@ func TestAngular(t *testing.T) { Print: true, }, }, - "major": []shared.AnalyzedCommit{}, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "major": {}, + "patch": {}, + "none": {}, }, commits: []shared.Commit{ - shared.Commit{ + { Message: "feat(internal/changelog): my first commit", Author: "me", Hash: "12345667", @@ -48,8 +48,8 @@ func TestAngular(t *testing.T) { { testCase: "feat breaking change", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -62,8 +62,8 @@ func TestAngular(t *testing.T) { Print: true, }, }, - "major": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "major": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first break BREAKING CHANGE: change api to v2", Author: "me", @@ -77,38 +77,38 @@ func TestAngular(t *testing.T) { ParsedBreakingChangeMessage: "change api to v2", }, }, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "patch": {}, + "none": {}, }, commits: []shared.Commit{ - shared.Commit{ + { Message: "feat(internal/changelog): my first commit", Author: "me", Hash: "12345667", }, - shared.Commit{ + { Message: "feat(internal/changelog): my first break BREAKING CHANGE: change api to v2", Author: "me", Hash: "12345668", }, }, }, - { testCase: "feat breaking change footer", + {testCase: "feat breaking change footer", commits: []shared.Commit{ - shared.Commit{ + { Message: "feat(internal/changelog): my first commit", Author: "me", Hash: "12345667", - }, - shared.Commit{ - Message: "feat(internal/changelog): my first break \n\nBREAKING CHANGE: change api to v2\n", + }, + { + Message: "feat(internal/changelog): my first break \n\nBREAKING CHANGE: change api to v2\n", Author: "me", Hash: "12345668", - }, + }, }, analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -121,8 +121,8 @@ func TestAngular(t *testing.T) { Print: true, }, }, - "major": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "major": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first break \n\nBREAKING CHANGE: change api to v2\n", Author: "me", @@ -136,25 +136,25 @@ func TestAngular(t *testing.T) { ParsedBreakingChangeMessage: "change api to v2", }, }, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "patch": {}, + "none": {}, }, }, { testCase: "invalid", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{}, - "major": []shared.AnalyzedCommit{}, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "minor": {}, + "major": {}, + "patch": {}, + "none": {}, }, commits: []shared.Commit{ - shared.Commit{ + { Message: "internal/changelog: my first commit", Author: "me", Hash: "12345667", }, - shared.Commit{ + { Message: "Merge feat(internal/changelog): my first commit", Author: "me", Hash: "12345667", @@ -164,8 +164,8 @@ func TestAngular(t *testing.T) { { testCase: "feat and build", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -178,8 +178,8 @@ func TestAngular(t *testing.T) { Print: true, }, }, - "none": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "none": { + { Commit: shared.Commit{ Message: "build(internal/changelog): my first build", Author: "me", @@ -193,16 +193,16 @@ func TestAngular(t *testing.T) { ParsedBreakingChangeMessage: "", }, }, - "patch": []shared.AnalyzedCommit{}, - "major": []shared.AnalyzedCommit{}, + "patch": {}, + "major": {}, }, commits: []shared.Commit{ - shared.Commit{ + { Message: "feat(internal/changelog): my first commit", Author: "me", Hash: "12345667", }, - shared.Commit{ + { Message: "build(internal/changelog): my first build", Author: "me", Hash: "12345668", diff --git a/internal/analyzer/conventional.go b/internal/analyzer/conventional.go new file mode 100644 index 0000000..1b6fe47 --- /dev/null +++ b/internal/analyzer/conventional.go @@ -0,0 +1,130 @@ +// Package analyzer provides different commit analyzer +package analyzer + +import ( + "fmt" + "regexp" + "strings" + + log "github.com/sirupsen/logrus" + + "github.com/Nightapes/go-semantic-release/internal/shared" +) + +type conventional struct { + rules []Rule + regex string + log *log.Entry +} + +// CONVENTIONAL identifier +const CONVENTIONAL = "conventional" + +func newConventional() *conventional { + return &conventional{ + regex: `^(TAG)(?:\((.*)\))?(\!)?: (?s)(.*)`, + log: log.WithField("analyzer", CONVENTIONAL), + rules: []Rule{ + { + Tag: "feat", + TagString: "Features", + Release: "minor", + Changelog: true, + }, + { + Tag: "fix", + TagString: "Bug fixes", + Release: "patch", + Changelog: true, + }, { + Tag: "perf", + TagString: "Performance improvments", + Release: "patch", + Changelog: true, + }, { + Tag: "docs", + TagString: "Documentation changes", + Release: "none", + Changelog: false, + }, + { + Tag: "style", + TagString: "Style", + Release: "none", + Changelog: false, + }, { + Tag: "refactor", + TagString: "Code refactor", + Release: "none", + Changelog: false, + }, { + Tag: "test", + TagString: "Testing", + Release: "none", + Changelog: false, + }, { + Tag: "chore", + TagString: "Changes to the build process or auxiliary tools and libraries such as documentation generation", + Release: "none", + Changelog: false, + }, { + Tag: "build", + TagString: "Changes to CI/CD", + Release: "none", + Changelog: false, + }, + }, + } +} + +func (a *conventional) getRules() []Rule { + return a.rules +} + +func (a *conventional) analyze(commit shared.Commit, rule Rule) (shared.AnalyzedCommit, bool, error) { + + analyzed := shared.AnalyzedCommit{ + Commit: commit, + Tag: rule.Tag, + TagString: rule.TagString, + } + + re := regexp.MustCompile(strings.Replace(a.regex, "TAG", rule.Tag, -1)) + matches := re.FindAllStringSubmatch(commit.Message, -1) + if len(matches) >= 1 { + if len(matches[0]) >= 4 { + + analyzed.Scope = shared.Scope(matches[0][2]) + + message := strings.Join(matches[0][4:], "") + if matches[0][3] == "" && !strings.Contains(message, "BREAKING CHANGE:") { + analyzed.ParsedMessage = strings.Trim(message, " ") + + a.log.Tracef("%s: found %s", commit.Message, rule.Tag) + return analyzed, false, nil + } + + if matches[0][3] == "" { + breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) + analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) + analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) + a.log.Tracef(" %s, BREAKING CHANGE found", commit.Message) + return analyzed, true, nil + } + + breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) + + if len(breakingChange) > 1 { + analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) + analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) + } else { + analyzed.ParsedBreakingChangeMessage = breakingChange[0] + } + a.log.Infof(" %s, BREAKING CHANGE found", commit.Message) + return analyzed, true, nil + } + } + a.log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag) + return analyzed, false, fmt.Errorf("not found") + +} diff --git a/internal/analyzer/conventional_test.go b/internal/analyzer/conventional_test.go new file mode 100644 index 0000000..20833a9 --- /dev/null +++ b/internal/analyzer/conventional_test.go @@ -0,0 +1,261 @@ +package analyzer_test + +import ( + "testing" + + "github.com/Nightapes/go-semantic-release/internal/analyzer" + "github.com/Nightapes/go-semantic-release/internal/shared" + "github.com/Nightapes/go-semantic-release/pkg/config" + "github.com/stretchr/testify/assert" +) + +func TestConventional(t *testing.T) { + + testConfigs := []struct { + testCase string + commits []shared.Commit + analyzedCommits map[shared.Release][]shared.AnalyzedCommit + }{ + { + testCase: "feat", + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": { + { + Commit: shared.Commit{ + Message: "feat(internal/changelog): my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "internal/changelog", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + { + Commit: shared.Commit{ + Message: "feat: no scope", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "no scope", + Tag: "feat", + TagString: "Features", + Print: true, + }, + }, + "major": {}, + "patch": {}, + "none": {}, + }, + commits: []shared.Commit{ + { + Message: "feat(internal/changelog): my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "feat: no scope", + Author: "me", + Hash: "12345667", + }, + }, + }, + { + testCase: "feat breaking change", + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": { + { + Commit: shared.Commit{ + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + }, + "major": { + { + Commit: shared.Commit{ + Message: "feat!: my first break", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "my first break", + }, + }, + "patch": {}, + "none": {}, + }, + commits: []shared.Commit{ + { + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "feat!: my first break", + Author: "me", + Hash: "12345668", + }, + }, + }, + { + testCase: "feat breaking change footer", + commits: []shared.Commit{ + { + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n", + Author: "me", + Hash: "12345668", + }, + { + Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change", + Author: "me", + Hash: "12345669", + }, + }, + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": { + { + Commit: shared.Commit{ + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + }, + "major": { + { + Commit: shared.Commit{ + Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "my first break", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "change api to v2", + }, + { + Commit: shared.Commit{ + Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change", + Author: "me", + Hash: "12345669", + }, + Scope: "", + ParsedMessage: "my first break", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "hey from the change", + }, + }, + "patch": {}, + "none": {}, + }, + }, + { + testCase: "invalid", + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": {}, + "major": {}, + "patch": {}, + "none": {}, + }, + commits: []shared.Commit{ + { + Message: "internal/changelog: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "Merge feat: my first commit", + Author: "me", + Hash: "12345667", + }, + }, + }, + { + testCase: "feat and build", + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": { + { + Commit: shared.Commit{ + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + }, + "none": { + { + Commit: shared.Commit{ + Message: "build: my first build", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "my first build", + Tag: "build", + TagString: "Changes to CI/CD", + Print: false, + ParsedBreakingChangeMessage: "", + }, + }, + "patch": {}, + "major": {}, + }, + commits: []shared.Commit{ + { + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "build: my first build", + Author: "me", + Hash: "12345668", + }, + }, + }, + } + + conventional, err := analyzer.New("conventional", config.ChangelogConfig{}) + assert.NoError(t, err) + + for _, test := range testConfigs { + analyzedCommits := conventional.Analyze(test.commits) + assert.Equalf(t, test.analyzedCommits["major"], analyzedCommits["major"], "Testcase %s should have major commits", test.testCase) + assert.Equalf(t, test.analyzedCommits["minor"], analyzedCommits["minor"], "Testcase %s should have minor commits", test.testCase) + assert.Equalf(t, test.analyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase) + assert.Equalf(t, test.analyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase) + } + +} diff --git a/internal/cache/cache_test.go b/internal/cache/cache_test.go index 2fe71de..4267836 100644 --- a/internal/cache/cache_test.go +++ b/internal/cache/cache_test.go @@ -56,8 +56,8 @@ func TestWriteAndReadCache(t *testing.T) { }, Branch: "master", Commits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "major": { + { Commit: shared.Commit{ Message: "Message", Author: "Author", diff --git a/internal/calculator/calculator_test.go b/internal/calculator/calculator_test.go index cc7405a..9c67033 100644 --- a/internal/calculator/calculator_test.go +++ b/internal/calculator/calculator_test.go @@ -83,12 +83,12 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.1.0-alpha.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{}, + "major": {}, + "minor": { + {}, }, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "patch": {}, + "none": {}, }, isFirst: false, }, @@ -98,12 +98,12 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.1.0-beta.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{}, + "major": {}, + "minor": { + {}, }, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "patch": {}, + "none": {}, }, isFirst: false, }, @@ -113,10 +113,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.0.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{}, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "major": {}, + "minor": {}, + "patch": {}, + "none": {}, }, isFirst: false, }, @@ -126,10 +126,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.0.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "minor": []shared.AnalyzedCommit{}, - "patch": []shared.AnalyzedCommit{}, - "none": []shared.AnalyzedCommit{}, + "major": {{}}, + "minor": {}, + "patch": {}, + "none": {}, }, isFirst: true, }, @@ -139,10 +139,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "2.0.0-rc.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "minor": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "patch": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "none": []shared.AnalyzedCommit{}, + "major": {{}}, + "minor": {{}}, + "patch": {{}}, + "none": {}, }, isFirst: false, }, @@ -152,10 +152,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0-rc.0"), nextVersion: "1.0.0-rc.1", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "patch": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "none": []shared.AnalyzedCommit{}, + "major": {}, + "minor": {{}}, + "patch": {{}}, + "none": {}, }, isFirst: false, }, @@ -165,10 +165,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "2.0.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "minor": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "patch": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "none": []shared.AnalyzedCommit{}, + "major": {{}}, + "minor": {{}}, + "patch": {{}}, + "none": {}, }, isFirst: false, }, @@ -178,10 +178,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.1.0", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "patch": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "none": []shared.AnalyzedCommit{}, + "major": {}, + "minor": {{}}, + "patch": {{}}, + "none": {}, }, isFirst: false, }, @@ -191,10 +191,10 @@ func TestCalculator_CalculateNewVersion(t *testing.T) { lastVersion: createVersion("1.0.0"), nextVersion: "1.0.1", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "major": []shared.AnalyzedCommit{}, - "minor": []shared.AnalyzedCommit{}, - "patch": []shared.AnalyzedCommit{shared.AnalyzedCommit{}}, - "none": []shared.AnalyzedCommit{}, + "major": {}, + "minor": {}, + "patch": {{}}, + "none": {}, }, isFirst: false, }, diff --git a/internal/changelog/changelog_test.go b/internal/changelog/changelog_test.go index 8a22764..8ff146c 100644 --- a/internal/changelog/changelog_test.go +++ b/internal/changelog/changelog_test.go @@ -29,8 +29,8 @@ func TestChangelog(t *testing.T) { { testCase: "feat", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -53,8 +53,8 @@ func TestChangelog(t *testing.T) { { testCase: "feat no scope", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat: my first commit", Author: "me", @@ -76,8 +76,8 @@ func TestChangelog(t *testing.T) { { testCase: "feat breaking change", analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ - "minor": []shared.AnalyzedCommit{ - shared.AnalyzedCommit{ + "minor": { + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first commit", Author: "me", @@ -89,7 +89,7 @@ func TestChangelog(t *testing.T) { TagString: "Features", Print: true, }, - shared.AnalyzedCommit{ + { Commit: shared.Commit{ Message: "feat(internal/changelog): my first break: BREAKING CHANGE: change api to v2", Author: "me", @@ -110,6 +110,81 @@ func TestChangelog(t *testing.T) { }, hasError: false, }, + { + testCase: "conventional commits", + analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": { + { + Commit: shared.Commit{ + Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change", + Author: "me", + Hash: "12345669", + }, + Scope: "", + ParsedMessage: "my first break", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "hey from the change", + }, + { + Commit: shared.Commit{ + Message: "feat(internal/changelog): my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "internal/changelog", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + { + Commit: shared.Commit{ + Message: "feat: my second commit", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "my first commit", + Tag: "feat", + TagString: "Features", + Print: true, + }, + { + Commit: shared.Commit{ + Message: "feat: my new commit \n\nmy first break: BREAKING CHANGE: change api to v2", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "my first break", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "change api to v2", + }, + { + Commit: shared.Commit{ + Message: "feat!: my next commit", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "", + Tag: "feat", + TagString: "Features", + Print: true, + ParsedBreakingChangeMessage: "my next commit", + }, + }, + }, + result: &shared.GeneratedChangelog{ + Title: "v1.0.0 (2019-07-19)", + Content: "# v1.0.0 (2019-07-19)\n## BREAKING CHANGES\n* hey from the change \nintroduced by commit: \nmy first break ([1234566](https://commit.url))\n* change api to v2 \nintroduced by commit: \nmy first break ([1234566](https://commit.url))\n* my next commit \nintroduced by commit: \n ([1234566](https://commit.url))\n### Features\n* **`internal/changelog`** my first commit ([1234566](https://commit.url))\n* my first commit ([1234566](https://commit.url))\n", + }, + hasError: false, + }, } cl := changelog.New(&config.ReleaseConfig{}, []analyzer.Rule{ diff --git a/internal/ci/ci_test.go b/internal/ci/ci_test.go index 4d4fbeb..dd9118d 100644 --- a/internal/ci/ci_test.go +++ b/internal/ci/ci_test.go @@ -6,11 +6,11 @@ import ( "github.com/Nightapes/go-semantic-release/internal/ci" "github.com/Nightapes/go-semantic-release/internal/gitutil" - "github.com/stretchr/testify/assert" "github.com/go-git/go-billy/v5/memfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/storage/memory" + "github.com/stretchr/testify/assert" ) func TestCi(t *testing.T) { diff --git a/internal/hooks/hooks.go b/internal/hooks/hooks.go index 92cf590..32b1292 100644 --- a/internal/hooks/hooks.go +++ b/internal/hooks/hooks.go @@ -65,7 +65,7 @@ func (h *Hooks) runCommand(command string) error { } cmd.Env = os.Environ() - cmd.Env = append(cmd.Env, "RELEASE_VERSION="+h.version.Next.Version.String()) + cmd.Env = append(cmd.Env, "RELEASE_VERSION="+h.version.Next.Version.String()) cmdReader, err := cmd.StdoutPipe() if err != nil { return err @@ -78,7 +78,6 @@ func (h *Hooks) runCommand(command string) error { } h.printOutput(cmdErrReader, strings.Fields(cmdReplaced)[0]) - return cmd.Run() } diff --git a/internal/releaser/github/github_test.go b/internal/releaser/github/github_test.go index 7ef557f..72d938e 100644 --- a/internal/releaser/github/github_test.go +++ b/internal/releaser/github/github_test.go @@ -31,14 +31,14 @@ type testReleaseStruct struct { } var testNewClient = []testHelperMethodStruct{ - testHelperMethodStruct{config: config.GitHubProvider{ + {config: config.GitHubProvider{ Repo: "foo", User: "bar", }, valid: true, }, - testHelperMethodStruct{config: config.GitHubProvider{ + {config: config.GitHubProvider{ Repo: "foo", User: "bar", CustomURL: "https://test.com", @@ -51,7 +51,7 @@ var lastVersion, _ = semver.NewVersion("1.0.0") var newVersion, _ = semver.NewVersion("2.0.0") var testReleases = []testReleaseStruct{ - testReleaseStruct{ + { config: config.GitHubProvider{ Repo: "foo", User: "bar", @@ -75,7 +75,7 @@ var testReleases = []testReleaseStruct{ requestResponseCode: 200, valid: true, }, - testReleaseStruct{ + { config: config.GitHubProvider{ Repo: "foo", User: "bar", diff --git a/internal/releaser/gitlab/gitlab.go b/internal/releaser/gitlab/gitlab.go index 9186b7b..f521761 100644 --- a/internal/releaser/gitlab/gitlab.go +++ b/internal/releaser/gitlab/gitlab.go @@ -148,7 +148,6 @@ func (g *Client) uploadAssets(assets *assets.Set) error { } defer file.Close() - result, err := g.uploadFile(asset.GetName(), file) if err != nil { return fmt.Errorf("could not upload asset %s: %s", file.Name(), err.Error()) diff --git a/internal/releaser/gitlab/gitlab_test.go b/internal/releaser/gitlab/gitlab_test.go index 0b2c71d..3e90907 100644 --- a/internal/releaser/gitlab/gitlab_test.go +++ b/internal/releaser/gitlab/gitlab_test.go @@ -239,7 +239,7 @@ func TestUploadAssets(t *testing.T) { valid: true, testDir: os.TempDir(), assets: []config.Asset{ - config.Asset{ + { Name: filepath.Base(file.Name()), Compress: false, }, @@ -258,7 +258,7 @@ func TestUploadAssets(t *testing.T) { valid: false, testDir: os.TempDir(), assets: []config.Asset{ - config.Asset{ + { Name: filepath.Base(file.Name()), Compress: false, }, @@ -277,7 +277,7 @@ func TestUploadAssets(t *testing.T) { valid: false, testDir: os.TempDir(), assets: []config.Asset{ - config.Asset{ + { Name: filepath.Base(file.Name()), Compress: false, }, diff --git a/internal/releaser/util/util_test.go b/internal/releaser/util/util_test.go index 8d01aca..b16aef1 100644 --- a/internal/releaser/util/util_test.go +++ b/internal/releaser/util/util_test.go @@ -30,8 +30,8 @@ type testDoubleToken struct { } var testDoubles = []testDoubleToken{ - testDoubleToken{providerName: "test0", token: "foo", valid: true}, - testDoubleToken{providerName: "test1", token: "", valid: false}, + {providerName: "test0", token: "foo", valid: true}, + {providerName: "test1", token: "", valid: false}, } func TestGetAccessToken(t *testing.T) { diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 1776940..65bbc00 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -95,7 +95,7 @@ github: }, }, Assets: []config.Asset{ - config.Asset{ + { Name: "./build/go-semantic-release", Compress: false}}, ReleaseTitle: "go-semantic-release release", From d6c5e395a8d5aeac3b6b75631893cfe118c5e587 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 21 Jan 2021 22:40:07 +0100 Subject: [PATCH 2/4] chore(lint): fix lint version --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4d595dd..620c667 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: - name: Lint run: | export PATH=$PATH:$(go env GOPATH)/bin - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.3 + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.35.2 golangci-lint run ./... - name: Run tests From 6cd43d795784af83d0e79fdbbd48e04e163d123e Mon Sep 17 00:00:00 2001 From: fwiedmann Date: Sat, 23 Jan 2021 22:49:42 +0100 Subject: [PATCH 3/4] ref(analyzer): simplified analyze method for angular and conventional --- internal/analyzer/analyzer.go | 38 ++++----- internal/analyzer/angular.go | 72 ++++++++-------- internal/analyzer/angular_test.go | 6 +- internal/analyzer/conventional.go | 84 +++++++++---------- internal/analyzer/conventional_test.go | 107 +++++++++++++++++------- pkg/semanticrelease/semantic-release.go | 23 +++-- 6 files changed, 181 insertions(+), 149 deletions(-) diff --git a/internal/analyzer/analyzer.go b/internal/analyzer/analyzer.go index 8607f91..17fc4a5 100644 --- a/internal/analyzer/analyzer.go +++ b/internal/analyzer/analyzer.go @@ -9,13 +9,13 @@ import ( log "github.com/sirupsen/logrus" ) -//Analyzer struct +// Analyzer struct type Analyzer struct { analyzeCommits analyzeCommits Config config.ChangelogConfig } -//Rule for commits +// Rule for commits type Rule struct { Tag string TagString string @@ -24,11 +24,11 @@ type Rule struct { } type analyzeCommits interface { - analyze(commit shared.Commit, tag Rule) (shared.AnalyzedCommit, bool, error) + analyze(commit shared.Commit, tag Rule) (*shared.AnalyzedCommit, bool) getRules() []Rule } -//New Analyzer struct for given commit format +// New Analyzer struct for given commit format func New(format string, config config.ChangelogConfig) (*Analyzer, error) { analyzer := &Analyzer{ Config: config, @@ -45,7 +45,6 @@ func New(format string, config config.ChangelogConfig) (*Analyzer, error) { return nil, fmt.Errorf("invalid commit format: %s", format) } return analyzer, nil - } // GetRules from current mode @@ -53,9 +52,8 @@ func (a *Analyzer) GetRules() []Rule { return a.analyzeCommits.getRules() } -// Analyze commits and return commits splitted by major,minor,patch +// Analyze commits and return commits split by major,minor,patch func (a *Analyzer) Analyze(commits []shared.Commit) map[shared.Release][]shared.AnalyzedCommit { - analyzedCommits := make(map[shared.Release][]shared.AnalyzedCommit) analyzedCommits["major"] = make([]shared.AnalyzedCommit, 0) analyzedCommits["minor"] = make([]shared.AnalyzedCommit, 0) @@ -64,25 +62,21 @@ func (a *Analyzer) Analyze(commits []shared.Commit) map[shared.Release][]shared. for _, commit := range commits { for _, rule := range a.analyzeCommits.getRules() { - analyzedCommit, hasBreakingChange, err := a.analyzeCommits.analyze(commit, rule) - if err == nil { - if a.Config.PrintAll { - analyzedCommit.Print = true - } else { - analyzedCommit.Print = rule.Changelog - } - if hasBreakingChange { - analyzedCommits["major"] = append(analyzedCommits["major"], analyzedCommit) - } else { - analyzedCommits[rule.Release] = append(analyzedCommits[rule.Release], analyzedCommit) - } + analyzedCommit, hasBreakingChange := a.analyzeCommits.analyze(commit, rule) + if analyzedCommit == nil { + continue + } + if a.Config.PrintAll || rule.Changelog { + analyzedCommit.Print = true + } + if hasBreakingChange { + analyzedCommits["major"] = append(analyzedCommits["major"], *analyzedCommit) break } - + analyzedCommits[rule.Release] = append(analyzedCommits[rule.Release], *analyzedCommit) + break } } - log.Debugf("Analyzed commits: major=%d minor=%d patch=%d none=%d", len(analyzedCommits["major"]), len(analyzedCommits["minor"]), len(analyzedCommits["patch"]), len(analyzedCommits["none"])) - return analyzedCommits } diff --git a/internal/analyzer/angular.go b/internal/analyzer/angular.go index bd0ef50..b7c3784 100644 --- a/internal/analyzer/angular.go +++ b/internal/analyzer/angular.go @@ -2,7 +2,6 @@ package analyzer import ( - "fmt" "regexp" "strings" @@ -36,12 +35,14 @@ func newAngular() *angular { TagString: "Bug fixes", Release: "patch", Changelog: true, - }, { + }, + { Tag: "perf", - TagString: "Performance improvments", + TagString: "Performance improvements", Release: "patch", Changelog: true, - }, { + }, + { Tag: "docs", TagString: "Documentation changes", Release: "none", @@ -52,22 +53,26 @@ func newAngular() *angular { TagString: "Style", Release: "none", Changelog: false, - }, { + }, + { Tag: "refactor", TagString: "Code refactor", Release: "none", Changelog: false, - }, { + }, + { Tag: "test", TagString: "Testing", Release: "none", Changelog: false, - }, { + }, + { Tag: "chore", TagString: "Changes to the build process or auxiliary tools and libraries such as documentation generation", Release: "none", Changelog: false, - }, { + }, + { Tag: "build", TagString: "Changes to CI/CD", Release: "none", @@ -81,38 +86,37 @@ func (a *angular) getRules() []Rule { return a.rules } -func (a *angular) analyze(commit shared.Commit, rule Rule) (shared.AnalyzedCommit, bool, error) { +func (a *angular) analyze(commit shared.Commit, rule Rule) (*shared.AnalyzedCommit, bool) { + re := regexp.MustCompile(strings.Replace(a.regex, "TAG", rule.Tag, -1)) + matches := re.FindStringSubmatch(commit.Message) + if matches == nil { + a.log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag) + return nil, false + } - analyzed := shared.AnalyzedCommit{ + analyzed := &shared.AnalyzedCommit{ Commit: commit, Tag: rule.Tag, TagString: rule.TagString, + Scope: shared.Scope(matches[2]), } - re := regexp.MustCompile(strings.Replace(a.regex, "TAG", rule.Tag, -1)) - matches := re.FindAllStringSubmatch(commit.Message, -1) - if len(matches) >= 1 { - if len(matches[0]) >= 3 { - - analyzed.Scope = shared.Scope(matches[0][2]) - - message := strings.Join(matches[0][3:], "") - if !strings.Contains(message, "BREAKING CHANGE:") { - analyzed.ParsedMessage = strings.Trim(message, " ") - - a.log.Tracef("%s: found %s", commit.Message, rule.Tag) - return analyzed, false, nil - } - breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) - - analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) - analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) - - a.log.Tracef(" %s, BREAKING CHANGE found", commit.Message) - return analyzed, true, nil - } + message := strings.Join(matches[3:], "") + if !strings.Contains(message, "BREAKING CHANGE:") { + analyzed.ParsedMessage = strings.Trim(message, " ") + a.log.Tracef("%s: found %s", commit.Message, rule.Tag) + return analyzed, false } - a.log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag) - return analyzed, false, fmt.Errorf("not found") + a.log.Tracef(" %s, BREAKING CHANGE found", commit.Message) + breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) + + if len(breakingChange) > 1 { + analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) + analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) + return analyzed, true + } + + analyzed.ParsedBreakingChangeMessage = breakingChange[0] + return analyzed, true } diff --git a/internal/analyzer/angular_test.go b/internal/analyzer/angular_test.go index 6f85479..250d5aa 100644 --- a/internal/analyzer/angular_test.go +++ b/internal/analyzer/angular_test.go @@ -10,7 +10,7 @@ import ( ) func TestAngular(t *testing.T) { - + t.Parallel() testConfigs := []struct { testCase string commits []shared.Commit @@ -93,7 +93,8 @@ func TestAngular(t *testing.T) { }, }, }, - {testCase: "feat breaking change footer", + { + testCase: "feat breaking change footer", commits: []shared.Commit{ { Message: "feat(internal/changelog): my first commit", @@ -221,5 +222,4 @@ func TestAngular(t *testing.T) { assert.Equalf(t, test.analyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase) assert.Equalf(t, test.analyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase) } - } diff --git a/internal/analyzer/conventional.go b/internal/analyzer/conventional.go index 1b6fe47..4486a48 100644 --- a/internal/analyzer/conventional.go +++ b/internal/analyzer/conventional.go @@ -2,7 +2,6 @@ package analyzer import ( - "fmt" "regexp" "strings" @@ -36,12 +35,14 @@ func newConventional() *conventional { TagString: "Bug fixes", Release: "patch", Changelog: true, - }, { + }, + { Tag: "perf", - TagString: "Performance improvments", + TagString: "Performance improvements", Release: "patch", Changelog: true, - }, { + }, + { Tag: "docs", TagString: "Documentation changes", Release: "none", @@ -52,22 +53,26 @@ func newConventional() *conventional { TagString: "Style", Release: "none", Changelog: false, - }, { + }, + { Tag: "refactor", TagString: "Code refactor", Release: "none", Changelog: false, - }, { + }, + { Tag: "test", TagString: "Testing", Release: "none", Changelog: false, - }, { + }, + { Tag: "chore", TagString: "Changes to the build process or auxiliary tools and libraries such as documentation generation", Release: "none", Changelog: false, - }, { + }, + { Tag: "build", TagString: "Changes to CI/CD", Release: "none", @@ -81,50 +86,37 @@ func (a *conventional) getRules() []Rule { return a.rules } -func (a *conventional) analyze(commit shared.Commit, rule Rule) (shared.AnalyzedCommit, bool, error) { +func (a *conventional) analyze(commit shared.Commit, rule Rule) (*shared.AnalyzedCommit, bool) { + re := regexp.MustCompile(strings.Replace(a.regex, "TAG", rule.Tag, -1)) + matches := re.FindStringSubmatch(commit.Message) + if matches == nil { + a.log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag) + return nil, false + } - analyzed := shared.AnalyzedCommit{ + analyzed := &shared.AnalyzedCommit{ Commit: commit, Tag: rule.Tag, TagString: rule.TagString, + Scope: shared.Scope(matches[2]), } - re := regexp.MustCompile(strings.Replace(a.regex, "TAG", rule.Tag, -1)) - matches := re.FindAllStringSubmatch(commit.Message, -1) - if len(matches) >= 1 { - if len(matches[0]) >= 4 { - - analyzed.Scope = shared.Scope(matches[0][2]) - - message := strings.Join(matches[0][4:], "") - if matches[0][3] == "" && !strings.Contains(message, "BREAKING CHANGE:") { - analyzed.ParsedMessage = strings.Trim(message, " ") - - a.log.Tracef("%s: found %s", commit.Message, rule.Tag) - return analyzed, false, nil - } - - if matches[0][3] == "" { - breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) - analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) - analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) - a.log.Tracef(" %s, BREAKING CHANGE found", commit.Message) - return analyzed, true, nil - } - - breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) - - if len(breakingChange) > 1 { - analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) - analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) - } else { - analyzed.ParsedBreakingChangeMessage = breakingChange[0] - } - a.log.Infof(" %s, BREAKING CHANGE found", commit.Message) - return analyzed, true, nil - } + message := strings.Join(matches[4:], "") + if matches[3] == "" && !strings.Contains(message, "BREAKING CHANGE:") { + analyzed.ParsedMessage = strings.Trim(message, " ") + a.log.Tracef("%s: found %s", commit.Message, rule.Tag) + return analyzed, false } - a.log.Tracef("%s does not match %s, skip", commit.Message, rule.Tag) - return analyzed, false, fmt.Errorf("not found") + a.log.Infof(" %s, BREAKING CHANGE found", commit.Message) + breakingChange := strings.SplitN(message, "BREAKING CHANGE:", 2) + + if len(breakingChange) > 1 { + analyzed.ParsedMessage = strings.TrimSpace(breakingChange[0]) + analyzed.ParsedBreakingChangeMessage = strings.TrimSpace(breakingChange[1]) + return analyzed, true + } + + analyzed.ParsedBreakingChangeMessage = breakingChange[0] + return analyzed, true } diff --git a/internal/analyzer/conventional_test.go b/internal/analyzer/conventional_test.go index 20833a9..ca780f0 100644 --- a/internal/analyzer/conventional_test.go +++ b/internal/analyzer/conventional_test.go @@ -10,15 +10,15 @@ import ( ) func TestConventional(t *testing.T) { - + t.Parallel() testConfigs := []struct { - testCase string - commits []shared.Commit - analyzedCommits map[shared.Release][]shared.AnalyzedCommit + testCase string + commits []shared.Commit + wantAnalyzedCommits map[shared.Release][]shared.AnalyzedCommit }{ { testCase: "feat", - analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "minor": { { Commit: shared.Commit{ @@ -64,7 +64,7 @@ func TestConventional(t *testing.T) { }, { testCase: "feat breaking change", - analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "minor": { { Commit: shared.Commit{ @@ -112,24 +112,7 @@ func TestConventional(t *testing.T) { }, { testCase: "feat breaking change footer", - commits: []shared.Commit{ - { - Message: "feat: my first commit", - Author: "me", - Hash: "12345667", - }, - { - Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n", - Author: "me", - Hash: "12345668", - }, - { - Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change", - Author: "me", - Hash: "12345669", - }, - }, - analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "minor": { { Commit: shared.Commit{ @@ -175,10 +158,27 @@ func TestConventional(t *testing.T) { "patch": {}, "none": {}, }, + commits: []shared.Commit{ + { + Message: "feat: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n", + Author: "me", + Hash: "12345668", + }, + { + Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change", + Author: "me", + Hash: "12345669", + }, + }, }, { testCase: "invalid", - analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "minor": {}, "major": {}, "patch": {}, @@ -199,7 +199,7 @@ func TestConventional(t *testing.T) { }, { testCase: "feat and build", - analyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ "minor": { { Commit: shared.Commit{ @@ -245,6 +245,52 @@ func TestConventional(t *testing.T) { }, }, }, + { + testCase: "fix and build", + wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{ + "minor": {}, + "none": { + { + Commit: shared.Commit{ + Message: "build: my first build", + Author: "me", + Hash: "12345668", + }, + Scope: "", + ParsedMessage: "my first build", + Tag: "build", + TagString: "Changes to CI/CD", + Print: false, + ParsedBreakingChangeMessage: "", + }, + }, + "patch": {{ + Commit: shared.Commit{ + Message: "fix: my first commit", + Author: "me", + Hash: "12345667", + }, + Scope: "", + ParsedMessage: "my first commit", + Tag: "fix", + TagString: "Bug fixes", + Print: true, + }}, + "major": {}, + }, + commits: []shared.Commit{ + { + Message: "fix: my first commit", + Author: "me", + Hash: "12345667", + }, + { + Message: "build: my first build", + Author: "me", + Hash: "12345668", + }, + }, + }, } conventional, err := analyzer.New("conventional", config.ChangelogConfig{}) @@ -252,10 +298,9 @@ func TestConventional(t *testing.T) { for _, test := range testConfigs { analyzedCommits := conventional.Analyze(test.commits) - assert.Equalf(t, test.analyzedCommits["major"], analyzedCommits["major"], "Testcase %s should have major commits", test.testCase) - assert.Equalf(t, test.analyzedCommits["minor"], analyzedCommits["minor"], "Testcase %s should have minor commits", test.testCase) - assert.Equalf(t, test.analyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase) - assert.Equalf(t, test.analyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase) + assert.Equalf(t, test.wantAnalyzedCommits["major"], analyzedCommits["major"], "Testcase %s should have major commits", test.testCase) + assert.Equalf(t, test.wantAnalyzedCommits["minor"], analyzedCommits["minor"], "Testcase %s should have minor commits", test.testCase) + assert.Equalf(t, test.wantAnalyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase) + assert.Equalf(t, test.wantAnalyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase) } - } diff --git a/pkg/semanticrelease/semantic-release.go b/pkg/semanticrelease/semantic-release.go index ce6f693..1cd5a9e 100644 --- a/pkg/semanticrelease/semantic-release.go +++ b/pkg/semanticrelease/semantic-release.go @@ -23,7 +23,7 @@ import ( // SemanticRelease struct type SemanticRelease struct { config *config.ReleaseConfig - gitutil *gitutil.GitUtil + gitUtil *gitutil.GitUtil analyzer *analyzer.Analyzer calculator *calculator.Calculator releaser releaser.Releaser @@ -57,7 +57,7 @@ func New(c *config.ReleaseConfig, repository string, checkConfig bool) (*Semanti return &SemanticRelease{ config: c, - gitutil: util, + gitUtil: util, releaser: releaser, analyzer: analyzer, repository: repository, @@ -67,9 +67,9 @@ func New(c *config.ReleaseConfig, repository string, checkConfig bool) (*Semanti }, nil } -//GetCIProvider result with ci config +// GetCIProvider result with ci config func (s *SemanticRelease) GetCIProvider() (*ci.ProviderConfig, error) { - return ci.GetCIProvider(s.gitutil, s.checkConfig, ci.ReadAllEnvs()) + return ci.GetCIProvider(s.gitUtil, s.checkConfig, ci.ReadAllEnvs()) } // GetNextVersion from .version or calculate new from commits @@ -86,7 +86,7 @@ func (s *SemanticRelease) GetNextVersion(provider *ci.ProviderConfig, force bool } } - lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() + lastVersion, lastVersionHash, err := s.gitUtil.GetLastVersion() if err != nil { return nil, err } @@ -99,7 +99,7 @@ func (s *SemanticRelease) GetNextVersion(provider *ci.ProviderConfig, force bool firstRelease = true } - commits, err := s.gitutil.GetCommits(lastVersionHash) + commits, err := s.gitUtil.GetCommits(lastVersionHash) if err != nil { return nil, err } @@ -149,15 +149,14 @@ func (s *SemanticRelease) GetNextVersion(provider *ci.ProviderConfig, force bool return &releaseVersion, err } -//SetVersion for git repository +// SetVersion for git repository func (s *SemanticRelease) SetVersion(provider *ci.ProviderConfig, version string) error { - newVersion, err := semver.NewVersion(version) if err != nil { return err } - lastVersion, lastVersionHash, err := s.gitutil.GetLastVersion() + lastVersion, lastVersionHash, err := s.gitUtil.GetLastVersion() if err != nil { return err } @@ -187,17 +186,15 @@ func (s *SemanticRelease) GetChangelog(releaseVersion *shared.ReleaseVersion) (* CommitURL: s.releaser.GetCommitURL(), CompareURL: s.releaser.GetCompareURL(releaseVersion.Last.Version.String(), releaseVersion.Next.Version.String()), }, releaseVersion.Commits) - } -// WriteChangeLog wirtes changelog content to the given file +// WriteChangeLog writes changelog content to the given file func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error { - return ioutil.WriteFile(file, []byte(changelogContent), 0644) + return ioutil.WriteFile(file, []byte(changelogContent), 644) } // Release publish release to provider func (s *SemanticRelease) Release(provider *ci.ProviderConfig, force bool) error { - if provider.IsPR { log.Infof("Will not perform a new release. This is a pull request") return nil From ac1bb779bb9ec146f4a2f0a188f090bdebecf27f Mon Sep 17 00:00:00 2001 From: Felix Wiedmann <30576206+fwiedmann@users.noreply.github.com> Date: Sat, 23 Jan 2021 22:53:55 +0100 Subject: [PATCH 4/4] lint(semanticrelease): update file permissions --- pkg/semanticrelease/semantic-release.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/semanticrelease/semantic-release.go b/pkg/semanticrelease/semantic-release.go index 1cd5a9e..eb1d67d 100644 --- a/pkg/semanticrelease/semantic-release.go +++ b/pkg/semanticrelease/semantic-release.go @@ -190,7 +190,7 @@ func (s *SemanticRelease) GetChangelog(releaseVersion *shared.ReleaseVersion) (* // WriteChangeLog writes changelog content to the given file func (s *SemanticRelease) WriteChangeLog(changelogContent, file string) error { - return ioutil.WriteFile(file, []byte(changelogContent), 644) + return ioutil.WriteFile(file, []byte(changelogContent), 0644) } // Release publish release to provider