aboutsummaryrefslogtreecommitdiff
path: root/ci/common/submit_coverage.sh
diff options
context:
space:
mode:
Diffstat (limited to 'ci/common/submit_coverage.sh')
-rwxr-xr-xci/common/submit_coverage.sh41
1 files changed, 41 insertions, 0 deletions
diff --git a/ci/common/submit_coverage.sh b/ci/common/submit_coverage.sh
new file mode 100755
index 0000000000..7c343268d1
--- /dev/null
+++ b/ci/common/submit_coverage.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+# Collect and submit coverage reports.
+#
+# Args:
+# $1: Flag(s) for codecov, separated by comma.
+
+set -ex
+
+# Change to grandparent dir (POSIXly).
+CDPATH='' cd -P -- "$(dirname -- "$0")/../.." || exit
+
+echo "=== running submit_coverage in $PWD: $* ==="
+"$GCOV" --version
+
+# Download/install codecov-bash and gcovr once.
+codecov_sh="${TEMP:-/tmp}/codecov.bash"
+if ! [ -f "$codecov_sh" ]; then
+ curl --retry 5 --silent --fail -o "$codecov_sh" https://codecov.io/bash
+ chmod +x "$codecov_sh"
+
+ python3 -m pip install --quiet --user gcovr
+fi
+
+python3 -m gcovr --branches --exclude-unreachable-branches --print-summary -j 2 --exclude '.*/auto/.*' --root build --delete -o coverage.xml --xml
+
+# Upload to codecov.
+# -X gcov: disable gcov, done manually above.
+# -Z: exit non-zero on failure
+# -F: flag(s)
+# NOTE: ignoring flags for now, since this causes timeouts on codecov.io then,
+# which they know about for about a year already...
+# Flags must match pattern ^[\w\,]+$ ("," as separator).
+codecov_flags="$(uname -s),${1}"
+codecov_flags=$(echo "$codecov_flags" | sed 's/[^,_a-zA-Z0-9]/_/g')
+if ! "$codecov_sh" -f coverage.xml -X gcov -Z -F "${codecov_flags}"; then
+ echo "codecov upload failed."
+fi
+
+# Cleanup always, especially collected data.
+find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
+rm -f coverage.xml