import subprocess import sys import os import platform def run_command(command, cwd=None): """ Führt einen Befehl aus, gibt seine Ausgabe in Echtzeit aus und prüft auf Fehler. """ print(f"\n>>> Führe aus: {' '.join(command)}") print("-" * 40) try: # Stelle sicher, dass der Python-Interpreter des venv für Module verwendet wird process = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, encoding='utf-8', errors='replace', # Verhindert Fehler bei unerwarteten Zeichen cwd=cwd, bufsize=1 # Zeilen-gepuffert ) # Lese und drucke die Ausgabe Zeile für Zeile for line in iter(process.stdout.readline, ''): print(line, end='') process.wait() # Warte auf das Ende des Prozesses if process.returncode != 0: print("-" * 40) print(f"FEHLER: Befehl schlug mit Exit-Code {process.returncode} fehl.") print("-" * 40) return False print("-" * 40) print(">>> Befehl erfolgreich abgeschlossen.") return True except FileNotFoundError: print(f"FEHLER: Befehl '{command[0]}' nicht gefunden. Ist Git/Python korrekt installiert und im PATH?") return False except Exception as e: print(f"Ein unerwarteter Fehler ist aufgetreten: {e}") return False def main(): """Haupt-Update-Prozess.""" print("Starte den Update-Prozess der Anwendung...") project_root = os.path.dirname(os.path.abspath(__file__)) # Finde den Python-Interpreter des aktuellen Virtual Environments python_executable = sys.executable # Schritt 1: Neueste Änderungen von Git holen if not run_command(["git", "pull"], cwd=project_root): print("\nUpdate fehlgeschlagen: Konnte die neuesten Änderungen nicht von Git holen.") sys.exit(1) # Schritt 2: Python-Abhängigkeiten installieren/aktualisieren if not run_command([python_executable, "-m", "pip", "install", "-r", "requirements.txt"], cwd=project_root): print("\nUpdate fehlgeschlagen: Konnte die Python-Abhängigkeiten nicht installieren.") sys.exit(1) # Schritt 3: Datenbank-Migrationen erstellen (falls nötig) # Dieser Befehl erkennt Modelländerungen und erstellt ein Migrationsskript. # Er kann fehlschlagen, wenn es keine Änderungen gibt, das ist in Ordnung. print("\nVersuche, Datenbank-Änderungen zu erkennen...") run_command([python_executable, "-m", "flask", "--app", "main", "db", "migrate", "-m", "Auto-detect model changes"], cwd=project_root) # Schritt 4: Datenbank-Migrationen anwenden print("\nWende Datenbank-Migrationen an...") if not run_command([python_executable, "-m", "flask", "--app", "main", "db", "upgrade"], cwd=project_root): print("\nUpdate fehlgeschlagen: Konnte die Datenbank-Migrationen nicht anwenden.") sys.exit(1) print("\n\n===================================================") print("✅ Update erfolgreich abgeschlossen!") print("Bitte starten Sie die Anwendung (main.py) neu, um die Änderungen zu übernehmen.") print("===================================================") if __name__ == "__main__": main()