#!/bin/bash set -e ORIGWD="$(pwd)" SRCDIR="$(cd $(dirname -- ${0%/*}) && pwd)" JOBS="${JOBS:-4}" WORKDIR="${WORKDIR:-$ORIGWD/workdir}" MAKE="${MAKE:-make -j$JOBS}" echo "Switching into ${WORKDIR}..." >&2 mkdir -vp "$WORKDIR" cd "$WORKDIR" # get node core repo + coverage tools via git if [ ! -d node ]; then git clone --depth=10 --single-branch git://github.com/nodejs/node.git else # reset everything to the current master (cd node && \ git fetch origin && \ git checkout -- . && git clean -fd . && \ git reset --hard origin/master) fi if [ ! -d gcovr ]; then git clone --depth=10 --single-branch git://github.com/gcovr/gcovr.git (cd gcovr && patch -p1 < "${SRCDIR}/gcovr-patches.diff") fi # first, a semi-normal build without lib/ coverage cd node echo "Now in $(pwd)" >&2 # patch things up patch -p1 < "${SRCDIR}/patches.diff" export PATH="$(pwd):$PATH" # if we don't have our npm dependencies available, build node and fetch them # with npm if [ ! -x "$SRCDIR/node_modules/.bin/nyc" ] || \ [ ! -x "$SRCDIR/node_modules/.bin/istanbul-merge" ]; then echo "Building, without lib/ coverage..." >&2 ./configure $MAKE ./node -v cd "$SRCDIR" # get nyc + istanbul-merge "$WORKDIR/node/node" "$WORKDIR/node/deps/npm" install test -x "$SRCDIR/node_modules/.bin/nyc" test -x "$SRCDIR/node_modules/.bin/istanbul-merge" fi cd "$WORKDIR/node" echo "Instrumenting code in lib/..." >&2 "$SRCDIR/node_modules/.bin/nyc" instrument lib/ lib_/ sed -e s~"'"lib/~"'"lib_/~g -i~ node.gyp echo "Removing old coverage files" >&2 rm -rf out/Release/.coverage rm -f out/Release/obj.target/node/src/*.gcda echo "Building, with lib/ coverage..." >&2 ./configure $MAKE echo "Testing..." >&2 ./node -v # This corresponds to `make test` up to removal of `test/message`. $MAKE build-addons cctest python tools/test.py --mode=release -J \ addons doctool known_issues pseudo-tty parallel sequential echo "Gathering coverage..." >&2 mkdir -p coverage .cov_tmp "$SRCDIR/node_modules/.bin/istanbul-merge" --out .cov_tmp/libcov.json \ 'out/Release/.coverage/coverage-*.json' (cd lib && "$SRCDIR/node_modules/.bin/nyc" report \ --temp-directory "$(pwd)/../.cov_tmp" -r html --report-dir "../coverage") (cd out && "$WORKDIR/gcovr/scripts/gcovr" --gcov-exclude='.*deps' --gcov-exclude='.*usr' -v \ -r Release/obj.target/node --html --html-detail \ -o ../coverage/cxxcoverage.html) OUTDIR="$ORIGWD/out" COMMIT_ID=$(git rev-parse --short=16 HEAD) mkdir -p "$OUTDIR" cp -rv coverage "$OUTDIR/coverage-$COMMIT_ID" JSCOVERAGE=$(grep -B1 Lines coverage/index.html | \ head -n1 | grep -o '[0-9\.]*') CXXCOVERAGE=$(grep -A3 Lines coverage/cxxcoverage.html | \ grep style | grep -o '[0-9]\{1,3\}\.[0-9]\{1,2\}') echo "JS Coverage: $JSCOVERAGE %" echo "C++ Coverage: $CXXCOVERAGE %" NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ") echo "$JSCOVERAGE,$CXXCOVERAGE,$NOW,$COMMIT_ID" >> "$OUTDIR/index.csv" cd "$ORIGWD"