diff --git a/.gitsv/config.yml b/.gitsv/config.yml index 7b9cae5..acaf506 100644 --- a/.gitsv/config.yml +++ b/.gitsv/config.yml @@ -35,7 +35,7 @@ release-notes: - name: Documentation commit-types: [docs] section-type: commits - - name: Breaking Changes + - name: BREAKING CHANGES section-type: breaking-changes commit-message: diff --git a/sv/message.go b/sv/message.go index c3bf4ef..c7a1cea 100644 --- a/sv/message.go +++ b/sv/message.go @@ -292,22 +292,22 @@ func removeCarriage(commit string) string { // Parse a commit message. func (p BaseMessageProcessor) Parse(subject, body string) (CommitMessage, error) { preparedSubject, err := p.prepareHeader(subject) - commitBody := removeCarriage(body) + m := CommitMessage{} if err != nil { - return CommitMessage{}, err + return m, err } - commitType, scope, description, hasBreakingChange := parseSubjectMessage(preparedSubject) - - metadata := make(map[string]string) + m.Metadata = make(map[string]string) + m.Body = removeCarriage(body) + m.Type, m.Scope, m.Description, m.IsBreakingChange = parseSubjectMessage(preparedSubject) for key, mdCfg := range p.messageCfg.Footer { if mdCfg.Key != "" { prefixes := append([]string{mdCfg.Key}, mdCfg.KeySynonyms...) for _, prefix := range prefixes { - if tagValue := extractFooterMetadata(prefix, commitBody, mdCfg.UseHash); tagValue != "" { - metadata[key] = tagValue + if tagValue := extractFooterMetadata(prefix, m.Body, mdCfg.UseHash); tagValue != "" { + m.Metadata[key] = tagValue break } @@ -315,19 +315,16 @@ func (p BaseMessageProcessor) Parse(subject, body string) (CommitMessage, error) } } - if tagValue := extractFooterMetadata(BreakingChangeFooterKey, commitBody, false); tagValue != "" { - metadata[BreakingChangeMetadataKey] = tagValue - hasBreakingChange = true + if m.IsBreakingChange { + m.Metadata[BreakingChangeMetadataKey] = m.Description } - return CommitMessage{ - Type: commitType, - Scope: scope, - Description: description, - Body: commitBody, - IsBreakingChange: hasBreakingChange, - Metadata: metadata, - }, nil + if tagValue := extractFooterMetadata(BreakingChangeFooterKey, m.Body, false); tagValue != "" { + m.IsBreakingChange = true + m.Metadata[BreakingChangeMetadataKey] = tagValue + } + + return m, nil } func (p BaseMessageProcessor) prepareHeader(header string) (string, error) { @@ -371,11 +368,10 @@ func parseSubjectMessage(message string) (string, string, string, bool) { } func extractFooterMetadata(key, text string, useHash bool) string { - var regex *regexp.Regexp + regex := regexp.MustCompile(key + ": (.*)") + if useHash { regex = regexp.MustCompile(key + " (#.*)") - } else { - regex = regexp.MustCompile(key + ": (.*)") } result := regex.FindStringSubmatch(text) diff --git a/sv/message_test.go b/sv/message_test.go index 4ae0c36..a8cfad9 100644 --- a/sv/message_test.go +++ b/sv/message_test.go @@ -604,7 +604,7 @@ func TestBaseMessageProcessor_Parse(t *testing.T) { }, }, { - "breaking change with exclamation mark", + "breaking change with empty body", ccfg, "feat!: something new", "", CommitMessage{ @@ -613,7 +613,9 @@ func TestBaseMessageProcessor_Parse(t *testing.T) { Description: "something new", Body: "", IsBreakingChange: true, - Metadata: map[string]string{}, + Metadata: map[string]string{ + BreakingChangeMetadataKey: "something new", + }, }, }, { diff --git a/sv/releasenotes.go b/sv/releasenotes.go index 6ca765a..699d572 100644 --- a/sv/releasenotes.go +++ b/sv/releasenotes.go @@ -77,8 +77,7 @@ func (p BaseReleaseNoteProcessor) Create( sections[sectionCfg.Name] = section } - if commit.Message.BreakingMessage() != "" { - // TODO: if no message found, should use description instead? + if commit.Message.IsBreakingChange { breakingChanges = append(breakingChanges, commit.Message.BreakingMessage()) } }