diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index f8e1c6b..b5ac8ab 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -1058,6 +1058,19 @@ sudo -u voice .venv/bin/python -m pytest -q # Erwartet: "213 passed" ``` +**Automatischer Schutz vor jedem Push (empfohlen):** Ein versionierter +`pre-push`-Hook lässt die Suite vor jedem `git push` laufen und bricht bei roten +Tests ab. Nach einem frischen Clone einmalig installieren: + +```bash +cd /opt/voice-assistant +sudo -u voice bash scripts/install-hooks.sh +``` + +Der Hook liegt unter `scripts/git-hooks/pre-push` (versioniert); `.git/hooks/` +selbst wird von Git nicht versioniert, daher der Installer. Im Notfall umgehen: +`git push --no-verify`. + Abdeckung u. a.: Stimm-/Geschlechts-Routing (`voice_for_route`), Piper Multi-Speaker (`#speaker_id`) und Gender-Code-Auflösung, Cartesia Voice-Map + nicht unterstützte Sprachen, Cartesia→Piper-Fallback. Die Fixture in `tests/conftest.py` neutralisiert diff --git a/scripts/git-hooks/pre-push b/scripts/git-hooks/pre-push new file mode 100644 index 0000000..dc859da --- /dev/null +++ b/scripts/git-hooks/pre-push @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# pre-push: Die Test-Suite muss gruen sein, sonst wird der Push abgebrochen. +# Installation: scripts/install-hooks.sh | Im Notfall umgehen: git push --no-verify +set -uo pipefail + +REPO="/opt/voice-assistant" +PYTHON="$REPO/.venv/bin/python" + +echo "▶ pre-push: pytest laeuft (ca. 35 s) ..." +if [ ! -x "$PYTHON" ]; then + echo "✗ pre-push: $PYTHON nicht gefunden — Push abgebrochen." + exit 1 +fi + +cd "$REPO" || exit 1 +if ! "$PYTHON" -m pytest -q; then + echo + echo "✗ pre-push: Tests fehlgeschlagen — Push abgebrochen." + echo " (Im Notfall umgehen mit: git push --no-verify)" + exit 1 +fi +echo "✓ pre-push: alle Tests gruen — Push wird fortgesetzt." +exit 0 diff --git a/scripts/install-hooks.sh b/scripts/install-hooks.sh new file mode 100755 index 0000000..3125372 --- /dev/null +++ b/scripts/install-hooks.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# Installiert die versionierten Git-Hooks aus scripts/git-hooks/ nach .git/hooks/. +# Nach jedem frischen Clone einmal ausfuehren: bash scripts/install-hooks.sh +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +SRC="$ROOT/scripts/git-hooks" +DST="$ROOT/.git/hooks" + +mkdir -p "$DST" +for hook in "$SRC"/*; do + name="$(basename "$hook")" + cp "$hook" "$DST/$name" + chmod +x "$DST/$name" + echo "✓ installiert: $name" +done +echo "Fertig. Hooks aktiv unter $DST"