ctx, stop := signal.NotifyContext(context.Background(),
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGHUP,
)
defer stop()
signal.Notify(make(chan os.Signal, 1), syscall.SIGPIPE)
fv, err := flags(flag.CommandLine, filterArgs(os.Args[1:]))
if err != nil { return fatal(1, "cannot parse flags: %v", err) }
rg, err := newReportGenerator(fv)
if err != nil { return fatal(2, "cannot instantiate report generator: %v", err) }
defer rg.outRoot.Close()
var progressWriter io.Writer = os.Stderr
if !isTerm(os.Stderr) { progressWriter = io.Discard }
fmt.Fprintf(os.Stderr, "processing %d source files...", len(rg.profiles))
if !isTerm(os.Stdin) { fmt.Fprintln(os.Stderr) }
if err := rg.registerModPaths(fv); err != nil { return fatal(3, "cannot determine module path: %v", err) }
if err := rg.resolveRepoURLs(&realRunner{}, fv); err != nil { return fatal(4, "cannot resolve repository URL: %v", err) }
if err := rg.primeCaches(ctx, packages.Load, progressWriter); err != nil { return fatal(5, "cannot index assets: %v", err) }
if err := rg.writeCovHTMLFiles(ctx, progressWriter); err != nil { return fatal(6, "cannot write HTML coverage files: %v", err) }
tb := &treeBuilder{
fsys: &localFS{},
modPaths: rg.modPaths,
outRoot: rg.outRoot,
covState: rg.covState,
}
if rg.write {
var treeHTML string
if treeHTML, err = tb.buildTree(ctx, progressWriter); err != nil { return fatal(7, "cannot build tree HTML: %v", err) }
if err := rg.writeIndexHTMLFile(treeHTML); err != nil { return fatal(8, "cannot write index.html: %v", err) }
if err := rg.writeStaticFiles(); err != nil { return fatal(9, "cannot write static files: %v", err) }
}
if err := rg.covState.printCoverage(os.Stdout); err != nil {
if !errors.Is(err, syscall.EPIPE) {
return fatal(10, "cannot print coverage: %v", err)
}
}
if err := rg.maybeOpenBrowser(&realRunner{}, fv); err != nil { return fatal(11, "cannot open browser: %v", err) }
return 0
}