diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index e7ca2eb..6594d22 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -36,8 +36,10 @@ jobs: echo "=== End dependency package version ===" - name: Build ptprnt debug run: scripts/build.sh debug --coverage --test + - name: Generate coverage + run: scripts/generate_coverage.sh --text - name: Coverage report - run: cat ./builddir-debug/meson-logs/coverage.txt + run: cat ./coverageReport/coverage.txt - name: build and release run: scripts/build.sh release - name: upload release binary @@ -50,5 +52,5 @@ jobs: uses: actions/upload-artifact@v3 with: name: coverage.txt - path: ./builddir/meson-logs/coverage.txt + path: ./coverageReport/coverage.txt if-no-files-found: error diff --git a/README.md b/README.md index 557464d..a95502a 100644 --- a/README.md +++ b/README.md @@ -234,15 +234,16 @@ ninja -C builddir test **Coverage reports:** ```bash -# Using build script -./scripts/build.sh debug --coverage -./scripts/generate_coverage.sh +# 1. Build with coverage enabled and run tests +./scripts/build.sh debug --coverage --test + +# 2. Generate coverage reports +./scripts/generate_coverage.sh # All formats (html, xml, text) +./scripts/generate_coverage.sh --html # HTML only +./scripts/generate_coverage.sh --text # Text only +./scripts/generate_coverage.sh --xml # XML only (for CI/CD) +./scripts/generate_coverage.sh --html --xml # HTML and XML -# Or manually -meson setup builddir -Db_coverage=true -ninja -C builddir -ninja -C builddir test -ninja -C builddir coverage-text ``` ## License diff --git a/scripts/generate_coverage.sh b/scripts/generate_coverage.sh index 9b4f4a7..c1fc9f6 100755 --- a/scripts/generate_coverage.sh +++ b/scripts/generate_coverage.sh @@ -1,29 +1,195 @@ #!/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" -echo "Generating Coverage report for ptprnt" +# Color output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color -cd $SCRIPT_PATH/.. +# Default values - all formats enabled by default +GENERATE_HTML=false +GENERATE_XML=false +GENERATE_TEXT=false +BUILDDIR="builddir-debug" -ninja -C builddir -ninja -C builddir test +# Common gcovr options +GCOVR_OPTS="--filter src --root ." -mkdir -p ${HTML_COV_PATH} -gcovr --html --html-details --html-syntax-highlighting --filter src --output ${HTML_COV_PATH}/${HTML_START_FILE} +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" +} -mkdir -p ${XML_COV_PATH} -gcovr --xml-pretty --filter src --output ${XML_COV_PATH}/cov.xml - -if [ $? ] -then - echo "Coverage report successful generated!" - echo "Open: file://${SCRIPT_PATH}/${HTML_COV_PATH}/${HTML_START_FILE}" -else - echo "Error generating coverage report!" +# Parse arguments +# If no format arguments provided, enable all +if [[ $# -eq 0 ]]; then + GENERATE_HTML=true + GENERATE_XML=true + GENERATE_TEXT=true fi -rm *.gcov \ No newline at end of file +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 ""