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:
|
if code != 0 or code2 != 0:
|
||||||
return False, "Impossible de comparer les commits"
|
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:
|
if local_hash == remote_hash:
|
||||||
log.info("Auto-update: programme a jour")
|
log.info("Auto-update: programme a jour")
|
||||||
return False, ""
|
return False, ""
|
||||||
@@ -150,7 +152,7 @@ def do_self_update():
|
|||||||
"""
|
"""
|
||||||
Met à jour le programme lui-même.
|
Met à jour le programme lui-même.
|
||||||
Sur Windows, un .exe en cours d'exécution ne peut pas être écrasé.
|
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).
|
Retourne (ok, message).
|
||||||
"""
|
"""
|
||||||
exe_dir = str(get_exe_dir())
|
exe_dir = str(get_exe_dir())
|
||||||
@@ -160,6 +162,16 @@ def do_self_update():
|
|||||||
if code != 0:
|
if code != 0:
|
||||||
return False, "Impossible de lire la branche"
|
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
|
# Si on tourne en .exe, renommer l'exe actuel pour libérer le fichier
|
||||||
exe_old_path = None
|
exe_old_path = None
|
||||||
if is_frozen:
|
if is_frozen:
|
||||||
@@ -176,30 +188,31 @@ def do_self_update():
|
|||||||
log.error(f"Auto-update: impossible de renommer l'exe: {e}")
|
log.error(f"Auto-update: impossible de renommer l'exe: {e}")
|
||||||
return False, f"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)
|
# Reset hard sur origin pour forcer la MAJ (methode la plus fiable)
|
||||||
code, _, err = run_git(["pull", "--ff-only", "origin", branch], cwd=exe_dir)
|
code, _, err = run_git(["reset", "--hard", f"origin/{branch}"], cwd=exe_dir)
|
||||||
|
|
||||||
if code == 0:
|
if code != 0:
|
||||||
log.info("Auto-update: pull OK")
|
# Echec, restaurer l'ancien exe
|
||||||
return True, "Mise a jour reussie !\nLe programme va redemarrer."
|
|
||||||
|
|
||||||
# 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."
|
|
||||||
|
|
||||||
# Echec definitif, restaurer l'ancien exe
|
|
||||||
if is_frozen and exe_old_path and exe_old_path.exists():
|
if is_frozen and exe_old_path and exe_old_path.exists():
|
||||||
try:
|
try:
|
||||||
exe_old_path.rename(Path(sys.executable))
|
exe_old_path.rename(Path(sys.executable))
|
||||||
log.info("Auto-update: exe restaure apres echec")
|
log.info("Auto-update: exe restaure apres echec")
|
||||||
except OSError:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
log.error(f"Auto-update: pull echoue: {err2}")
|
log.error(f"Auto-update: reset echoue: {err}")
|
||||||
return False, f"Erreur pull: {err2}"
|
return False, f"Erreur mise a jour: {err}"
|
||||||
|
|
||||||
|
log.info("Auto-update: reset --hard OK")
|
||||||
|
|
||||||
|
# Restaurer config.ini de l'utilisateur
|
||||||
|
if config_backup is not None:
|
||||||
|
try:
|
||||||
|
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():
|
def relaunch_program():
|
||||||
|
|||||||
Reference in New Issue
Block a user