feat: add conventional commits

main
hau 2020-11-09 15:46:42 +07:00
parent 0fe1c6795e
commit fc465926e3
2 changed files with 84 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import (
"log"
"os"
"github.com/haunt98/changeloguru/pkg/convention"
"github.com/haunt98/changeloguru/pkg/git"
"github.com/urfave/cli/v2"
)
@ -73,10 +74,25 @@ func action(c *cli.Context) error {
if err != nil {
return err
}
if verbose {
log.Printf("commits %+v", commits)
}
conventionalCommits := make([]convention.Commit, 0, len(commits))
for _, commit := range commits {
conventionalCommit, err := convention.NewCommit(commit)
if err != nil {
if verbose {
log.Printf("failed to new conventional commits %+v: %s", commit, err)
}
continue
}
conventionalCommits = append(conventionalCommits, conventionalCommit)
}
if verbose {
log.Printf("conventional commits %+v", conventionalCommits)
}
return nil
}

67
pkg/convention/commit.go Normal file
View File

@ -0,0 +1,67 @@
package convention
import (
"errors"
"regexp"
"strings"
"github.com/haunt98/changeloguru/pkg/git"
)
// https://www.conventionalcommits.org/en/v1.0.0/
// <type>[optional scope]: <description>
// [optional body]
// [optional footer(s)]
var (
headerRegex = regexp.MustCompile(`(?P<type>[a-zA-Z]+)(?P<scope>\([a-zA-Z]+\))?(?P<attention>!)?:\s(?P<description>.+)`)
)
type Commit struct {
Type string
Scope string
Description string
BodyAndFooters string
}
func NewCommit(c git.Commit) (result Commit, err error) {
messages := strings.Split(c.Message, "\n")
if len(messages) == 0 {
err = errors.New("empty commit")
return
}
header := messages[0]
if err = parseHeader(header, &result); err != nil {
return
}
bodyAndFooters := c.Message[len(header):]
parseBodyAndFooters(bodyAndFooters, &result)
return
}
func parseHeader(header string, commit *Commit) error {
if !headerRegex.MatchString(header) {
return errors.New("wrong header format")
}
headerSubmatches := headerRegex.FindStringSubmatch(header)
commit.Type = headerSubmatches[1]
commit.Scope = headerSubmatches[2]
commit.Scope = strings.TrimPrefix(commit.Scope, "(")
commit.Scope = strings.TrimSuffix(commit.Scope, ")")
commit.Description = headerSubmatches[4]
return nil
}
func parseBodyAndFooters(bodyAndFooters string, commit *Commit) {
bodyAndFooters = strings.TrimSpace(bodyAndFooters)
commit.BodyAndFooters = bodyAndFooters
}