This commit is contained in:
2026-03-24 15:40:01 +01:00
parent e0e70a41b8
commit 056ab94a10
2 changed files with 34 additions and 21 deletions

Binary file not shown.

View File

@@ -125,6 +125,8 @@ def check_self_update():
if code != 0 or code2 != 0:
return False, "Impossible de comparer les commits"
log.info(f"Auto-update: local={local_hash[:8]} remote={remote_hash[:8]} branche={branch}")
if local_hash == remote_hash:
log.info("Auto-update: programme a jour")
return False, ""
@@ -150,7 +152,7 @@ def do_self_update():
"""
Met à jour le programme lui-même.
Sur Windows, un .exe en cours d'exécution ne peut pas être écrasé.
Stratégie : renommer l'exe actuel en .old, puis git pull le nouveau.
Stratégie : renommer l'exe actuel en .old, puis reset hard sur origin.
Retourne (ok, message).
"""
exe_dir = str(get_exe_dir())
@@ -160,6 +162,16 @@ def do_self_update():
if code != 0:
return False, "Impossible de lire la branche"
# Sauvegarder config.ini avant reset (le reset va l'ecraser)
config_path = get_exe_dir() / "config.ini"
config_backup = None
if config_path.exists():
try:
config_backup = config_path.read_text(encoding="utf-8")
log.info("Auto-update: config.ini sauvegarde")
except OSError:
pass
# Si on tourne en .exe, renommer l'exe actuel pour libérer le fichier
exe_old_path = None
if is_frozen:
@@ -176,30 +188,31 @@ def do_self_update():
log.error(f"Auto-update: impossible de renommer l'exe: {e}")
return False, f"Impossible de renommer l'exe: {e}"
# Pull avec fast-forward only (evite de toucher config.ini inutilement)
code, _, err = run_git(["pull", "--ff-only", "origin", branch], cwd=exe_dir)
# Reset hard sur origin pour forcer la MAJ (methode la plus fiable)
code, _, err = run_git(["reset", "--hard", f"origin/{branch}"], cwd=exe_dir)
if code == 0:
log.info("Auto-update: pull OK")
return True, "Mise a jour reussie !\nLe programme va redemarrer."
if code != 0:
# Echec, restaurer l'ancien exe
if is_frozen and exe_old_path and exe_old_path.exists():
try:
exe_old_path.rename(Path(sys.executable))
log.info("Auto-update: exe restaure apres echec")
except OSError:
pass
log.error(f"Auto-update: reset echoue: {err}")
return False, f"Erreur mise a jour: {err}"
# Si ff-only echoue (modifications locales), tenter reset hard sur origin
log.warning(f"Auto-update: pull --ff-only echoue ({err}), tentative reset...")
run_git(["reset", "--hard", f"origin/{branch}"], cwd=exe_dir)
code2, _, err2 = run_git(["pull", "--ff-only", "origin", branch], cwd=exe_dir)
if code2 == 0:
log.info("Auto-update: reset + pull OK")
return True, "Mise a jour reussie !\nLe programme va redemarrer."
log.info("Auto-update: reset --hard OK")
# Echec definitif, restaurer l'ancien exe
if is_frozen and exe_old_path and exe_old_path.exists():
# Restaurer config.ini de l'utilisateur
if config_backup is not None:
try:
exe_old_path.rename(Path(sys.executable))
log.info("Auto-update: exe restaure apres echec")
except OSError:
pass
log.error(f"Auto-update: pull echoue: {err2}")
return False, f"Erreur pull: {err2}"
config_path.write_text(config_backup, encoding="utf-8")
log.info("Auto-update: config.ini restaure")
except OSError as e:
log.warning(f"Auto-update: impossible de restaurer config.ini: {e}")
return True, "Mise a jour reussie !\nLe programme va redemarrer."
def relaunch_program():