sozsoft-platform/api/scripts/generate-release-notes.sh
2026-08-13 13:43:48 +03:00

94 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
# Sürüm notlarını git tag'lerinden üretir:
# api/src/Sozsoft.Platform.HttpApi.Host/release-notes.json
#
# Dosya csproj'daki `Content Update="release-notes.json"` kuralıyla publish
# çıktısına kopyalanır, yani imaja gömülür ve konteynerde ContentRootPath
# altında (/srv/app) yer alır. ReleaseNoteStartupService açılışta tam bu yolu
# okuyup `Sas_H_ReleaseNote` tablosuyla eşitler; DbMigrator gerekmez.
#
# ÖNEMLİ: Çıktı yolu ReleaseNoteStartupService'in okuduğu yolla aynı olmak
# ZORUNDA. Daha önce script `api/release-notes/` altına yazıyordu; orası ne
# publish çıktısına kopyalanıyor ne de konteynere mount ediliyordu, dolayısıyla
# imajdaki eski (commit'lenmiş) dosya kullanılıyor ve yeni tag'ler hiç
# görünmüyordu.
#
# Çıktı .gitignore'dadır: takip edilseydi deploy'daki `git pull` her seferinde
# yerel değişiklikle çakışırdı.
#
# Deploy akışında configs/deployment/scripts/build/api.sh tarafından otomatik
# çağrılır; elle de çalıştırılabilir.
#
# Dış bağımlılığı yoktur (jq/node gerekmez): JSON kaçışları sed ile yapılır.
cd "$(dirname "$0")/.."
OUTPUT="src/Sozsoft.Platform.HttpApi.Host/release-notes.json"
mkdir -p "$(dirname "$OUTPUT")"
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "> git deposu yok, ${OUTPUT} güncellenmedi." >&2
exit 0
fi
echo "> release-notes.json oluşturuluyor..."
# origin'de olmayan yerel tag'ler sürüm sırasını bozar; temizle. `--force` şart:
# yerel bir tag origin'dekinden farklı commit'e bakıyorsa git onu "would clobber
# existing tag" diyerek reddediyor ve YENİ tag'ler de alınmamış oluyor.
git fetch --prune --prune-tags --tags --force origin >/dev/null 2>&1 || true
# Sıra tag adına göre (creatordate değil): 1.1.10 > 1.1.09.
TAGS=$(git tag --list --sort=-v:refname)
if [ -z "$TAGS" ]; then
echo "> Tag bulunamadı, mevcut dosya korundu." >&2
exit 0
fi
# JSON string kaçışı: önce ters bölü, sonra tırnak, sonra sekme/CR.
escape_json() {
printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\t/\\t/g' -e 's/\r//g'
}
TMP=$(mktemp)
printf '{\n "ReleaseNotes": [\n' > "$TMP"
FIRST_TAG=true
for TAG in $TAGS; do
VERSION=${TAG#v}
RELEASE_DATE=$(git log -1 --format=%ad --date=short "$TAG")
COMMIT=$(git rev-list -n 1 "$TAG")
if [ "$FIRST_TAG" = true ]; then FIRST_TAG=false; else printf ',\n' >> "$TMP"; fi
printf ' {\n' >> "$TMP"
printf ' "version": "%s",\n' "$(escape_json "$VERSION")" >> "$TMP"
printf ' "releaseDate": "%s",\n' "$RELEASE_DATE" >> "$TMP"
printf ' "commit": "%s",\n' "$COMMIT" >> "$TMP"
printf ' "notes": [' >> "$TMP"
# Annotated tag mesajı; her satır bir madde. Boş satırlar ve baştaki "-" / "*"
# işaretleri temizlenir. Lightweight tag'de mesaj boştur → notes: [].
FIRST_NOTE=true
while IFS= read -r LINE; do
[ -z "$LINE" ] && continue
if [ "$FIRST_NOTE" = true ]; then FIRST_NOTE=false; printf '\n' >> "$TMP"; else printf ',\n' >> "$TMP"; fi
printf ' "%s"' "$(escape_json "$LINE")" >> "$TMP"
done < <(git tag -l --format='%(contents)' "$TAG" \
| sed -e 's/\r//' -e 's/^[[:space:]]*[-*][[:space:]]*//' -e 's/[[:space:]]*$//' \
| grep -v '^$' || true)
if [ "$FIRST_NOTE" = true ]; then
printf ']\n' >> "$TMP"
else
printf '\n ]\n' >> "$TMP"
fi
printf ' }' >> "$TMP"
done
printf '\n ]\n}\n' >> "$TMP"
mv "$TMP" "$OUTPUT"
echo "> ${OUTPUT}: $(grep -c '"version":' "$OUTPUT") sürüm"