163 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"flag"
 | 
						|
	"log"
 | 
						|
	"os"
 | 
						|
	"os/exec"
 | 
						|
	"path"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
func init() {
 | 
						|
}
 | 
						|
 | 
						|
func main() {
 | 
						|
	setid := flag.Bool("setid", false, "Set the git user name and email to benchmark")
 | 
						|
	flag.Parse()
 | 
						|
 | 
						|
	log.Printf("Starting benchmarking...")
 | 
						|
 | 
						|
	if *setid {
 | 
						|
		setId()
 | 
						|
	}
 | 
						|
	head := getHeadHash()
 | 
						|
	log.Printf("HEAD at %s", head)
 | 
						|
 | 
						|
	err := os.MkdirAll("results", 0755)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Error creating results directory with %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	now := time.Now().Format(time.DateOnly)
 | 
						|
	resultFile := path.Join(".", "results", now+"_"+head+".txt")
 | 
						|
	log.Printf("Writing results to %s", resultFile)
 | 
						|
	outFile, err := os.Create(resultFile)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Error creating result file %s with %v", resultFile, err)
 | 
						|
	}
 | 
						|
 | 
						|
	cmd := exec.Command("go", "test", "-bench", ".", "./pdu")
 | 
						|
	cmd.Dir = "../"
 | 
						|
	cmd.Stdout = outFile
 | 
						|
 | 
						|
	log.Printf("Running benchmark...")
 | 
						|
	err = cmd.Run()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	log.Printf("Benchmarking done; writing results to git...")
 | 
						|
	log.Printf("Removing local benchmark branch")
 | 
						|
	removeLocalBenchmarkBranch()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Fetching benchmark branch")
 | 
						|
	fetchBenchmark()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Tracking benchmark branch")
 | 
						|
	trackBenchmark()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Checking out benchmark branch")
 | 
						|
	checkoutBenchmark()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Adding benchmark results")
 | 
						|
	addResults()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Committing benchmark results")
 | 
						|
	commitBenchmark()
 | 
						|
	time.Sleep(200 * time.Millisecond)
 | 
						|
	log.Printf("Pushing benchmark results")
 | 
						|
	pushBenchmark()
 | 
						|
	log.Printf("Done")
 | 
						|
}
 | 
						|
 | 
						|
func removeLocalBenchmarkBranch() {
 | 
						|
	gitBranch := exec.Command("git", "branch", "-D", "benchmark")
 | 
						|
	gitBranch.Dir = "../"
 | 
						|
	out, err := gitBranch.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Printf("Could not remove local benchmark branch with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func getHeadHash() string {
 | 
						|
	cmd := exec.Command("git", "rev-parse", "HEAD")
 | 
						|
	cmd.Dir = "../"
 | 
						|
	out, err := cmd.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not get HEAD with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
	return strings.TrimSpace(string(out))
 | 
						|
}
 | 
						|
 | 
						|
func fetchBenchmark() {
 | 
						|
	gitFetch := exec.Command("git", "fetch", "origin", "benchmark")
 | 
						|
	gitFetch.Dir = "../"
 | 
						|
	out, err := gitFetch.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not fetch benchmark branch with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func trackBenchmark() {
 | 
						|
	gitTrack := exec.Command("git", "branch", "--track", "benchmark", "origin/benchmark")
 | 
						|
	gitTrack.Dir = "../"
 | 
						|
	out, err := gitTrack.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not track benchmark branch with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func checkoutBenchmark() {
 | 
						|
	gitCheckout := exec.Command("git", "checkout", "benchmark")
 | 
						|
	gitCheckout.Dir = "../"
 | 
						|
	out, err := gitCheckout.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not checkout benchmark branch with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func setId() {
 | 
						|
	gitConfig := exec.Command("git", "config", "user.name", "benchmark")
 | 
						|
	gitConfig.Dir = "../"
 | 
						|
	out, err := gitConfig.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not set user name with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
 | 
						|
	gitConfig = exec.Command("git", "config", "user.email", "benchmark@smpptester")
 | 
						|
	gitConfig.Dir = "../"
 | 
						|
	out, err = gitConfig.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not set user email with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func addResults() {
 | 
						|
	gitAdd := exec.Command("git", "add", "benchmark/results")
 | 
						|
	gitAdd.Dir = "../"
 | 
						|
	out, err := gitAdd.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not add results with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func commitBenchmark() {
 | 
						|
	gitCommit := exec.Command("git", "commit", "-am", "Benchmark results")
 | 
						|
	gitCommit.Dir = "../"
 | 
						|
	out, err := gitCommit.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not commit benchmark results with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func pushBenchmark() {
 | 
						|
	gitPush := exec.Command("git", "push", "origin", "benchmark")
 | 
						|
	gitPush.Dir = "../"
 | 
						|
	out, err := gitPush.CombinedOutput()
 | 
						|
	if err != nil {
 | 
						|
		log.Fatalf("Could not push benchmark results with code %v and error %v", err, string(out))
 | 
						|
	}
 | 
						|
}
 |