портирован код из старого репозитория https://di9.ru/git/Voomra/Conventional-Commits
91 lines
2.0 KiB
Go
91 lines
2.0 KiB
Go
package validator
|
||
|
||
import (
|
||
"commitlint/internal/commitlint/configuration"
|
||
"regexp"
|
||
"slices"
|
||
)
|
||
|
||
type Result int
|
||
|
||
const (
|
||
IncorrectPattern Result = iota
|
||
UnknownType
|
||
UnknownContext
|
||
OverlongLine
|
||
BlankLine
|
||
)
|
||
|
||
type ValidateError struct {
|
||
// Тип проблемы
|
||
Result Result
|
||
|
||
// Проблемная строка в коммите. Начинается с 1
|
||
Line int
|
||
|
||
// Переданный не известный тип
|
||
UnknownType string
|
||
|
||
// Переданный не известный контекст
|
||
UnknownContext string
|
||
}
|
||
|
||
func Validate(commitMessage []string, config configuration.Config) *ValidateError {
|
||
if pResult := validateFirstLine(commitMessage[0], config); pResult != nil {
|
||
return pResult
|
||
}
|
||
|
||
if len(commitMessage) > 1 {
|
||
if pResult := validateBody(commitMessage[1:], config); pResult != nil {
|
||
return pResult
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func validateFirstLine(line string, config configuration.Config) *ValidateError {
|
||
for _, pExclude := range config.Excludes {
|
||
if pExclude.MatchString(line) {
|
||
return nil
|
||
}
|
||
}
|
||
|
||
commitFirstLine := regexp.MustCompile("^([a-z0-9]+?)!?(?:\\(([a-z0-9]+?)\\))?: .+$")
|
||
match := commitFirstLine.FindAllStringSubmatch(line, -1)
|
||
|
||
if len(match) == 0 {
|
||
return &ValidateError{Result: IncorrectPattern, Line: 1}
|
||
}
|
||
|
||
commitType := match[0][1]
|
||
if !slices.Contains(config.Types, commitType) {
|
||
return &ValidateError{Result: UnknownType, Line: 1, UnknownType: commitType}
|
||
}
|
||
|
||
commitContext := match[0][2]
|
||
if len(commitContext) > 0 && !slices.Contains(config.Contexts, commitContext) {
|
||
return &ValidateError{Result: UnknownContext, Line: 1, UnknownContext: commitContext}
|
||
}
|
||
|
||
if len(line) > config.MaxLengthLine {
|
||
return &ValidateError{Result: OverlongLine, Line: 1}
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func validateBody(body []string, config configuration.Config) *ValidateError {
|
||
if len(body[0]) > 0 {
|
||
return &ValidateError{Result: BlankLine, Line: 2}
|
||
}
|
||
|
||
for i, line := range body[1:] {
|
||
if len(line) > config.MaxLengthLine {
|
||
return &ValidateError{Result: OverlongLine, Line: i + 3}
|
||
}
|
||
}
|
||
|
||
return nil
|
||
}
|