github.com/blaisereilly/goreporter@v0.0.0-20240129165232-a6e9a46234bd/engine/strategy_copycheck.go (about)

     1  package engine
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  
     7  	"github.com/360EntSecGroup-Skylar/goreporter/linters/copycheck"
     8  	"github.com/360EntSecGroup-Skylar/goreporter/utils"
     9  )
    10  
    11  type StrategyCopyCheck struct {
    12  	Sync *Synchronizer `inject:""`
    13  }
    14  
    15  func (s *StrategyCopyCheck) GetName() string {
    16  	return "CopyCheck"
    17  }
    18  
    19  func (s *StrategyCopyCheck) GetDescription() string {
    20  	return "Query all duplicate code in the project and give duplicate code locations and rows."
    21  }
    22  
    23  func (s *StrategyCopyCheck) GetWeight() float64 {
    24  	return 0.05
    25  }
    26  
    27  // linterCopy provides a function that scans all duplicate code in the project and give
    28  // duplicate code locations and rows.It will extract from the linter need to convert the
    29  // data.The result will be saved in the r's attributes.
    30  func (s *StrategyCopyCheck) Compute(parameters StrategyParameter) (summaries *Summaries) {
    31  	summaries = NewSummaries()
    32  
    33  	copyCodeList := copycheck.CopyCheck(parameters.ProjectPath, parameters.ExceptPackages+",_test.go")
    34  	sumProcessNumber := int64(7)
    35  	processUnit := utils.GetProcessUnit(sumProcessNumber, len(copyCodeList))
    36  
    37  	for i := 0; i < len(copyCodeList); i++ {
    38  		errorSlice := make([]Error, 0)
    39  		for j := 0; j < len(copyCodeList[i]); j++ {
    40  			line := 0
    41  			values := strings.Split(copyCodeList[i][j], ":")
    42  			if len(values) > 1 {
    43  				lines := strings.Split(strings.TrimSpace(values[1]), ",")
    44  				if len(lines) == 2 {
    45  					lineright, _ := strconv.Atoi(lines[1])
    46  					lineleft, _ := strconv.Atoi(lines[0])
    47  					if lineright-lineleft >= 0 {
    48  						line = lineright - lineleft + 1
    49  					}
    50  				}
    51  				values[0] = utils.AbsPath(values[0])
    52  			}
    53  
    54  			errorSlice = append(errorSlice, Error{LineNumber: line, ErrorString: strings.Join(values, ":")})
    55  		}
    56  		summaries.Lock()
    57  		summaries.Summaries[string(i)] = Summary{
    58  			Name:   strconv.Itoa(len(errorSlice)),
    59  			Errors: errorSlice,
    60  		}
    61  		summaries.Unlock()
    62  		if sumProcessNumber > 0 {
    63  			s.Sync.LintersProcessChans <- processUnit
    64  			sumProcessNumber = sumProcessNumber - processUnit
    65  		}
    66  	}
    67  	return
    68  }
    69  
    70  func (s *StrategyCopyCheck) Percentage(summaries *Summaries) float64 {
    71  	summaries.RLock()
    72  	defer summaries.RUnlock()
    73  	return utils.CountPercentage(len(summaries.Summaries))
    74  }