Implementation of /badge/commit/<commit>.
							parent
							
								
									63a1cad8d4
								
							
						
					
					
						commit
						99695a4c4d
					
				@ -0,0 +1,57 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"text/template"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var baseTemplate *template.Template
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	baseTemplate = template.New("svgTemplate")
 | 
			
		||||
	baseTemplate, _ = baseTemplate.Parse(svgTemplate)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BadgeFromCommit(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	fmt.Println(mux.Vars(r))
 | 
			
		||||
	commitID := mux.Vars(r)["commit"]
 | 
			
		||||
	result, _ := db.Query("SELECT percentage FROM badge WHERE commit_hash=?", commitID)
 | 
			
		||||
	defer result.Close()
 | 
			
		||||
 | 
			
		||||
	w.Header().Set("Content-Type", "image/svg+xml")
 | 
			
		||||
 | 
			
		||||
	if !result.Next() {
 | 
			
		||||
		http.Error(w, "Request commit hash has no corresponding badge", 400)
 | 
			
		||||
		//TODO send unknown svg instead
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var percentage float64
 | 
			
		||||
	result.Scan(&percentage)
 | 
			
		||||
 | 
			
		||||
	fillColour := percentageToRGB(percentage)
 | 
			
		||||
 | 
			
		||||
	template.New("svgConv")
 | 
			
		||||
	pill := CoveragePill{
 | 
			
		||||
		toOneDecimal(percentage * 100),
 | 
			
		||||
		baseColour,
 | 
			
		||||
		fillColour,
 | 
			
		||||
	}
 | 
			
		||||
	baseTemplate.Execute(w, pill)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BadgeFromProject(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	projectName := mux.Vars(r)["project"]
 | 
			
		||||
	tagName := mux.Vars(r)["tag"]
 | 
			
		||||
 | 
			
		||||
	result, _ := db.Query("SELECT commit_hash FROM alias WHERE project_name=? AND project_tag=?", projectName, tagName)
 | 
			
		||||
	defer result.Close()
 | 
			
		||||
 | 
			
		||||
	var commit_hash string
 | 
			
		||||
	result.Scan(&commit_hash)
 | 
			
		||||
	fmt.Println(commit_hash)
 | 
			
		||||
	mux.Vars(r)["commit"] = commit_hash
 | 
			
		||||
	BadgeFromCommit(w, r)
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,22 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	_ "github.com/mattn/go-sqlite3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var db *sql.DB
 | 
			
		||||
var alreadyUsingMemory bool
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	openDatabase("./database.sqlite")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func openDatabase(fileLocation string) {
 | 
			
		||||
	db, _ = sql.Open("sqlite3", fileLocation)
 | 
			
		||||
	db.SetMaxOpenConns(1)
 | 
			
		||||
 | 
			
		||||
	// Initializes the tables
 | 
			
		||||
	db.Exec(`CREATE TABLE IF NOT EXISTS badge (commit_hash VARCHAR(32) NOT NULL UNIQUE PRIMARY KEY, percentage FLOAT NOT NULL)`)
 | 
			
		||||
	db.Exec(`CREATE TABLE IF NOT EXISTS alias (commit_hash VARCHAR(32) NOT NULL UNIQUE PRIMARY KEY, project_name TEXT NOT NULL, project_tag TEXT NOT NULL)`)
 | 
			
		||||
}
 | 
			
		||||
											
												Binary file not shown.
											
										
									
								@ -1,69 +1,36 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	baseColour         = "#555"
 | 
			
		||||
	modifier   float64 = 0.2
 | 
			
		||||
	maxValue           = 220
 | 
			
		||||
	blue               = 55
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	//_ := template.New("svgConv")
 | 
			
		||||
 | 
			
		||||
	//percentage := 0.999
 | 
			
		||||
	//fill := percentageToRGB(percentage)
 | 
			
		||||
 | 
			
		||||
	//_ := CoveragePill{
 | 
			
		||||
	//	fmt.Sprintf("%.1f", toFixed(percentage, 3)*100),
 | 
			
		||||
	//	baseColour,
 | 
			
		||||
	//	fill,
 | 
			
		||||
	//}
 | 
			
		||||
 | 
			
		||||
	r := mux.NewRouter()
 | 
			
		||||
	r.HandleFunc("/upload/go", upload)
 | 
			
		||||
	r.HandleFunc("/upload/go", uploadGo)
 | 
			
		||||
	r.HandleFunc("/badge/commit/{commit}.svg", BadgeFromCommit)
 | 
			
		||||
	r.HandleFunc("/badge/{project}/{tag}.svg", BadgeFromProject)
 | 
			
		||||
	_ = http.ListenAndServe(":8080", r)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func upload(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if r.Method != "POST" {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := r.ParseForm()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "Request parameters not parsed", 500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = r.ParseMultipartForm(5 << 20)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "Request parameters not parsed", 500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	form := r.Form
 | 
			
		||||
 | 
			
		||||
	project := form.Get("project")
 | 
			
		||||
	tag := form.Get("tag")
 | 
			
		||||
	id := form.Get("id")
 | 
			
		||||
	file, _, err := r.FormFile("file")
 | 
			
		||||
	b, _ := ioutil.ReadAll(file)
 | 
			
		||||
	n := bytes.Index(b, []byte{0})
 | 
			
		||||
	content := string(b[n])
 | 
			
		||||
func parseCoverage(content string) float64 {
 | 
			
		||||
	var totalStatements = 0
 | 
			
		||||
	var totalRun = 0
 | 
			
		||||
 | 
			
		||||
	fmt.Print(content)
 | 
			
		||||
	lines := strings.Split(content, "\n")
 | 
			
		||||
	for _, line := range lines[1 : len(lines)-1] { // Skip first line (which is not relevant)
 | 
			
		||||
		sl := strings.Split(line, " ")
 | 
			
		||||
		statements, _ := strconv.Atoi(sl[len(sl)-2])
 | 
			
		||||
		runCount, _ := strconv.Atoi(sl[len(sl)-1])
 | 
			
		||||
 | 
			
		||||
	if project == "" || tag == "" || id == "" {
 | 
			
		||||
		http.Error(w, "Request parameters [secret, project, tag, id] not found", 400)
 | 
			
		||||
		return
 | 
			
		||||
		totalStatements += statements
 | 
			
		||||
		if runCount != 0 {
 | 
			
		||||
			totalRun += statements
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, _ = fmt.Fprintf(w, "project: '%s'\ntag: '%s'\nid: '%s'\n", project, tag, id)
 | 
			
		||||
	fmt.Printf("DEBUG :: TotalStatements: %d, TotalRunCount: %d\n", totalStatements, totalRun)
 | 
			
		||||
	return float64(totalRun) / float64(totalStatements)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,45 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func uploadGo(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	if r.Method != "POST" {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err := r.ParseForm()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "Request parameters not parsed", 500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	err = r.ParseMultipartForm(5 << 20)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "Request parameters not parsed", 500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	project := r.Form.Get("project")
 | 
			
		||||
	tag := r.Form.Get("tag")
 | 
			
		||||
	id := r.Form.Get("id")
 | 
			
		||||
 | 
			
		||||
	if project == "" || tag == "" || id == "" {
 | 
			
		||||
		http.Error(w, "Request parameters [secret, project, tag, id] not found", 400)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	file, _, err := r.FormFile("file")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		http.Error(w, "Request parameter file not found", 400)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	b, _ := ioutil.ReadAll(file)
 | 
			
		||||
	coverage := parseCoverage(string(b))
 | 
			
		||||
 | 
			
		||||
	db.Exec("INSERT INTO badge (commit_hash, percentage) VALUES (?, ?)", id, coverage)
 | 
			
		||||
	db.Exec("INSERT INTO alias (commit_hash, project_name, project_tag) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE commit=?", id, project, tag, id)
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json")
 | 
			
		||||
	fmt.Fprintf(w, `{"success": "true", "coverage": `+toOneDecimal(coverage*100)+`}`)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue