Skip to content

Commit 4d0ca24

Browse files
feat(lint)!: update Lint result APIs
* rename Result to Failure * rename RuleResult to RuleFailure * remove Errors, Warns APIs
1 parent 8136974 commit 4d0ca24

7 files changed

Lines changed: 106 additions & 74 deletions

File tree

cmd/lint.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func runLint(confFilePath, fileInput string) (lintResult string, hasError bool,
2727
if err != nil {
2828
return "", false, err
2929
}
30-
return resStr, res.HasErrors(), nil
30+
return resStr, hasErrorSeverity(res), nil
3131
}
3232

3333
func getLinter(confFilePath string) (*lint.Linter, lint.Formatter, error) {
@@ -70,3 +70,12 @@ func getCommitMsg(fileInput string) (string, error) {
7070
}
7171
return string(inBytes), nil
7272
}
73+
74+
func hasErrorSeverity(res *lint.Failure) bool {
75+
for _, r := range res.RuleFailures() {
76+
if r.Severity() == lint.SeverityError {
77+
return true
78+
}
79+
}
80+
return false
81+
}

formatter/default.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,42 @@ type DefaultFormatter struct{}
1515
// Name returns name of formatter
1616
func (f *DefaultFormatter) Name() string { return "default" }
1717

18-
// Format formats the lint.Result
19-
func (f *DefaultFormatter) Format(res *lint.Result) (string, error) {
20-
return formatResult(res), nil
18+
// Format formats the lint.Failure
19+
func (f *DefaultFormatter) Format(res *lint.Failure) (string, error) {
20+
return formatFailure(res), nil
2121
}
2222

23-
func formatResult(res *lint.Result) string {
23+
func formatFailure(res *lint.Failure) string {
2424
if res.IsOK() {
2525
return " ✔ commit message"
2626
}
27-
return writeResult(res)
27+
return writeFailure(res)
2828
}
2929

30-
func writeResult(res *lint.Result) string {
30+
func writeFailure(res *lint.Failure) string {
3131
str := &strings.Builder{}
3232

3333
str.WriteString("commitlint")
3434
fmt.Fprintf(str, "\n\n→ input: %s", strconv.Quote(truncate(25, res.Input())))
3535

36-
if res.HasErrors() {
37-
writeLintResult(str, "Errors", res.Errors(), "❌")
38-
}
36+
errs, warns, others := bySeverity(res)
3937

40-
if res.HasWarns() {
41-
writeLintResult(str, "Warnings", res.Warns(), "!")
42-
}
38+
writeRuleFailure(str, "Errors", errs, "❌")
39+
writeRuleFailure(str, "Warnings", warns, "!")
40+
writeRuleFailure(str, "Other Severities", others, "?")
4341

44-
fmt.Fprintf(str, "\n\nTotal %d errors, %d warnings", len(res.Errors()), len(res.Warns()))
42+
fmt.Fprintf(str, "\n\nTotal %d errors, %d warnings, %d other severities", len(errs), len(warns), len(others))
4543
return str.String()
4644
}
4745

48-
func writeLintResult(w *strings.Builder, title string, resArr []lint.RuleResult, sign string) {
46+
func writeRuleFailure(w *strings.Builder, title string, resArr []*lint.RuleFailure, sign string) {
47+
if len(resArr) == 0 {
48+
return
49+
}
50+
4951
fmt.Fprint(w, "\n\n"+title+":")
5052
for _, msg := range resArr {
51-
fmt.Fprintf(w, "\n %s %s: %s", sign, msg.Name, msg.Message)
53+
fmt.Fprintf(w, "\n %s %s: %s", sign, msg.RuleName(), msg.Message())
5254
}
5355
}
5456

formatter/json.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ type JSONFormatter struct{}
1414
func (f *JSONFormatter) Name() string { return "json" }
1515

1616
// Format formats the lint.Result
17-
func (f *JSONFormatter) Format(res *lint.Result) (string, error) {
17+
func (f *JSONFormatter) Format(res *lint.Failure) (string, error) {
1818
output := make(map[string]interface{}, 4)
1919

20+
errs, warns, others := bySeverity(res)
21+
2022
output["input"] = res.Input()
2123
output["status"] = res.IsOK()
22-
output["errors"] = f.formRuleResult(res.Errors())
23-
output["warnings"] = f.formRuleResult(res.Warns())
24+
25+
output["errors"] = f.formRuleFailure(errs, false)
26+
output["warnings"] = f.formRuleFailure(warns, false)
27+
output["others"] = f.formRuleFailure(others, true)
2428

2529
msg, err := json.Marshal(output)
2630
if err != nil {
@@ -29,14 +33,18 @@ func (f *JSONFormatter) Format(res *lint.Result) (string, error) {
2933
return strings.Trim(string(msg), "\n"), nil
3034
}
3135

32-
func (f *JSONFormatter) formRuleResult(res []lint.RuleResult) []map[string]interface{} {
36+
func (f *JSONFormatter) formRuleFailure(res []*lint.RuleFailure, includeSev bool) []map[string]interface{} {
3337
outs := make([]map[string]interface{}, 0, len(res))
3438

3539
for _, r := range res {
3640
output := make(map[string]interface{})
3741

38-
output["name"] = r.Name
39-
output["message"] = r.Message
42+
output["name"] = r.RuleName()
43+
output["message"] = r.Message()
44+
45+
if includeSev {
46+
output["severity"] = r.Severity()
47+
}
4048

4149
outs = append(outs, output)
4250
}

formatter/util.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package formatter
2+
3+
import "github.com/conventionalcommit/commitlint/lint"
4+
5+
// bySeverity returns all messages with given severity
6+
func bySeverity(res *lint.Failure) (errs, warns, others []*lint.RuleFailure) {
7+
for _, r := range res.RuleFailures() {
8+
switch r.Severity() {
9+
case lint.SeverityError:
10+
errs = append(errs, r)
11+
case lint.SeverityWarn:
12+
warns = append(warns, r)
13+
default:
14+
others = append(others, r)
15+
}
16+
}
17+
return errs, warns, others
18+
}

lint/formatter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ type Formatter interface {
66
Name() string
77

88
// Format formats the linter result
9-
Format(result *Result) (string, error)
9+
Format(result *Failure) (string, error)
1010
}

lint/linter.go

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func New(conf *Config, rules []Rule) (*Linter, error) {
1313
}
1414

1515
// Lint checks the given commitMsg string against rules
16-
func (l *Linter) Lint(commitMsg string) (*Result, error) {
16+
func (l *Linter) Lint(commitMsg string) (*Failure, error) {
1717
msg, err := Parse(commitMsg)
1818
if err != nil {
1919
if isHeaderErr(err) {
@@ -25,8 +25,8 @@ func (l *Linter) Lint(commitMsg string) (*Result, error) {
2525
}
2626

2727
// LintCommit checks the given Commit against rules
28-
func (l *Linter) LintCommit(msg *Commit) (*Result, error) {
29-
res := newResult(msg.FullCommit)
28+
func (l *Linter) LintCommit(msg *Commit) (*Failure, error) {
29+
res := newFailure(msg.FullCommit)
3030

3131
for _, rule := range l.rules {
3232
currentRule := rule
@@ -40,26 +40,19 @@ func (l *Linter) LintCommit(msg *Commit) (*Result, error) {
4040
return res, nil
4141
}
4242

43-
func (l *Linter) runRule(rule Rule, severity Severity, msg *Commit) (RuleResult, bool) {
44-
ruleMsg, isOK := rule.Validate(msg)
43+
func (l *Linter) runRule(rule Rule, severity Severity, msg *Commit) (*RuleFailure, bool) {
44+
failMsg, isOK := rule.Validate(msg)
4545
if isOK {
46-
return RuleResult{}, true
47-
}
48-
res := RuleResult{
49-
Name: rule.Name(),
50-
Severity: severity,
51-
Message: ruleMsg,
46+
return nil, true
5247
}
48+
res := newRuleFailure(rule.Name(), failMsg, severity)
5349
return res, false
5450
}
5551

56-
func (l *Linter) headerErrorRule(commitMsg string) *Result {
52+
func (l *Linter) headerErrorRule(commitMsg string) *Failure {
5753
// TODO: show more information
58-
res := newResult(commitMsg)
59-
res.add(RuleResult{
60-
Name: "parser",
61-
Severity: SeverityError,
62-
Message: "commit header is not valid",
63-
})
54+
res := newFailure(commitMsg)
55+
ruleFail := newRuleFailure("parser", "commit header is not valid", SeverityError)
56+
res.add(ruleFail)
6457
return res
6558
}

lint/result.go

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,52 @@
11
package lint
22

3-
// Result holds result of linter
4-
type Result struct {
3+
// Failure holds Failure of linter
4+
type Failure struct {
55
inputMsg string
66

7-
errResults []RuleResult
8-
warnResults []RuleResult
7+
failures []*RuleFailure
98
}
109

11-
// RuleResult holds result of a linter rule
12-
type RuleResult struct {
13-
Name string
14-
Severity Severity
15-
Message string
16-
}
17-
18-
func newResult(inputMsg string) *Result {
19-
return &Result{inputMsg: inputMsg}
10+
func newFailure(inputMsg string) *Failure {
11+
return &Failure{
12+
inputMsg: inputMsg,
13+
}
2014
}
2115

2216
// AddError adds
23-
func (res *Result) add(r RuleResult) {
24-
if r.Severity == SeverityError {
25-
res.errResults = append(res.errResults, r)
26-
} else if r.Severity == SeverityWarn {
27-
res.warnResults = append(res.warnResults, r)
28-
} else {
29-
// should not come here
30-
res.errResults = append(res.errResults, r)
31-
}
17+
func (res *Failure) add(r *RuleFailure) {
18+
res.failures = append(res.failures, r)
3219
}
3320

21+
// IsOK returns true if commit message passed all the rules
22+
func (res *Failure) IsOK() bool { return len(res.failures) == 0 }
23+
3424
// Input returns input commit message
35-
func (res *Result) Input() string { return res.inputMsg }
25+
func (res *Failure) Input() string { return res.inputMsg }
3626

37-
// Errors returns all error messages
38-
func (res *Result) Errors() []RuleResult { return res.errResults }
27+
// RuleFailures returns rule Failures
28+
func (res *Failure) RuleFailures() []*RuleFailure { return res.failures }
3929

40-
// Warns returns all warning messages
41-
func (res *Result) Warns() []RuleResult { return res.warnResults }
30+
// RuleFailure holds Failure of a linter rule
31+
type RuleFailure struct {
32+
name string
33+
severity Severity
34+
message string
35+
}
4236

43-
// HasErrors returns true if errors found by linter
44-
func (res *Result) HasErrors() bool { return len(res.errResults) != 0 }
37+
func newRuleFailure(name, msg string, severity Severity) *RuleFailure {
38+
return &RuleFailure{
39+
name: name,
40+
message: msg,
41+
severity: severity,
42+
}
43+
}
4544

46-
// HasWarns returns true if warnings found by linter
47-
func (res *Result) HasWarns() bool { return len(res.warnResults) != 0 }
45+
// RuleName returns rule name
46+
func (r *RuleFailure) RuleName() string { return r.name }
4847

49-
// IsOK returns true if commit message passed all the rules
50-
func (res *Result) IsOK() bool { return !res.HasErrors() && !res.HasWarns() }
48+
// Severity returns severity of the Rule Failure
49+
func (r *RuleFailure) Severity() Severity { return r.severity }
50+
51+
// Message returns the error message of failed rule
52+
func (r *RuleFailure) Message() string { return r.message }

0 commit comments

Comments
 (0)