Skip to content

Commit

Permalink
feat: implement stats per linter with a flag (#4341)
Browse files Browse the repository at this point in the history
Co-authored-by: Fernandez Ludovic <[email protected]>
  • Loading branch information
mostafa and ldez authored Feb 2, 2024
1 parent 7bc1927 commit b3ffe70
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .golangci.reference.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ run:
# Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.17
go: '1.19'

# Show statistics per linter.
# Default: false
show-stats: true


# output configuration options
output:
Expand Down
30 changes: 30 additions & 0 deletions pkg/commands/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ import (
"log"
"os"
"runtime"
"sort"
"strings"
"time"

"github.com/fatih/color"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"golang.org/x/exp/maps"

"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/exitcodes"
Expand Down Expand Up @@ -125,6 +127,7 @@ func initFlagSet(fs *pflag.FlagSet, cfg *config.Config, m *lintersdb.Manager, is
const allowSerialDesc = "Allow multiple golangci-lint instances running, but serialize them around a lock. " +
"If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start."
fs.BoolVar(&rc.AllowSerialRunners, "allow-serial-runners", false, wh(allowSerialDesc))
fs.BoolVar(&rc.ShowStats, "show-stats", false, wh("Show statistics per linter"))

// Linters settings config
lsc := &cfg.LintersSettings
Expand Down Expand Up @@ -408,6 +411,8 @@ func (e *Executor) runAndPrint(ctx context.Context, args []string) error {
}
}

e.printStats(issues)

e.setExitCodeIfIssuesFound(issues)

e.fileCache.PrintStats(e.log)
Expand Down Expand Up @@ -489,6 +494,31 @@ func (e *Executor) createPrinter(format string, w io.Writer) (printers.Printer,
return p, nil
}

func (e *Executor) printStats(issues []result.Issue) {
if !e.cfg.Run.ShowStats {
return
}

if len(issues) == 0 {
e.runCmd.Println("0 issues.")
return
}

stats := map[string]int{}
for idx := range issues {
stats[issues[idx].FromLinter]++
}

e.runCmd.Printf("%d issues:\n", len(issues))

keys := maps.Keys(stats)
sort.Strings(keys)

for _, key := range keys {
e.runCmd.Printf("* %s: %d\n", key, stats[key])
}
}

// executeRun executes the 'run' CLI command, which runs the linters.
func (e *Executor) executeRun(_ *cobra.Command, args []string) {
needTrackResources := e.cfg.Run.IsVerbose || e.cfg.Run.PrintResourcesUsage
Expand Down
2 changes: 2 additions & 0 deletions pkg/config/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,6 @@ type Run struct {

AllowParallelRunners bool `mapstructure:"allow-parallel-runners"`
AllowSerialRunners bool `mapstructure:"allow-serial-runners"`

ShowStats bool `mapstructure:"show-stats"`
}

0 comments on commit b3ffe70

Please sign in to comment.