src.dualinventive.com/go/common/codereview/main.go

136 lines
3.1 KiB
Go

package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"text/template"
"os/exec"
"src.dualinventive.com/go/common/version/version"
)
var (
reviewHeaderTex = `% select the document template
\documentclass[a4paper]{di/codereview}
\title{@.PROJECT_NAME@}
\author{@.USER@}
\productowner{Dual Inventive Techology Centre B.V.}
\releasedate{\DIdate\today}
\documentstatus{Concept}
\documentversion{@.VERSION@}
\begin{document}
\maketitle
`
reviewFooterTex = `
\end{document}`
reviewFile = `
\newpage
\rhead{\detokenize{@.FILENAME@}}
\inputminted[fontsize=\footnotesize,tabsize=8,linenos=true,numberblanklines=true,showspaces=false,breaklines=true]{@.FILETYPE@}{@.FILENAME@}
`
)
func main() {
var sourcefiles []string
var crMatches []string
crtxt, err := ioutil.ReadFile("codereview.txt")
if err == nil {
crMatches = strings.Split(string(crtxt), "\n")
}
filepath.Walk(".", func(path string, f os.FileInfo, err error) error {
if strings.HasPrefix(path, "vendor") || f.IsDir() {
return nil
}
include := true
if len(crMatches) > 0 {
include = false
for _, match := range crMatches {
if strings.HasPrefix(path, match) {
include = true
}
}
}
if include && strings.HasSuffix(path, ".go") {
sourcefiles = append(sourcefiles, path)
}
return nil
})
crfile, err := ioutil.TempFile(".", "codereview")
defer func() {
name := crfile.Name()
crfile.Close()
os.Remove(name)
}()
if err != nil {
panic(err)
}
t, err := template.New("tex").Delims("@", "@").Parse(reviewHeaderTex)
if err != nil {
panic(err)
}
user := os.Getenv("USER")
if len(user) == 0 {
user = os.Getenv("USERNAME")
}
ver := version.GetVersion()
tmplData := map[string]string{
"VERSION": ver,
"PROJECT_NAME": os.Getenv("PROJECT_NAME"),
"USER": user,
}
if err := t.Execute(crfile, tmplData); err != nil {
panic(err)
}
for _, file := range sourcefiles {
rt, err := template.New("tex").Delims("@", "@").Parse(reviewFile)
if err != nil {
panic(err)
}
tmplData := map[string]string{
"FILENAME": file,
"FILETYPE": "go",
}
if err := rt.Execute(crfile, tmplData); err != nil {
panic(err)
}
}
crfile.WriteString(reviewFooterTex)
fmt.Println("PDF-Latex (pass 1)")
c := exec.Command("/usr/local/texlive/2016/bin/x86_64-linux/pdflatex", "-interaction=batchmode", "-shell-escape", crfile.Name())
if err := c.Run(); err != nil {
panic(err)
}
fmt.Println("PDF-Latex (pass 2)")
c = exec.Command("/usr/local/texlive/2016/bin/x86_64-linux/pdflatex", "-interaction=batchmode", "-shell-escape", crfile.Name())
if err := c.Run(); err != nil {
panic(err)
}
fmt.Println("PDF-Latex (pass 3)")
c = exec.Command("/usr/local/texlive/2016/bin/x86_64-linux/pdflatex", "-interaction=batchmode", "-shell-escape", crfile.Name())
if err := c.Run(); err != nil {
panic(err)
}
fmt.Println("Codereview is present in codereview-" + ver + ".pdf")
os.Remove(crfile.Name() + ".aux")
os.Remove(crfile.Name() + ".log")
os.Remove(crfile.Name() + ".out")
os.Rename(crfile.Name()+".pdf", os.Getenv("PROJECT_NAME")+"-"+ver+".pdf")
}