#!/bin/bash ############################################################################### # Copyright 2017 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ################################################################################ # # Usage # # COVERAGE_CPUS=32 tools/coverage.sh [/path/to/report-directory/] [targets] # # COVERAGE_CPUS defaults to 2, and the default destination is a temp # dir. set -eu genhtml=$(command -v genhtml) if [[ -z "${genhtml}" ]]; then echo "Install 'genhtml' (contained in the 'lcov' package)" exit 1 fi destdir="$1" if [[ -z "${destdir}" ]]; then destdir=$(mktemp -d /tmp/gerritcov.XXXXXX) fi targets="$2" if [[ -z "${targets}" ]]; then targets="apps/... java/..." fi echo "Running 'bazel coverage'; this may take a while" # coverage is expensive to run; use --jobs=2 to avoid overloading the # machine. bazel coverage -k --jobs="${COVERAGE_CPUS:-2}" -- "$targets" # The coverage data contains filenames relative to the Java root, and # genhtml has no logic to search these elsewhere. Workaround this # limitation by running genhtml in a directory with the files in the # right place. Also -inexplicably- genhtml wants to have the source # files relative to the output directory. rm -rf "${destdir}" || true mkdir -p "${destdir}" for ROOT in java apps/paymentmethodtoken; do rsync -a "${ROOT}/src/main/java/" "${ROOT}/src/test/java/" "${destdir}/" done base=$(bazel info bazel-testlogs) find "${base}" -name 'coverage.dat' -exec sh -c ' for ff do f=$(printf '%s' "${ff#"$base"/}" | sed "s|/|_|g") cp "$ff" "${destdir}/$f" done ' find-sh {} + cd "${destdir}" find -name '*coverage.dat' -size 0 -exec rm -f {} + genhtml -o . --ignore-errors source ./*coverage.dat printf "coverage report at file://%s/index.html" "${destdir}"