Bug fix
This commit is contained in:
Binary file not shown.
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user