85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
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() |