#!/usr/bin/env bash # Setzt eine neue Version: package.json, CHANGELOG, Commit und Tag. # Pusht bewusst nicht – das geschieht erst nach ausdrücklicher Freigabe. set -euo pipefail WURZEL="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$WURZEL" meldung() { printf '▸ %s\n' "$1"; } fehler() { printf 'Fehler: %s\n' "$1" >&2 exit 1 } hilfe() { cat <<'ENDE' Verwendung: scripts/release.sh Semantische Version ohne führendes v, z. B. 0.1.0 Ablauf: 1. Sauberen Arbeitsbaum und grüne Prüfungen sicherstellen 2. Version in package.json setzen 3. "Unveröffentlicht" im CHANGELOG in einen datierten Abschnitt überführen 4. chore(release): committen und Tag v anlegen Es wird nicht gepusht. ENDE } VERSION="${1:-}" case "$VERSION" in ''|--hilfe|-h) hilfe; [ -z "$VERSION" ] && exit 1; exit 0 ;; esac printf '%s' "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$' \ || fehler "\"$VERSION\" sieht nicht nach einer semantischen Version aus (z. B. 0.1.0)." TAG="v$VERSION" # --- 1. Voraussetzungen ---------------------------------------------------- meldung 'Arbeitsbaum prüfen.' [ -d .git ] || fehler 'Kein Git-Arbeitsbaum.' [ -z "$(git status --porcelain)" ] || fehler 'Der Arbeitsbaum ist nicht sauber.' git rev-parse -q --verify "refs/tags/$TAG" >/dev/null \ && fehler "Den Tag $TAG gibt es schon." [ -f CHANGELOG.md ] || fehler 'CHANGELOG.md fehlt.' grep -q '^## \[Unveröffentlicht\]' CHANGELOG.md \ || fehler 'Im CHANGELOG fehlt der Abschnitt "## [Unveröffentlicht]".' INHALT="$(awk ' /^## \[Unveröffentlicht\]/ { sammeln = 1; next } sammeln && /^## / { exit } sammeln { print } ' CHANGELOG.md | grep -v '^[[:space:]]*$' || true)" [ -n "$INHALT" ] || fehler 'Der Abschnitt "Unveröffentlicht" ist leer.' meldung 'Prüfungen laufen lassen.' npm run pruefen || fehler 'Die Prüfungen sind nicht grün.' # --- 2. Version setzen ----------------------------------------------------- meldung "Version auf $VERSION setzen." npm version "$VERSION" --no-git-tag-version --allow-same-version >/dev/null # --- 3. CHANGELOG ---------------------------------------------------------- meldung 'CHANGELOG fortschreiben.' HEUTE="$(date '+%Y-%m-%d')" TEMP="$(mktemp)" awk -v version="$VERSION" -v heute="$HEUTE" ' /^## \[Unveröffentlicht\]/ { print "## [Unveröffentlicht]" print "" print "## [" version "] – " heute next } { print } ' CHANGELOG.md > "$TEMP" mv "$TEMP" CHANGELOG.md npx prettier --write package.json CHANGELOG.md >/dev/null 2>&1 || true # --- 4. Commit und Tag ----------------------------------------------------- meldung "Commit und Tag $TAG anlegen." git add package.json package-lock.json CHANGELOG.md git commit -m "chore(release): $VERSION" git tag -a "$TAG" -m "Planer $VERSION" meldung "Fertig. $TAG ist angelegt, aber nicht gepusht." printf '\nNach der Freigabe:\n' printf ' git push origin %s\n' "$(git rev-parse --abbrev-ref HEAD)" printf ' git push origin %s\n' "$TAG"