fix(parser): continue on unparsable commit message (#48)

We should not fail the whole process if a single commit message is
unparsable.

Instead we now log the issue and ignore the commit.
This commit is contained in:
Julian Tölle 2024-09-07 21:51:15 +02:00 committed by GitHub
parent 2010ac1143
commit 5ea41654a7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 7 deletions

View file

@ -2,6 +2,7 @@ package conventionalcommits
import (
"fmt"
"log/slog"
"github.com/leodido/go-conventionalcommits"
"github.com/leodido/go-conventionalcommits/parser"
@ -12,9 +13,10 @@ import (
type Parser struct {
machine conventionalcommits.Machine
logger *slog.Logger
}
func NewParser() *Parser {
func NewParser(logger *slog.Logger) *Parser {
parserMachine := parser.NewMachine(
parser.WithBestEffort(),
parser.WithTypes(conventionalcommits.TypesConventional),
@ -22,6 +24,7 @@ func NewParser() *Parser {
return &Parser{
machine: parserMachine,
logger: logger,
}
}
@ -31,8 +34,10 @@ func (c *Parser) Analyze(commits []git.Commit) ([]commitparser.AnalyzedCommit, e
for _, commit := range commits {
msg, err := c.machine.Parse([]byte(commit.Message))
if err != nil {
return nil, fmt.Errorf("failed to parse message of commit %q: %w", commit.Hash, err)
c.logger.Warn("failed to parse message of commit, skipping", "commit.hash", commit.Hash, "err", err)
continue
}
conventionalCommit, ok := msg.(*conventionalcommits.ConventionalCommit)
if !ok {
return nil, fmt.Errorf("unable to get ConventionalCommit from parser result: %T", msg)

View file

@ -1,6 +1,7 @@
package conventionalcommits
import (
"log/slog"
"testing"
"github.com/stretchr/testify/assert"
@ -23,14 +24,14 @@ func TestAnalyzeCommits(t *testing.T) {
wantErr: assert.NoError,
},
{
name: "malformed commit message",
name: "skips malformed commit message",
commits: []git.Commit{
{
Message: "aksdjaklsdjka",
},
},
expectedCommits: nil,
wantErr: assert.Error,
expectedCommits: []commitparser.AnalyzedCommit{},
wantErr: assert.NoError,
},
{
name: "drops unreleasable",
@ -114,7 +115,7 @@ func TestAnalyzeCommits(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
analyzedCommits, err := NewParser().Analyze(tt.commits)
analyzedCommits, err := NewParser(slog.Default()).Analyze(tt.commits)
if !tt.wantErr(t, err) {
return
}