#!/usr/bin/env bash # Sprint 17: генератор CHANGELOG.md из git log feat:/fix: коммитов. # # Группирует по дате (commit author-date), вытаскивает строку subject'a # после `feat:` / `fix:`. Игнорирует chore/test/docs (они в commit log # уже есть, в changelog не нужны). # # Запуск: bash scripts/generate-changelog.sh > CHANGELOG.md # Или через CI step при каждом push в main. set -euo pipefail cd "$(dirname "$0")/.." # Глубина: 90 дней. /whats-new всё равно показывает только 30, но в # CHANGELOG.md держим больше для исторической ретроспективы. SINCE="$(date -d '90 days ago' +%Y-%m-%d 2>/dev/null || date -v-90d +%Y-%m-%d)" echo "# CHANGELOG" echo "" echo "Auto-generated from git log feat:/fix: (last 90 days)." echo "" # git log: только feat: и fix: коммиты. Формат «дата|subject». # Группируем по дате с awk. git log --since="$SINCE" --pretty=format:'%ad|%s' --date=short \ --grep='^feat\|^fix' \ | awk -F'|' ' { date = $1; msg = $2 } date != prev { if (prev != "") print "" print "## " date print "" prev = date } { # Извлекаем тип (feat|fix) и текст. if (match(msg, /^(feat|fix)(\([^)]+\))?:\s*(.*)/, m)) { type = m[1] scope = m[2] text = m[3] printf "- **%s**: %s%s\n", type, text, (scope != "" ? " " scope : "") } else { printf "- %s\n", msg } } ' echo ""