github.com/alecthomas/golangci-lint@v1.4.2-0.20180609094924-581a3564ff68/pkg/result/processors/max_same_issues.go (about) 1 package processors 2 3 import ( 4 "sort" 5 6 "github.com/golangci/golangci-lint/pkg/result" 7 "github.com/sirupsen/logrus" 8 ) 9 10 type textToCountMap map[string]int 11 12 type MaxSameIssues struct { 13 tc textToCountMap 14 limit int 15 } 16 17 var _ Processor = &MaxSameIssues{} 18 19 func NewMaxSameIssues(limit int) *MaxSameIssues { 20 return &MaxSameIssues{ 21 tc: textToCountMap{}, 22 limit: limit, 23 } 24 } 25 26 func (MaxSameIssues) Name() string { 27 return "max_same_issues" 28 } 29 30 func (p *MaxSameIssues) Process(issues []result.Issue) ([]result.Issue, error) { 31 if p.limit <= 0 { // no limit 32 return issues, nil 33 } 34 35 return filterIssues(issues, func(i *result.Issue) bool { 36 p.tc[i.Text]++ // always inc for stat 37 return p.tc[i.Text] <= p.limit 38 }), nil 39 } 40 41 func (p MaxSameIssues) Finish() { 42 walkStringToIntMapSortedByValue(p.tc, func(text string, count int) { 43 if count > p.limit { 44 logrus.Infof("%d/%d issues with text %q were hidden, use --max-same-issues", 45 count-p.limit, count, text) 46 } 47 }) 48 } 49 50 type kv struct { 51 Key string 52 Value int 53 } 54 55 func walkStringToIntMapSortedByValue(m map[string]int, walk func(k string, v int)) { 56 var ss []kv 57 for k, v := range m { 58 ss = append(ss, kv{k, v}) 59 } 60 61 sort.Slice(ss, func(i, j int) bool { 62 return ss[i].Value > ss[j].Value 63 }) 64 65 for _, kv := range ss { 66 walk(kv.Key, kv.Value) 67 } 68 }