2018-05-07 21:44:40 +03:00

93 lines
2.2 KiB
Go

package processors
import (
"fmt"
"io/ioutil"
"strings"
"github.com/bradleyfalzon/revgrep"
"github.com/golangci/golangci-lint/pkg/result"
)
type DiffProcessor struct {
patch string
}
func NewDiffProcessor(patch string) *DiffProcessor {
return &DiffProcessor{
patch: patch,
}
}
func (p DiffProcessor) Name() string {
return "diff"
}
func (p DiffProcessor) processResult(res result.Result) (*result.Result, error) {
// Make mapping to restore original issues metadata later
fli := makeFilesToLinesToIssuesMap([]result.Result{res})
rIssues, err := p.runRevgrepOnIssues(res.Issues)
if err != nil {
return nil, err
}
newIssues := []result.Issue{}
for _, ri := range rIssues {
if fli[ri.File] == nil {
return nil, fmt.Errorf("can't get original issue file for %v", ri)
}
oi := fli[ri.File][ri.LineNo]
if len(oi) != 1 {
return nil, fmt.Errorf("can't get original issue for %v: %v", ri, oi)
}
i := result.Issue{
File: ri.File,
LineNumber: ri.LineNo,
Text: ri.Message,
HunkPos: ri.HunkPos,
FromLinter: oi[0].FromLinter,
}
newIssues = append(newIssues, i)
}
res.Issues = newIssues
return &res, nil
}
func (p DiffProcessor) Process(results []result.Result) ([]result.Result, error) {
retResults := []result.Result{}
for _, res := range results {
newRes, err := p.processResult(res)
if err != nil {
return nil, fmt.Errorf("can't filter only new issues for result %+v: %s", res, err)
}
retResults = append(retResults, *newRes)
}
return retResults, nil
}
func (p DiffProcessor) runRevgrepOnIssues(issues []result.Issue) ([]revgrep.Issue, error) {
// TODO: change revgrep to accept interface with line number, file name
fakeIssuesLines := []string{}
for _, i := range issues {
line := fmt.Sprintf("%s:%d:%d: %s", i.File, i.LineNumber, 0, i.Text)
fakeIssuesLines = append(fakeIssuesLines, line)
}
fakeIssuesOut := strings.Join(fakeIssuesLines, "\n")
checker := revgrep.Checker{
Patch: strings.NewReader(p.patch),
Regexp: `^([^:]+):(\d+):(\d+)?:?\s*(.*)$`,
}
rIssues, err := checker.Check(strings.NewReader(fakeIssuesOut), ioutil.Discard)
if err != nil {
return nil, fmt.Errorf("can't filter only new issues by revgrep: %s", err)
}
return rIssues, nil
}