From 186ab2325fc20a7a515de58b3fe68625d351950a Mon Sep 17 00:00:00 2001 From: Stitch505 <–Gleb@stitch505.su> Date: Fri, 22 May 2026 21:20:44 +0400 Subject: [PATCH] CRITICAL: hardcode state.json to ~/.migrate/state.json, guarantee reset_state clears completed_steps --- core/main.py | 3 ++- core/state.py | 29 +++++++++++------------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/core/main.py b/core/main.py index 7e717a1..79b9622 100644 --- a/core/main.py +++ b/core/main.py @@ -43,8 +43,9 @@ signal.signal(signal.SIGTERM, _handle_sigterm) def main(): - # Инициализируем state сразу, чтобы _LAST_STATE был готов при любом выходе + # Инициализируем state сразу, чтобы _LAST_STATE был готов при любом выходe state.load_state() + parser = argparse.ArgumentParser(description="Docker Service Migration Tool") parser.add_argument("--mode", choices=["source", "target"], help="Режим работы") parser.add_argument("--resume", action="store_true", help="Продолжить после ошибки") diff --git a/core/state.py b/core/state.py index a61c6ce..6c6dc61 100644 --- a/core/state.py +++ b/core/state.py @@ -14,29 +14,22 @@ from datetime import datetime STATE_FILE = None _LAST_STATE = None +# Жёсткий путь для state.json — один, навсегда +STATE_PATH = os.path.join(os.path.expanduser("~"), ".migrate", "state.json") + def _state_path(): global STATE_FILE if STATE_FILE: return STATE_FILE - # State никогда не храним рядом со скриптом — install.sh его удалит - candidates = [ - os.path.join(os.path.expanduser("~"), ".migrate", "state.json"), - "/var/tmp/docker-migrate/state.json", - ] - for c in candidates: - d = os.path.dirname(c) - if os.path.isdir(d): - STATE_FILE = c - return c - try: + # Всегда используем ~/.migrate/state.json + d = os.path.dirname(STATE_PATH) + try: + if not os.path.isdir(d): os.makedirs(d, exist_ok=True) - STATE_FILE = c - return c - except PermissionError: - continue - fallback = os.path.join(os.getcwd(), ".migrate-state.json") - STATE_FILE = fallback - return fallback + except Exception: + pass + STATE_FILE = STATE_PATH + return STATE_FILE def load_state():