Files
Uptime-Stats/update.py

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()