mirror of
https://github.com/thegeeklab/git-sv.git
synced 2024-11-21 22:10:39 +00:00
parent
b1b47747c1
commit
cde390c838
@ -120,7 +120,7 @@ branches: # Git branches config.
|
|||||||
|
|
||||||
commit-message:
|
commit-message:
|
||||||
types: [build, ci, chore, docs, feat, fix, perf, refactor, revert, style, test] # Supported commit types.
|
types: [build, ci, chore, docs, feat, fix, perf, refactor, revert, style, test] # Supported commit types.
|
||||||
selector: '' # You can put in a regex here to select only a certain part of the commit message.
|
header-selector: '' # You can put in a regex here to select only a certain part of the commit message. Please define a regex group 'header'.
|
||||||
scope:
|
scope:
|
||||||
# Define supported scopes, if blank, scope will not be validated, if not, only scope listed will be valid.
|
# Define supported scopes, if blank, scope will not be validated, if not, only scope listed will be valid.
|
||||||
# Don't forget to add "" on your list if you need to define scopes and keep it optional.
|
# Don't forget to add "" on your list if you need to define scopes and keep it optional.
|
||||||
|
@ -5,7 +5,7 @@ package sv
|
|||||||
// CommitMessageConfig config a commit message.
|
// CommitMessageConfig config a commit message.
|
||||||
type CommitMessageConfig struct {
|
type CommitMessageConfig struct {
|
||||||
Types []string `yaml:"types,flow"`
|
Types []string `yaml:"types,flow"`
|
||||||
MessageSelector string `yaml:"selector"`
|
HeaderSelector string `yaml:"header-selector"`
|
||||||
Scope CommitMessageScopeConfig `yaml:"scope"`
|
Scope CommitMessageScopeConfig `yaml:"scope"`
|
||||||
Footer map[string]CommitMessageFooterConfig `yaml:"footer"`
|
Footer map[string]CommitMessageFooterConfig `yaml:"footer"`
|
||||||
Issue CommitMessageIssueConfig `yaml:"issue"`
|
Issue CommitMessageIssueConfig `yaml:"issue"`
|
||||||
|
@ -11,7 +11,7 @@ const (
|
|||||||
breakingChangeFooterKey = "BREAKING CHANGE"
|
breakingChangeFooterKey = "BREAKING CHANGE"
|
||||||
breakingChangeMetadataKey = "breaking-change"
|
breakingChangeMetadataKey = "breaking-change"
|
||||||
issueMetadataKey = "issue"
|
issueMetadataKey = "issue"
|
||||||
messageRegexGroupName = "message"
|
messageRegexGroupName = "header"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CommitMessage is a message using conventional commits.
|
// CommitMessage is a message using conventional commits.
|
||||||
@ -203,16 +203,13 @@ func (p MessageProcessorImpl) Format(msg CommitMessage) (string, string, string)
|
|||||||
|
|
||||||
// Parse a commit message.
|
// Parse a commit message.
|
||||||
func (p MessageProcessorImpl) Parse(subject, body string) CommitMessage {
|
func (p MessageProcessorImpl) Parse(subject, body string) CommitMessage {
|
||||||
filteredSubject := subject
|
preparedSubject, prepError := p.prepareHeader(subject)
|
||||||
if p.messageCfg.MessageSelector != "" {
|
|
||||||
subjectRegex := regexp.MustCompile(p.messageCfg.MessageSelector)
|
|
||||||
subjectMessageIndex := subjectRegex.SubexpIndex(messageRegexGroupName)
|
|
||||||
subjectMatch := subjectRegex.FindStringSubmatch(subject)
|
|
||||||
|
|
||||||
filteredSubject = subjectMatch[subjectMessageIndex]
|
if prepError != nil {
|
||||||
|
fmt.Println(prepError)
|
||||||
}
|
}
|
||||||
|
|
||||||
commitType, scope, description, hasBreakingChange := parseSubjectMessage(filteredSubject)
|
commitType, scope, description, hasBreakingChange := parseSubjectMessage(preparedSubject)
|
||||||
|
|
||||||
metadata := make(map[string]string)
|
metadata := make(map[string]string)
|
||||||
for key, mdCfg := range p.messageCfg.Footer {
|
for key, mdCfg := range p.messageCfg.Footer {
|
||||||
@ -241,6 +238,30 @@ func (p MessageProcessorImpl) Parse(subject, body string) CommitMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p MessageProcessorImpl) prepareHeader(header string) (string, error) {
|
||||||
|
if p.messageCfg.HeaderSelector == "" {
|
||||||
|
return header, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
regex, err := regexp.Compile(p.messageCfg.HeaderSelector)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("invalid regex on header-selector %s, error: %s", p.messageCfg.HeaderSelector, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
index := regex.SubexpIndex(messageRegexGroupName)
|
||||||
|
if index < 0 {
|
||||||
|
return "", fmt.Errorf("could not find %s regex group on header-selector regex", messageRegexGroupName)
|
||||||
|
}
|
||||||
|
|
||||||
|
match := regex.FindStringSubmatch(header)
|
||||||
|
|
||||||
|
if match == nil || len(match) < index {
|
||||||
|
return "", fmt.Errorf("could not find %s regex group in match result for '%s'", messageRegexGroupName, header)
|
||||||
|
}
|
||||||
|
|
||||||
|
return match[index], nil
|
||||||
|
}
|
||||||
|
|
||||||
func parseSubjectMessage(message string) (string, string, string, bool) {
|
func parseSubjectMessage(message string) (string, string, string, bool) {
|
||||||
regex := regexp.MustCompile(`([a-z]+)(\((.*)\))?(!)?: (.*)`)
|
regex := regexp.MustCompile(`([a-z]+)(\((.*)\))?(!)?: (.*)`)
|
||||||
result := regex.FindStringSubmatch(message)
|
result := regex.FindStringSubmatch(message)
|
||||||
|
Loading…
Reference in New Issue
Block a user