#!/usr/bin/env bash # # Richtet eine lokale Entwicklungsumgebung für den Finanzmanager ein: # Docker (optional), Zielverzeichnis mit den Git-Remotes (origin = eigener # Fork, upstream = fds2610/Finanzmanager), lokale Container und optional die # Infrastruktur für die E2E-Tests. Auf dem Host wird sonst nichts installiert # – PHP, Composer und MariaDB laufen ausschließlich in Containern. # # Beliebig oft erneut ausführbar. # # ./dev-setup.sh [Optionen] # # Optionen (mit Default, alles auch als Umgebungsvariable setzbar): # --verzeichnis PFAD Zielverzeichnis für den Checkout # (WORKDIR, Default: ~/projects/Finanzmanager) # --fork ACCOUNT Codeberg-Account des eigenen Forks (FORK_ACCOUNT) # --kein-e2e E2E-Testsetup nicht mit einrichten (E2E_SETUP=nein) # --keine-docker-installation # Docker nicht installieren, auch wenn es fehlt # (DOCKER_INSTALL=nein) # -h, --help Diese Hilfe anzeigen # # Beispiel: # ./dev-setup.sh --verzeichnis ~/code/Finanzmanager --fork meinaccount set -euo pipefail WORKDIR="${WORKDIR:-$HOME/projects/Finanzmanager}" FORK_ACCOUNT="${FORK_ACCOUNT:-}" E2E_SETUP="${E2E_SETUP:-ja}" DOCKER_INSTALL="${DOCKER_INSTALL:-ja}" UPSTREAM_URL="https://codeberg.org/fds2610/Finanzmanager.git" melde() { printf '\n\033[1m▸ %s\033[0m\n' "$1"; } hilfe() { sed -n '2,25p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' } while [ $# -gt 0 ]; do case "$1" in --verzeichnis) WORKDIR="$2"; shift 2 ;; --fork) FORK_ACCOUNT="$2"; shift 2 ;; --kein-e2e) E2E_SETUP=nein; shift ;; --keine-docker-installation) DOCKER_INSTALL=nein; shift ;; -h|--help) hilfe; exit 0 ;; *) echo "Unbekannte Option: $1" >&2; hilfe; exit 1 ;; esac done # ── 0. Docker und Git ──────────────────────────────────────────────────────── melde "Voraussetzungen prüfen" if ! command -v git >/dev/null 2>&1; then echo "Git fehlt und muss manuell installiert werden (siehe Distribution)." >&2 exit 1 fi if ! docker compose version >/dev/null 2>&1; then if [ "$DOCKER_INSTALL" = "ja" ]; then echo "Docker/Compose-Plugin fehlt – Installation über get.docker.com." curl -fsSL https://get.docker.com | sh echo "Ggf. den aktuellen Benutzer zur Gruppe 'docker' hinzufügen und neu anmelden:" echo " sudo usermod -aG docker \$USER" else echo "Docker/Compose-Plugin fehlt und --keine-docker-installation ist gesetzt." >&2 exit 1 fi else echo "Docker vorhanden: $(docker compose version --short 2>/dev/null || echo ok)" fi # ── 1. Checkout mit Fork- und Upstream-Remote ─────────────────────────────── melde "Repository unter $WORKDIR" if [ -d "$WORKDIR/.git" ]; then echo "Vorhanden – kein erneuter Checkout." else if [ -z "$FORK_ACCOUNT" ]; then echo "Kein --fork angegeben: Checkout direkt aus dem Upstream-Repository." echo "Für einen eigenen Beitrag vorher auf Codeberg forken und mit" echo "'--fork ' erneut ausführen." git clone "$UPSTREAM_URL" "$WORKDIR" else git clone "https://codeberg.org/$FORK_ACCOUNT/Finanzmanager.git" "$WORKDIR" fi fi cd "$WORKDIR" git remote get-url upstream >/dev/null 2>&1 || git remote add upstream "$UPSTREAM_URL" git fetch upstream --quiet || true # ── 2. Lokale Container ───────────────────────────────────────────────────── melde "Container starten" [ -f .env ] || cp .env.example .env docker compose up -d melde "Migrationen" docker compose exec -T php php scripts/migrate.php echo "Anwendung erreichbar unter http://localhost:8000" # ── 3. E2E-Testsetup (optional) ───────────────────────────────────────────── if [ "$E2E_SETUP" = "ja" ]; then melde "E2E-Testnutzer" docker compose exec -u www-data -T php php scripts/e2e-benutzer.php || true echo "E2E-Tests laufen über ein separates Runner-Projekt unter" echo "~/projects/e2e-runner (nicht Teil dieses Repos). Fehlt es, überspringt" echo "tests/e2e/run.sh die Tests automatisch mit einer Warnung." echo "Details: tests/e2e/README.md" else echo "E2E-Setup übersprungen (--kein-e2e)." fi # ── 4. Claude Code ─────────────────────────────────────────────────────────── melde "Claude Code" echo "Im Verzeichnis '$WORKDIR' starten, z.B. mit: claude" echo "Die Betriebs- und Coding-Regeln stehen in CLAUDE.md und werden automatisch" echo "gelesen. Für weitergehende Automatisierung ohne Rückfragen die eigene" echo ".claude/settings.json anpassen (persönliche Entscheidung, nicht Teil des Repos)." melde "Fertig"