#!/usr/bin/env bash # Sprint 16: генерация бейджей покрытия / статуса в badges/*.svg. # # Запускается вручную или из CI после `dotnet test --collect:"XPlat Code Coverage"`. # Вход: путь к cobertura.xml (или авто-поиск в TestResults/). # Выход: badges/coverage.svg + ссылка для добавления в README. # # Без зависимостей кроме curl, python3, sed. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" BADGES_DIR="$ROOT/badges" mkdir -p "$BADGES_DIR" # 1. Coverage badge CXML="${1:-}" if [[ -z "$CXML" ]]; then CXML="$(find "$ROOT" -name 'coverage.cobertura.xml' -path '*/TestResults/*' 2>/dev/null | head -1)" fi if [[ -z "$CXML" || ! -f "$CXML" ]]; then echo "Usage: $0 [path/to/coverage.cobertura.xml]" >&2 echo "Run 'dotnet test --collect:XPlat Code Coverage' first." >&2 exit 1 fi PCT=$(python3 -c " import xml.etree.ElementTree as ET r = ET.parse('$CXML').getroot() # Считаем суммарное покрытие по Application + Domain (главные пакеты). covered, valid = 0, 0 for pkg in r.iter('package'): if pkg.get('name') in ('foodmarket.Application', 'foodmarket.Domain'): for line in pkg.iter('line'): valid += 1 if int(line.get('hits', '0')) > 0: covered += 1 print(f'{100*covered/valid:.0f}' if valid else '0') ") # Цвет по порогам — shields.io стандарт. COLOR="brightgreen" if (( PCT < 50 )); then COLOR="red" elif (( PCT < 70 )); then COLOR="yellow" elif (( PCT < 85 )); then COLOR="green" fi # Скачиваем static SVG от shields.io (legacy endpoint без рантайма). URL="https://img.shields.io/badge/coverage-${PCT}%25-${COLOR}?style=flat-square&label=coverage%20(app%2Bdomain)" echo "[badges] coverage = ${PCT}% → ${COLOR}" echo "[badges] fetching $URL" if curl -fsS "$URL" -o "$BADGES_DIR/coverage.svg"; then echo "[badges] wrote $BADGES_DIR/coverage.svg ($(wc -c < "$BADGES_DIR/coverage.svg") bytes)" else # Offline-fallback: SVG inline. cat > "$BADGES_DIR/coverage.svg" < coverage (app+domain) ${PCT}% SVG echo "[badges] offline fallback SVG written" fi # 2. Build/CI status — static shields. Реальный badge берёт SVG c # Forgejo `actions/workflows/ci.yml/badge.svg` (auto-обновляется). # Тут просто проверяем, что mirror.svg есть в repo для случая offline-read. cat > "$BADGES_DIR/ci-status-link.md" <