96 lines
1.6 KiB
Go
96 lines
1.6 KiB
Go
package coverage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
|
|
"go.unistack.org/pkgdash/internal/models"
|
|
"golang.org/x/tools/cover"
|
|
)
|
|
|
|
func Analyze(ctx context.Context, dataCoverage io.Reader, pack models.Package) (float64, error) {
|
|
calculcate, err := calculateFiles(dataCoverage)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
mapCover := make(map[string]float64)
|
|
{
|
|
tree, err := GetTreeFromGit(ctx, pack.URL)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
list, err := tree.GoFileList("")
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
for _, f := range list {
|
|
mapCover[f] = 0.0
|
|
}
|
|
}
|
|
|
|
cur := len(mapCover)
|
|
|
|
for _, d := range calculcate.Files {
|
|
file := strings.TrimPrefix(d.Name, pack.Name+"/")
|
|
mapCover[file] = d.Coverage
|
|
}
|
|
|
|
// check)
|
|
if len(mapCover) != cur {
|
|
fmt.Printf("add new keys, was: %d, has: %d", cur, len(mapCover))
|
|
}
|
|
|
|
// TODO add calculate full
|
|
|
|
return 0, nil
|
|
}
|
|
|
|
type Data struct {
|
|
Files []*calculateFile
|
|
Set bool
|
|
}
|
|
|
|
type calculateFile struct {
|
|
Name string
|
|
Coverage float64
|
|
}
|
|
|
|
func calculateFiles(coverSrc io.Reader) (d *Data, err error) {
|
|
profiles, err := cover.ParseProfilesFromReader(coverSrc)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
d = new(Data)
|
|
for _, profile := range profiles {
|
|
fn := profile.FileName
|
|
if profile.Mode == "set" {
|
|
d.Set = true
|
|
}
|
|
|
|
d.Files = append(d.Files, &calculateFile{
|
|
Name: fn,
|
|
Coverage: percentCovered(profile),
|
|
})
|
|
}
|
|
return d, err
|
|
}
|
|
|
|
func percentCovered(p *cover.Profile) float64 {
|
|
var total, covered int64
|
|
for _, b := range p.Blocks {
|
|
total += int64(b.NumStmt)
|
|
if b.Count > 0 {
|
|
covered += int64(b.NumStmt)
|
|
}
|
|
}
|
|
if total == 0 {
|
|
return 0
|
|
}
|
|
return float64(covered) / float64(total) * 100
|
|
}
|