Skip to content

Commit e7da399

Browse files
Copilotedburns
andauthored
Add separate generated and handwritten coverage badges
Co-authored-by: edburns <75821+edburns@users.noreply.github.com>
1 parent 69b8233 commit e7da399

6 files changed

Lines changed: 153 additions & 38 deletions

File tree

.github/actions/test-report/action.yml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ inputs:
99
description: "Path to the JaCoCo XML report"
1010
required: false
1111
default: "target/site/jacoco-coverage/jacoco.xml"
12+
jacoco-csv-path:
13+
description: "Path to the JaCoCo CSV report"
14+
required: false
15+
default: "target/site/jacoco-coverage/jacoco.csv"
1216
check-name:
1317
description: "Name for the check run"
1418
required: false
@@ -80,6 +84,7 @@ runs:
8084
shell: bash
8185
run: |
8286
JACOCO_XML="${{ inputs.jacoco-path }}"
87+
JACOCO_CSV="${{ inputs.jacoco-csv-path }}"
8388
8489
if [ -f "$JACOCO_XML" ]; then
8590
echo "" >> $GITHUB_STEP_SUMMARY
@@ -139,6 +144,36 @@ runs:
139144
echo "| 📏 Lines | ${LINE_COVERED:-0} | ${LINE_MISSED:-0} | ${LINE_PCT}% |" >> $GITHUB_STEP_SUMMARY
140145
echo "| 🔧 Methods | ${METHOD_COVERED:-0} | ${METHOD_MISSED:-0} | ${METHOD_PCT}% |" >> $GITHUB_STEP_SUMMARY
141146
echo "| 📦 Classes | ${CLASS_COVERED:-0} | ${CLASS_MISSED:-0} | ${CLASS_PCT}% |" >> $GITHUB_STEP_SUMMARY
147+
148+
if [ -f "$JACOCO_CSV" ]; then
149+
extract_instruction_scope() {
150+
local scope=$1
151+
awk -F',' -v scope="$scope" -v generated_prefix="com.github.copilot.sdk.generated" '
152+
NR > 1 {
153+
is_generated = index($2, generated_prefix) == 1
154+
if ((scope == "generated" && is_generated) ||
155+
(scope == "handwritten" && !is_generated)) {
156+
missed += $4
157+
covered += $5
158+
}
159+
}
160+
END { print covered + 0 "," missed + 0 }
161+
' "$JACOCO_CSV"
162+
}
163+
164+
IFS=, read -r HANDWRITTEN_COVERED HANDWRITTEN_MISSED <<< "$(extract_instruction_scope handwritten)"
165+
IFS=, read -r GENERATED_COVERED GENERATED_MISSED <<< "$(extract_instruction_scope generated)"
166+
HANDWRITTEN_PCT=$(calc_pct "${HANDWRITTEN_COVERED:-0}" "${HANDWRITTEN_MISSED:-0}")
167+
GENERATED_PCT=$(calc_pct "${GENERATED_COVERED:-0}" "${GENERATED_MISSED:-0}")
168+
169+
echo "" >> $GITHUB_STEP_SUMMARY
170+
echo "### Coverage by Code Origin (Instructions)" >> $GITHUB_STEP_SUMMARY
171+
echo "" >> $GITHUB_STEP_SUMMARY
172+
echo "| Origin | Covered | Missed | Coverage |" >> $GITHUB_STEP_SUMMARY
173+
echo "|--------|---------|--------|----------|" >> $GITHUB_STEP_SUMMARY
174+
echo "| ✍️ Handwritten | ${HANDWRITTEN_COVERED:-0} | ${HANDWRITTEN_MISSED:-0} | ${HANDWRITTEN_PCT}% |" >> $GITHUB_STEP_SUMMARY
175+
echo "| 🤖 Generated | ${GENERATED_COVERED:-0} | ${GENERATED_MISSED:-0} | ${GENERATED_PCT}% |" >> $GITHUB_STEP_SUMMARY
176+
fi
142177
else
143178
echo "" >> $GITHUB_STEP_SUMMARY
144179
echo "## 📊 Code Coverage" >> $GITHUB_STEP_SUMMARY
Lines changed: 18 additions & 0 deletions
Loading
Lines changed: 18 additions & 0 deletions
Loading

.github/badges/jacoco.svg

Lines changed: 9 additions & 9 deletions
Loading
Lines changed: 71 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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

99
CSV="${1:-target/site/jacoco-coverage/jacoco.csv}"
1010
BADGES_DIR="${2:-.github/badges}"
11+
GENERATED_PREFIX="com.github.copilot.sdk.generated"
1112

1213
if [ ! -f "$CSV" ]; then
1314
echo "⚠️ No JaCoCo CSV report found at $CSV"
1415
exit 0
1516
fi
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>
6287
EOF
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}"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
[![Build](https://github.com/github/copilot-sdk-java/actions/workflows/build-test.yml/badge.svg)](https://github.com/github/copilot-sdk-java/actions/workflows/build-test.yml)
44
[![Site](https://github.com/github/copilot-sdk-java/actions/workflows/deploy-site.yml/badge.svg)](https://github.com/github/copilot-sdk-java/actions/workflows/deploy-site.yml)
5-
[![Coverage](.github/badges/jacoco.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
5+
[![Handwritten Coverage](.github/badges/jacoco-handwritten.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
6+
[![Generated Coverage](.github/badges/jacoco-generated.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
67
[![Documentation](https://img.shields.io/badge/docs-online-brightgreen)](https://github.github.io/copilot-sdk-java/)
78
[![Java 17+](https://img.shields.io/badge/Java-17%2B-blue?logo=openjdk&logoColor=white)](https://openjdk.org/)
89
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -212,4 +213,3 @@ MIT — see [LICENSE](LICENSE) for details.
212213
[![Star History Chart](https://api.star-history.com/svg?repos=github/copilot-sdk-java&type=Date)](https://www.star-history.com/#github/copilot-sdk-java&Date)
213214

214215
⭐ Drop a star if you find this useful!
215-

0 commit comments

Comments
 (0)