#!/bin/bash # Coverage report generator for ptprnt # Usage: ./scripts/generate_coverage.sh [options] set -e SCRIPT_PATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" PROJECT_ROOT="${SCRIPT_PATH}/.." # Output paths HTML_COV_PATH="coverageReport/html" XML_COV_PATH="coverageReport/xml" TEXT_COV_PATH="coverageReport" HTML_START_FILE="index.html" # Color output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Default values - all formats enabled by default GENERATE_HTML=false GENERATE_XML=false GENERATE_TEXT=false BUILDDIR="builddir-debug" # Common gcovr options GCOVR_OPTS="--filter src --root ." print_usage() { echo "Usage: $0 [options]" echo "" echo "Coverage Report Generator - generates coverage reports from existing coverage data" echo "" echo "Prerequisites:" echo " Build with coverage enabled first:" echo " ./scripts/build.sh debug --coverage --test" echo "" echo "Format Options (if none specified, all formats are generated):" echo " --html Generate HTML coverage report" echo " --xml Generate XML coverage report (for CI/CD)" echo " --text Generate text coverage report (terminal output)" echo "" echo "Build Options:" echo " --builddir DIR Use custom build directory (default: builddir-debug)" echo "" echo "Other Options:" echo " -h, --help Show this help message" echo "" echo "Examples:" echo " $0 # Generate all formats (html, xml, text)" echo " $0 --html # Generate only HTML report" echo " $0 --html --text # Generate HTML and text reports" echo " $0 --xml # Generate XML for CI/CD" echo " $0 --builddir builddir # Use release build directory" } # Parse arguments # If no format arguments provided, enable all if [[ $# -eq 0 ]]; then GENERATE_HTML=true GENERATE_XML=true GENERATE_TEXT=true fi while [[ $# -gt 0 ]]; do case $1 in --html) GENERATE_HTML=true shift ;; --xml) GENERATE_XML=true shift ;; --text) GENERATE_TEXT=true shift ;; --builddir) BUILDDIR="$2" shift 2 ;; -h|--help) print_usage exit 0 ;; *) echo -e "${RED}Error: Unknown option: $1${NC}" print_usage exit 1 ;; esac done # Check if any format was selected when arguments were provided if [[ $GENERATE_HTML == false && $GENERATE_XML == false && $GENERATE_TEXT == false ]]; then echo -e "${RED}Error: No output format specified. Use --html, --xml, and/or --text${NC}" print_usage exit 1 fi cd "${PROJECT_ROOT}" # Check if build directory exists if [[ ! -d "${BUILDDIR}" ]]; then echo -e "${RED}Error: Build directory '${BUILDDIR}' does not exist${NC}" echo "" echo "Build with coverage enabled first:" echo " ./scripts/build.sh debug --coverage --test" exit 1 fi # Check if coverage data exists by looking for .gcda files if ! find "${BUILDDIR}" -name "*.gcda" -print -quit | grep -q .; then echo -e "${RED}Error: No coverage data found in '${BUILDDIR}'${NC}" echo "" echo "Make sure you built with coverage enabled and ran the tests:" echo " ./scripts/build.sh debug --coverage --test" exit 1 fi echo -e "${BLUE}Generating Coverage report for ptprnt${NC}" echo "Build directory: ${BUILDDIR}" echo "Formats: $(${GENERATE_HTML} && echo -n "html ")$(${GENERATE_XML} && echo -n "xml ")$(${GENERATE_TEXT} && echo -n "text")" echo "" # Check if gcovr is available if ! command -v gcovr &> /dev/null; then echo -e "${RED}Error: gcovr is not installed${NC}" exit 1 fi if [[ "${GENERATE_HTML}" == true ]]; then echo -e "${YELLOW}Generating HTML coverage report...${NC}" mkdir -p "${HTML_COV_PATH}" gcovr ${GCOVR_OPTS} \ --html --html-details --html-syntax-highlighting \ --output "${HTML_COV_PATH}/${HTML_START_FILE}" if [[ $? -eq 0 ]]; then echo -e "${GREEN}✓ HTML report generated${NC}" echo "" echo -e "${BLUE}To view HTML report, open:${NC}" echo " file://${SCRIPT_PATH}/../${HTML_COV_PATH}/${HTML_START_FILE}" else echo -e "${RED}✗ HTML report failed${NC}" fi fi if [[ "${GENERATE_XML}" == true ]]; then echo -e "${YELLOW}Generating XML coverage report...${NC}" mkdir -p "${XML_COV_PATH}" gcovr ${GCOVR_OPTS} \ --xml-pretty \ --output "${XML_COV_PATH}/cov.xml" if [[ $? -eq 0 ]]; then echo -e "${GREEN}✓ XML report generated${NC}" echo "" echo -e "${BLUE}To view XML report, open:${NC}" echo " file://${SCRIPT_PATH}/../${XML_COV_PATH}/cov.xml" else echo -e "${RED}✗ XML report failed${NC}" fi fi if [[ "${GENERATE_TEXT}" == true ]]; then echo -e "${YELLOW}Generating text coverage report...${NC}" mkdir -p "${TEXT_COV_PATH}" # Save to file gcovr ${GCOVR_OPTS} --output "${TEXT_COV_PATH}/coverage.txt" if [[ $? -eq 0 ]]; then echo -e "${GREEN}✓ Text report generated${NC}" echo "" echo -e "${BLUE}To view TXT report, open:${NC}" echo "file://${SCRIPT_PATH}/../${TEXT_COV_PATH}/coverage.txt" else echo -e "${RED}✗ Text report failed${NC}" fi fi # Clean up gcov files rm -f *.gcov 2>/dev/null # Summary echo "" echo -e "${GREEN}Coverage reports generated successfully!${NC}" echo ""