Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .github/actions/test-report/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ inputs:
description: "Path to the JaCoCo XML report"
required: false
default: "target/site/jacoco-coverage/jacoco.xml"
jacoco-csv-path:
description: "Path to the JaCoCo CSV report"
required: false
default: "target/site/jacoco-coverage/jacoco.csv"
check-name:
description: "Name for the check run"
required: false
Expand Down Expand Up @@ -80,6 +84,7 @@ runs:
shell: bash
run: |
JACOCO_XML="${{ inputs.jacoco-path }}"
JACOCO_CSV="${{ inputs.jacoco-csv-path }}"

if [ -f "$JACOCO_XML" ]; then
echo "" >> $GITHUB_STEP_SUMMARY
Expand Down Expand Up @@ -139,6 +144,36 @@ runs:
echo "| 📏 Lines | ${LINE_COVERED:-0} | ${LINE_MISSED:-0} | ${LINE_PCT}% |" >> $GITHUB_STEP_SUMMARY
echo "| 🔧 Methods | ${METHOD_COVERED:-0} | ${METHOD_MISSED:-0} | ${METHOD_PCT}% |" >> $GITHUB_STEP_SUMMARY
echo "| 📦 Classes | ${CLASS_COVERED:-0} | ${CLASS_MISSED:-0} | ${CLASS_PCT}% |" >> $GITHUB_STEP_SUMMARY

if [ -f "$JACOCO_CSV" ]; then
extract_instruction_scope() {
local scope=$1
awk -F',' -v scope="$scope" -v generated_prefix="com.github.copilot.sdk.generated" '
NR > 1 {
is_generated = index($2, generated_prefix) == 1
if ((scope == "generated" && is_generated) ||
(scope == "handwritten" && !is_generated)) {
missed += $4
covered += $5
}
}
END { print covered + 0 "," missed + 0 }
' "$JACOCO_CSV"
}

IFS=, read -r HANDWRITTEN_COVERED HANDWRITTEN_MISSED <<< "$(extract_instruction_scope handwritten)"
IFS=, read -r GENERATED_COVERED GENERATED_MISSED <<< "$(extract_instruction_scope generated)"
HANDWRITTEN_PCT=$(calc_pct "${HANDWRITTEN_COVERED:-0}" "${HANDWRITTEN_MISSED:-0}")
GENERATED_PCT=$(calc_pct "${GENERATED_COVERED:-0}" "${GENERATED_MISSED:-0}")

echo "" >> $GITHUB_STEP_SUMMARY
echo "### Coverage by Code Origin (Instructions)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Origin | Covered | Missed | Coverage |" >> $GITHUB_STEP_SUMMARY
echo "|--------|---------|--------|----------|" >> $GITHUB_STEP_SUMMARY
echo "| ✍️ Handwritten | ${HANDWRITTEN_COVERED:-0} | ${HANDWRITTEN_MISSED:-0} | ${HANDWRITTEN_PCT}% |" >> $GITHUB_STEP_SUMMARY
echo "| 🤖 Generated | ${GENERATED_COVERED:-0} | ${GENERATED_MISSED:-0} | ${GENERATED_PCT}% |" >> $GITHUB_STEP_SUMMARY
fi
else
echo "" >> $GITHUB_STEP_SUMMARY
echo "## 📊 Code Coverage" >> $GITHUB_STEP_SUMMARY
Expand Down
18 changes: 18 additions & 0 deletions .github/badges/jacoco-generated.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions .github/badges/jacoco-handwritten.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 9 additions & 9 deletions .github/badges/jacoco.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
98 changes: 71 additions & 27 deletions .github/scripts/generate-coverage-badge.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Generates an SVG coverage badge from a JaCoCo CSV report.
# Generates SVG coverage badges from a JaCoCo CSV report.
#
# Usage: generate-coverage-badge.sh [jacoco.csv] [output-dir]
# jacoco.csv - Path to JaCoCo CSV report (default: target/site/jacoco-coverage/jacoco.csv)
Expand All @@ -8,39 +8,64 @@ set -euo pipefail

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

if [ ! -f "$CSV" ]; then
echo "⚠️ No JaCoCo CSV report found at $CSV"
exit 0
fi

# Sum INSTRUCTION_MISSED and INSTRUCTION_COVERED across all rows (skip header)
read -r missed covered <<< "$(awk -F',' 'NR>1 { m+=$4; c+=$5 } END { print m, c }' "$CSV")"
total=$((missed + covered))
if [ "$total" -eq 0 ]; then
pct="0"
else
pct=$(awk "BEGIN { printf \"%.1f\", ($covered / $total) * 100 }")
# Drop trailing .0
pct=$(echo "$pct" | sed 's/\.0$//')
fi
echo "Coverage: ${pct}%"
calc_totals() {
local scope=$1
awk -F',' -v scope="$scope" -v generated_prefix="$GENERATED_PREFIX" '
NR > 1 {
is_generated = index($2, generated_prefix) == 1
if (scope == "overall" ||
(scope == "generated" && is_generated) ||
(scope == "handwritten" && !is_generated)) {
missed += $4
covered += $5
}
}
END { print missed + 0, covered + 0 }
' "$CSV"
}

# Choose badge color based on coverage
color="#e05d44" # red <60
if awk "BEGIN{exit!($pct>=100)}"; then color="#4c1" # bright green
elif awk "BEGIN{exit!($pct>=90)}"; then color="#97ca00" # green
elif awk "BEGIN{exit!($pct>=80)}"; then color="#a4a61d" # yellow-green
elif awk "BEGIN{exit!($pct>=70)}"; then color="#dfb317" # yellow
elif awk "BEGIN{exit!($pct>=60)}"; then color="#fe7d37" # orange
fi
format_pct() {
local missed=$1
local covered=$2
local total=$((missed + covered))
if [ "$total" -eq 0 ]; then
echo "0"
else
awk "BEGIN { printf \"%.1f\", ($covered / $total) * 100 }" | sed 's/\.0$//'
fi
}

# Generate SVG badge
mkdir -p "$BADGES_DIR"
label="coverage"
value="${pct}%"
lw=62; vw=46; tw=$((lw + vw))
cat > "${BADGES_DIR}/jacoco.svg" <<EOF
pick_color() {
local pct=$1
local color="#e05d44" # red <60
if awk "BEGIN{exit!($pct>=100)}"; then color="#4c1" # bright green
elif awk "BEGIN{exit!($pct>=90)}"; then color="#97ca00" # green
elif awk "BEGIN{exit!($pct>=80)}"; then color="#a4a61d" # yellow-green
elif awk "BEGIN{exit!($pct>=70)}"; then color="#dfb317" # yellow
elif awk "BEGIN{exit!($pct>=60)}"; then color="#fe7d37" # orange
fi
echo "$color"
}

generate_badge() {
local label=$1
local value=$2
local output=$3
local pct=${value%\%}
local color
color=$(pick_color "$pct")
local lw=$(( ${#label} * 7 + 12 ))
local vw=$(( ${#value} * 7 + 16 ))
local tw=$((lw + vw))

cat > "$output" <<EOF
<svg xmlns="http://www.w3.org/2000/svg" width="${tw}" height="20">
<linearGradient id="b" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
Expand All @@ -60,5 +85,24 @@ cat > "${BADGES_DIR}/jacoco.svg" <<EOF
</g>
</svg>
EOF
}

mkdir -p "$BADGES_DIR"

read -r overall_missed overall_covered <<< "$(calc_totals overall)"
read -r handwritten_missed handwritten_covered <<< "$(calc_totals handwritten)"
read -r generated_missed generated_covered <<< "$(calc_totals generated)"

overall_pct=$(format_pct "$overall_missed" "$overall_covered")
handwritten_pct=$(format_pct "$handwritten_missed" "$handwritten_covered")
generated_pct=$(format_pct "$generated_missed" "$generated_covered")

echo "Overall coverage: ${overall_pct}%"
echo "Handwritten coverage: ${handwritten_pct}%"
echo "Generated coverage: ${generated_pct}%"

generate_badge "coverage" "${overall_pct}%" "${BADGES_DIR}/jacoco.svg"
generate_badge "coverage handwritten" "${handwritten_pct}%" "${BADGES_DIR}/jacoco-handwritten.svg"
generate_badge "coverage generated" "${generated_pct}%" "${BADGES_DIR}/jacoco-generated.svg"

echo "Badge generated at ${BADGES_DIR}/jacoco.svg"
echo "Badges generated in ${BADGES_DIR}"
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

[![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)
[![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)
[![Coverage](.github/badges/jacoco.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
[![Handwritten Coverage](.github/badges/jacoco-handwritten.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
[![Generated Coverage](.github/badges/jacoco-generated.svg)](https://github.github.io/copilot-sdk-java/snapshot/jacoco/index.html)
[![Documentation](https://img.shields.io/badge/docs-online-brightgreen)](https://github.github.io/copilot-sdk-java/)
[![Java 17+](https://img.shields.io/badge/Java-17%2B-blue?logo=openjdk&logoColor=white)](https://openjdk.org/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
Expand Down Expand Up @@ -212,4 +213,3 @@ MIT — see [LICENSE](LICENSE) for details.
[![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)

⭐ Drop a star if you find this useful!

Loading