@@ -4,11 +4,12 @@ import (
44 "errors"
55 "fmt"
66 "path/filepath"
7+ "time"
78
89 "github.com/spf13/cobra"
910 "github.com/vbvictor/grit/grit/cmd/flag"
10- stat "github.com/vbvictor/grit/grit/cmd/stat/subcommands"
1111 "github.com/vbvictor/grit/pkg/complexity"
12+ "github.com/vbvictor/grit/pkg/coverage"
1213 "github.com/vbvictor/grit/pkg/git"
1314 "github.com/vbvictor/grit/pkg/report"
1415)
@@ -22,54 +23,94 @@ func (e *factorError) Error() string {
2223 return fmt .Sprintf ("%s factor is lower that 0: %f" , e .factor , e .value )
2324}
2425
26+ const (
27+ DefaultTop = 10
28+ )
29+
30+ var (
31+ excludeRegex string
32+ top int
33+ since string
34+ until string
35+ repoPath string
36+ )
37+
38+ var churnOpts = & git.ChurnOptions {
39+ SortBy : git .Changes ,
40+ Top : 0 ,
41+ Extensions : nil ,
42+ Since : time.Time {},
43+ Until : time.Time {},
44+ Path : "" ,
45+ ExcludePath : "" ,
46+ }
47+
48+ var complexityOpts = complexity.Options {
49+ Engine : complexity .Gocyclo ,
50+ ExcludePath : "" ,
51+ Top : 0 , //nolint:mnd // default value
52+ }
53+
54+ var coverageOpts = coverage.Options {
55+ SortBy : coverage .Worst ,
56+ Top : 0 , //nolint:mnd // default value
57+ ExcludePath : "" ,
58+ RunCoverage : flag .Auto ,
59+ CoverageFilename : "coverage.out" ,
60+ }
61+
62+ var reportOpts = report.Options {
63+ Top : DefaultTop ,
64+ ExcludePath : "" ,
65+ ChurnFactor : 1.0 ,
66+ ComplexityFactor : 1.0 ,
67+ CoverageFactor : 1.0 ,
68+ }
69+
2570var ReportCmd = & cobra.Command {
2671 Use : "report [flags] <repository>" ,
2772 Short : "Compare code complexity and churn metrics" ,
2873 Args : cobra .ExactArgs (1 ),
2974 SilenceErrors : true ,
3075 PreRunE : func (_ * cobra.Command , _ []string ) error {
31- return validateFactors (& report . ReportOpts )
76+ return validateFactors (& reportOpts )
3277 },
3378 RunE : func (_ * cobra.Command , args []string ) error {
34- repoPath , err := filepath .Abs (args [0 ])
79+ var err error
80+ repoPath , err = filepath .Abs (args [0 ])
3581 if err != nil {
3682 return errors .Join (& flag.AbsRepoPathError {Path : args [0 ]}, err )
3783 }
3884
39- flag .LogIfVerbose ("Processing directory: %s" , repoPath )
85+ flag .LogIfVerbose ("Processing directory: %s\n " , repoPath )
4086
41- churnOpts , err := stat . ChurnOptsFromFlags ( )
42- if err != nil {
43- return fmt .Errorf ("failed to create churn options: %w" , err )
87+ flag . LogIfVerbose ( "Analyzing churn data... \n " )
88+ if err := git . PopulateOpts ( churnOpts , [] string { "go" }, since , until , repoPath ); err != nil {
89+ return fmt .Errorf ("failed to create options: %w" , err )
4490 }
45- churnOpts .Path = repoPath
4691
47- flag .LogIfVerbose ("Analyzing churn data..." )
48- churnStats , err := git .ReadGitChurn (repoPath , churnOpts )
92+ churns , err := git .ReadGitChurn (repoPath , churnOpts )
4993 if err != nil {
50- return fmt .Errorf ("error getting churn stats : %w" , err )
94+ return fmt .Errorf ("error getting churn metrics : %w" , err )
5195 }
52- flag .LogIfVerbose ("Got %d files" , len (churnStats ))
96+ flag .LogIfVerbose ("Got %d churn files\n " , len (churns ))
5397
54- // Get complexity data
55- complexityOpts , err := stat . ComplexityOptsFromFlags ( )
98+ flag . LogIfVerbose ( "Analyzing complexity data... \n " )
99+ complexityStats , err := complexity . RunComplexity ( repoPath , complexityOpts )
56100 if err != nil {
57- return fmt .Errorf ("failed to create complexity options : %w" , err )
101+ return fmt .Errorf ("error running complexity analysis : %w" , err )
58102 }
59103
60- flag .LogIfVerbose ("Analyzing complexity data..." )
61- complexityStats , err := complexity .RunComplexity (repoPath , complexityOpts )
104+ flag .LogIfVerbose ("Got %d complexity files\n " , len (complexityStats ))
105+
106+ flag .LogIfVerbose ("Analyzing coverage data...\n " )
107+ covData , err := coverage .GetCoverageData (repoPath , coverageOpts )
62108 if err != nil {
63- return fmt .Errorf ("error running complexity analysis : %w" , err )
109+ return fmt .Errorf ("failed to get coverage data : %w" , err )
64110 }
65- flag .LogIfVerbose ("Got %d files" , len (complexityStats ))
111+ flag .LogIfVerbose ("Got %d coverage files\n " , len (covData ))
66112
67113 /*
68- // Get coverage data
69- coverageStats, err := stat.GetCoverageData(repoPath, flag.CoverageFile, stat.CoverageOptsFromFlags())
70- if err != nil {
71- return fmt.Errorf("error reading coverage: %w", err)
72- }
73114
74115
75116 // Combine data into FileScores
@@ -104,27 +145,27 @@ func init() {
104145 flags := ReportCmd .PersistentFlags ()
105146
106147 // Common flags
107- flags .StringVar (& flag . ExcludePath , flag .LongExclude , "" , "Exclude files matching regex pattern" )
108- flags .IntVarP (& flag . Top , flag .LongTop , flag .ShortTop , flag .DefaultTop , "Number of top files to display" )
148+ flags .StringVar (& excludeRegex , flag .LongExclude , "" , "Exclude files matching regex pattern" )
149+ flags .IntVarP (& top , flag .LongTop , flag .ShortTop , flag .DefaultTop , "Number of top files to display" )
109150 flags .BoolVarP (& flag .Verbose , flag .LongVerbose , flag .ShortVerbose , false , "Show detailed progress" )
110151
111152 // Churn flags
112- flags .StringVar (& flag .SortBy , flag .LongSort , "commits" , "Sort by: changes, additions, deletions, commits" )
113- flags .StringVarP (& flag .Since , flag .LongSince , flag .ShortSince , "" , "Start date for analysis (YYYY-MM-DD)" )
114- flags .StringVarP (& flag .Until , flag .LongUntil , flag .ShortUntil , "" , "End date for analysis (YYYY-MM-DD)" )
153+ flags .StringVarP (& since , flag .LongSince , flag .ShortSince , "" , "Start date for analysis (YYYY-MM-DD)" )
154+ flags .StringVarP (& until , flag .LongUntil , flag .ShortUntil , "" , "End date for analysis (YYYY-MM-DD)" )
115155
116156 // Complexity flags
117- flags .StringVarP (& flag .Engine , flag .LongEngine , flag .ShortEngine , complexity .Gocyclo , "Complexity calculation engine" )
157+ flags .StringVarP (& complexityOpts .Engine , flag .LongEngine , flag .ShortEngine , complexity .Gocyclo ,
158+ "Complexity calculation engine" )
118159
119160 // Coverage flags
120- flags .StringVarP (& flag .RunCoverage , flag .LongRunCoverage , flag .ShortRunCoverage , flag .Auto , "Specify tests run format" )
121- flags .StringVarP (& flag . CoverageFile , flag .LongFileCoverage , flag .ShortFileCoverage , "coverage.out" ,
161+ flags .StringVarP (& coverageOpts .RunCoverage , flag .LongRunCoverage , flag .ShortRunCoverage , flag .Auto , "tests run format" )
162+ flags .StringVarP (& coverageOpts . CoverageFilename , flag .LongFileCoverage , flag .ShortFileCoverage , "coverage.out" ,
122163 "Coverage file name" )
123164
124165 // Report specific flags
125- flags .Float64Var (& report . ReportOpts .ChurnFactor , "churn-factor" , 1.0 , "Churn factor" )
126- flags .Float64Var (& report . ReportOpts .ComplexityFactor , "comp-factor" , 1.0 , "Complexity factor" )
127- flags .Float64Var (& report . ReportOpts .CoverageFactor , "cov-factor" , 1.0 , "Coverage factor" )
166+ flags .Float64Var (& reportOpts .ChurnFactor , "churn-factor" , 1.0 , "Churn factor" )
167+ flags .Float64Var (& reportOpts .ComplexityFactor , "comp-factor" , 1.0 , "Complexity factor" )
168+ flags .Float64Var (& reportOpts .CoverageFactor , "cov-factor" , 1.0 , "Coverage factor" )
128169}
129170
130171func validateFactors (opts * report.Options ) error {
0 commit comments