#!/usr/bin/env bash stderr() { echo "$@" 1>&2 } usage() { b=$(basename "$0") echo $b: ERROR: "$@" 1>&2 cat 1>&2 < "${target_out}" cover "HEAD" > "${head_out}" cat "${target_out}" cat "${head_out}" echo "" target_pct="$(cat ${target_out} |sed -E 's/.*total.*\t([0-9.]+)%/\1/;t;d')" head_pct="$(cat ${head_out} |sed -E 's/.*total.*\t([0-9.]+)%/\1/;t;d')" echo "Results: ${target} ${target_pct}% HEAD ${head_pct}%" delta_pct=$(echo "$head_pct - $target_pct" | bc -l) echo "Delta: ${delta_pct}" if [[ $delta_pct = \-* ]]; then echo "Regression!"; return 1 fi return 0 ;; esac cover "${1-HEAD}" } bench() { branch="${1}" out="${2}" dir="$(mktemp -d)" stderr "Executing benchmark for ${branch} at ${dir}" if [ "${branch}" = "HEAD" ]; then cp -r . "${dir}/" else git worktree add "$dir" "$branch" fi pushd "$dir" go test -bench=. -count=10 ./... | tee "${out}" popd if [ "${branch}" != "HEAD" ]; then git worktree remove --force "$dir" fi } benchmark() { case "$1" in -d) shift target="${1?Need to provide a target branch argument}" old=`mktemp` bench "${target}" "${old}" new=`mktemp` bench HEAD "${new}" benchstat "${old}" "${new}" return 0 ;; esac bench "${1-HEAD}" `mktemp` } case "$1" in coverage) shift; coverage $@;; benchmark) shift; benchmark $@;; *) usage "bad argument $1";; esac