diff --git a/GitUpdateChecker.exe b/GitUpdateChecker.exe index 633a672..0341db4 100644 Binary files a/GitUpdateChecker.exe and b/GitUpdateChecker.exe differ diff --git a/git_updater.py b/git_updater.py index 65c97cb..bfe61e4 100644 --- a/git_updater.py +++ b/git_updater.py @@ -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():