#!/bin/bash
# Generate test coverage statistics for Go packages.
#
# Works around the fact that `go test -coverprofile` does not work
# with multiple packages, see https://code.google.com/p/go/issues/detail?id=6909
#
# Usage: script/coverage [--html]
#
#     --html        Create HTML report and open it in browser
#

set -e

workdir=.cover
profile="$workdir/cover.out"
mode=atomic

# list any files (or patterns) to explicitly exclude from coverage
# you should have a pretty good reason before putting items here
exclude_files=(
 "wwhrd.go"
)

join() { local IFS="$1"; shift; echo "$*"; }

excludes=$(join "|" "${exclude_files[@]}" | sed -e 's/\./\\./g')

generate_cover_data() {
    rm -rf "$workdir"
    mkdir "$workdir"

    for pkg in "$@"; do
        f="$workdir"/"$(echo "$pkg" | tr / -)".cover
        go test -mod=vendor -race -v -covermode="$mode" -coverprofile="$f" "$pkg"
    done

    echo "mode: $mode" >"$profile"
    grep -h -v "^mode:" "$workdir"/*.cover | grep -E -v "$excludes" >>"$profile"
}

show_cover_report() {
    go tool cover -"${1}"="$profile"
}

generate_cover_data "$(go list -mod=vendor ./... | grep -v /vendor/)"
show_cover_report func
case "$1" in
"")
    ;;
--html)
    show_cover_report html ;;
*)
    echo >&2 "error: invalid option: $1"; exit 1 ;;
esac
