11#! /usr/bin/env bash
2- # Generates an SVG coverage badge from a JaCoCo CSV report.
2+ # Generates SVG coverage badges from a JaCoCo CSV report.
33#
44# Usage: generate-coverage-badge.sh [jacoco.csv] [output-dir]
55# jacoco.csv - Path to JaCoCo CSV report (default: target/site/jacoco-coverage/jacoco.csv)
@@ -8,39 +8,64 @@ set -euo pipefail
88
99CSV=" ${1:- target/ site/ jacoco-coverage/ jacoco.csv} "
1010BADGES_DIR=" ${2:- .github/ badges} "
11+ GENERATED_PREFIX=" com.github.copilot.sdk.generated"
1112
1213if [ ! -f " $CSV " ]; then
1314 echo " ⚠️ No JaCoCo CSV report found at $CSV "
1415 exit 0
1516fi
1617
17- # Sum INSTRUCTION_MISSED and INSTRUCTION_COVERED across all rows (skip header)
18- read -r missed covered <<< " $(awk -F',' 'NR>1 { m+=$4; c+=$5 } END { print m, c }' " $CSV " )"
19- total=$(( missed + covered))
20- if [ " $total " -eq 0 ]; then
21- pct=" 0"
22- else
23- pct=$( awk " BEGIN { printf \" %.1f\" , ($covered / $total ) * 100 }" )
24- # Drop trailing .0
25- pct=$( echo " $pct " | sed ' s/\.0$//' )
26- fi
27- echo " Coverage: ${pct} %"
18+ calc_totals () {
19+ local scope=$1
20+ awk -F' ,' -v scope=" $scope " -v generated_prefix=" $GENERATED_PREFIX " '
21+ NR > 1 {
22+ is_generated = index($2, generated_prefix) == 1
23+ if (scope == "overall" ||
24+ (scope == "generated" && is_generated) ||
25+ (scope == "handwritten" && !is_generated)) {
26+ missed += $4
27+ covered += $5
28+ }
29+ }
30+ END { print missed + 0, covered + 0 }
31+ ' " $CSV "
32+ }
2833
29- # Choose badge color based on coverage
30- color=" #e05d44" # red <60
31- if awk " BEGIN{exit!($pct >=100)}" ; then color=" #4c1" # bright green
32- elif awk " BEGIN{exit!($pct >=90)}" ; then color=" #97ca00" # green
33- elif awk " BEGIN{exit!($pct >=80)}" ; then color=" #a4a61d" # yellow-green
34- elif awk " BEGIN{exit!($pct >=70)}" ; then color=" #dfb317" # yellow
35- elif awk " BEGIN{exit!($pct >=60)}" ; then color=" #fe7d37" # orange
36- fi
34+ format_pct () {
35+ local missed=$1
36+ local covered=$2
37+ local total=$(( missed + covered))
38+ if [ " $total " -eq 0 ]; then
39+ echo " 0"
40+ else
41+ awk " BEGIN { printf \" %.1f\" , ($covered / $total ) * 100 }" | sed ' s/\.0$//'
42+ fi
43+ }
3744
38- # Generate SVG badge
39- mkdir -p " $BADGES_DIR "
40- label=" coverage"
41- value=" ${pct} %"
42- lw=62; vw=46; tw=$(( lw + vw))
43- cat > " ${BADGES_DIR} /jacoco.svg" << EOF
45+ pick_color () {
46+ local pct=$1
47+ local color=" #e05d44" # red <60
48+ if awk " BEGIN{exit!($pct >=100)}" ; then color=" #4c1" # bright green
49+ elif awk " BEGIN{exit!($pct >=90)}" ; then color=" #97ca00" # green
50+ elif awk " BEGIN{exit!($pct >=80)}" ; then color=" #a4a61d" # yellow-green
51+ elif awk " BEGIN{exit!($pct >=70)}" ; then color=" #dfb317" # yellow
52+ elif awk " BEGIN{exit!($pct >=60)}" ; then color=" #fe7d37" # orange
53+ fi
54+ echo " $color "
55+ }
56+
57+ generate_badge () {
58+ local label=$1
59+ local value=$2
60+ local output=$3
61+ local pct=${value% \% }
62+ local color
63+ color=$( pick_color " $pct " )
64+ local lw=$(( ${# label} * 7 + 12 ))
65+ local vw=$(( ${# value} * 7 + 16 ))
66+ local tw=$(( lw + vw))
67+
68+ cat > " $output " << EOF
4469<svg xmlns="http://www.w3.org/2000/svg" width="${tw} " height="20">
4570 <linearGradient id="b" x2="0" y2="100%">
4671 <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
@@ -60,5 +85,24 @@ cat > "${BADGES_DIR}/jacoco.svg" <<EOF
6085 </g>
6186</svg>
6287EOF
88+ }
89+
90+ mkdir -p " $BADGES_DIR "
91+
92+ read -r overall_missed overall_covered <<< " $(calc_totals overall)"
93+ read -r handwritten_missed handwritten_covered <<< " $(calc_totals handwritten)"
94+ read -r generated_missed generated_covered <<< " $(calc_totals generated)"
95+
96+ overall_pct=$( format_pct " $overall_missed " " $overall_covered " )
97+ handwritten_pct=$( format_pct " $handwritten_missed " " $handwritten_covered " )
98+ generated_pct=$( format_pct " $generated_missed " " $generated_covered " )
99+
100+ echo " Overall coverage: ${overall_pct} %"
101+ echo " Handwritten coverage: ${handwritten_pct} %"
102+ echo " Generated coverage: ${generated_pct} %"
103+
104+ generate_badge " coverage" " ${overall_pct} %" " ${BADGES_DIR} /jacoco.svg"
105+ generate_badge " coverage handwritten" " ${handwritten_pct} %" " ${BADGES_DIR} /jacoco-handwritten.svg"
106+ generate_badge " coverage generated" " ${generated_pct} %" " ${BADGES_DIR} /jacoco-generated.svg"
63107
64- echo " Badge generated at ${BADGES_DIR} /jacoco.svg "
108+ echo " Badges generated in ${BADGES_DIR} "
0 commit comments