blob: 3582d22cf3d6676d2928f192457e081261346231 [file] [log] [blame]
#!/bin/bash
#
# Usage
#
# COVERAGE_CPUS=32 tools/coverage.sh [/path/to/report-directory/]
#
# COVERAGE_CPUS defaults to 2, and the default destination is a temp
# dir.
genhtml=$(which 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
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} -- ...
# 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.
mkdir -p ${destdir}/java
cp -r {java,javatests}/* ${destdir}/java
mkdir -p ${destdir}/plugins
for plugin in `find plugins/ -mindepth 1 -maxdepth 1 -type d`
do
mkdir -p ${destdir}/${plugin}/java
if [ -e ${plugin}/java/ ]
then cp -r ${plugin}/java/* ${destdir}/${plugin}/java
fi
if [ -e ${plugin}/javatests/ ]
then cp -r ${plugin}/javatests/* ${destdir}/${plugin}/java
fi
# for backwards compatibility support plugins with old file structure
mkdir -p ${destdir}/${plugin}/src/{main,test}/java
if [ -e ${plugin}/src/main/java/ ]
then cp -r ${plugin}/src/main/java/* ${destdir}/${plugin}/src/main/java/
fi
if [ -e ${plugin}/src/test/java/ ]
then cp -r ${plugin}/src/test/java/* ${destdir}/${plugin}/src/test/java/
fi
done
base=$(bazel info bazel-testlogs)
for f in $(find ${base} -name 'coverage.dat') ; do
cp $f ${destdir}/$(echo $f| sed "s|${base}/||" | sed "s|/|_|g")
done
cd ${destdir}
find -name '*coverage.dat' -size 0 -delete
genhtml -o . --ignore-errors source *coverage.dat
echo "coverage report at file://${destdir}/index.html"