cliverage/main.go

117 lines
2.7 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"os/exec"
"path"
"strings"
"git.xdrm.io/go/cliverage/coverage"
)
func main() {
var codepath string
var coverfile string
var filepath string
var showUsage bool
flag.StringVar(&codepath, "d", "", "path to where lives your code")
flag.StringVar(&coverfile, "c", "", "path to the coverage file")
flag.StringVar(&filepath, "f", ".", "path to the file to print relative to -d option")
flag.BoolVar(&showUsage, "h", false, "")
flag.Usage = usage
flag.Parse()
// 1. show usage
if showUsage {
flag.Usage()
os.Exit(0)
}
// 2. missing required arguments
if len(codepath) < 1 || len(coverfile) < 1 {
fmt.Printf("%s missing arguments.\n\n", warning("/!\\"))
fmt.Printf("run -h to show usage.\n")
os.Exit(1)
}
// 3. check codepath
if info, err := os.Stat(codepath); true {
if err != nil && os.IsNotExist(err) {
fmt.Printf("%s codepath does not exist.\n\n", warning("/!\\"))
os.Exit(1)
}
if !info.IsDir() {
fmt.Printf("%s codepath is not a directory.\n\n", warning("/!\\"))
os.Exit(1)
}
if err != nil {
fmt.Printf("%s invalid codepath: %s.\n\n", warning("/!\\"), err)
os.Exit(1)
}
}
// 4. check coverfile
if info, err := os.Stat(coverfile); true {
if err != nil && os.IsNotExist(err) {
fmt.Printf("%s coverfile does not exist.\n\n", warning("/!\\"))
os.Exit(1)
}
if info.IsDir() {
fmt.Printf("%s coverfile is not a file.\n\n", warning("/!\\"))
os.Exit(1)
}
if err != nil {
fmt.Printf("%s invalid coverfile: %s.\n\n", warning("/!\\"), err)
os.Exit(1)
}
}
// 5. extract package path
os.Chdir(codepath)
var getGoPkgPath = exec.Command("go", "list", ".")
pkgPath, err := getGoPkgPath.Output()
if err != nil {
fmt.Printf("%s cannot get go package path: %s.\n\n", warning("/!\\"), err)
os.Exit(1)
}
// 6. parse coverfile
fdCoverfile, err := os.OpenFile(coverfile, os.O_RDONLY, 0755)
if err != nil {
fmt.Printf("%s cannot open coverfile: %s.\n\n", warning("/!\\"), err)
os.Exit(1)
}
defer fdCoverfile.Close()
parsedCoverage, err := coverage.Parse(fdCoverfile, strings.Trim(string(pkgPath), " \t\r\n"))
if err != nil {
fmt.Printf("%s error reading coverfile: %s.\n\n", warning("/!\\"), err)
os.Exit(1)
}
// 7. iterate over files
coveredFiles := parsedCoverage.GetFile(filepath)
for fname, coveredChunks := range coveredFiles.Files {
path := path.Join(codepath, fname)
fmt.Printf("----- %s -----\n", fname)
fdFile, err := os.OpenFile(path, os.O_RDONLY, 0755)
if err != nil {
fmt.Printf("%s cannot open file '%s': %s.\n\n", warning("/!\\"), path, err)
continue
}
defer fdFile.Close()
printCoverage(fdFile, os.Stdout, coveredChunks)
fmt.Printf("\n\n")
}
os.Exit(0)
}