diff --git a/main.py b/main.py index acde39d..cc25c8b 100644 --- a/main.py +++ b/main.py @@ -844,6 +844,7 @@ class VkChatManager(QMainWindow): f"set SRC_DIR={source_dir}", f"set EXE_NAME={exe_name}", f"set TARGET_PID={target_pid}", + "set BACKUP_DIR=%TEMP%\\anabasis_backup_%RANDOM%%RANDOM%", ":wait_for_exit", "tasklist /FI \"PID eq %TARGET_PID%\" | find \"%TARGET_PID%\" >nul", "if %ERRORLEVEL% EQU 0 (", @@ -851,13 +852,26 @@ class VkChatManager(QMainWindow): " goto :wait_for_exit", ")", "timeout /t 1 /nobreak >nul", + "mkdir \"%BACKUP_DIR%\" >nul 2>&1", + "robocopy \"%APP_DIR%\" \"%BACKUP_DIR%\" /E /NFL /NDL /NJH /NJS /NP /R:6 /W:2 >nul", + "set RC=%ERRORLEVEL%", + "if %RC% GEQ 8 goto :backup_error", "robocopy \"%SRC_DIR%\" \"%APP_DIR%\" /E /NFL /NDL /NJH /NJS /NP /R:12 /W:2 >nul", "set RC=%ERRORLEVEL%", - "if %RC% GEQ 8 goto :copy_error", + "if %RC% GEQ 8 goto :rollback", "start \"\" \"%APP_DIR%\\%EXE_NAME%\"", + "timeout /t 2 /nobreak >nul", + "tasklist /FI \"IMAGENAME eq %EXE_NAME%\" | find /I \"%EXE_NAME%\" >nul", + "if %ERRORLEVEL% NEQ 0 goto :rollback", + "rmdir /S /Q \"%BACKUP_DIR%\" >nul 2>&1", "exit /b 0", - ":copy_error", - "echo Auto-update failed with code %RC% > \"%APP_DIR%\\update_error.log\"", + ":rollback", + "robocopy \"%BACKUP_DIR%\" \"%APP_DIR%\" /E /NFL /NDL /NJH /NJS /NP /R:6 /W:2 >nul", + "start \"\" \"%APP_DIR%\\%EXE_NAME%\"", + "echo Auto-update failed. Rollback executed. > \"%APP_DIR%\\update_error.log\"", + "exit /b 2", + ":backup_error", + "echo Auto-update failed during backup. Code %RC% > \"%APP_DIR%\\update_error.log\"", "exit /b %RC%", ] with open(script_path, "w", encoding="utf-8", newline="\r\n") as f: diff --git a/tests/test_auth_relogin_smoke.py b/tests/test_auth_relogin_smoke.py index f45744a..577fd2a 100644 --- a/tests/test_auth_relogin_smoke.py +++ b/tests/test_auth_relogin_smoke.py @@ -48,6 +48,8 @@ class AuthReloginSmokeTests(unittest.TestCase): self.assertIn("def _verify_update_checksum(self, zip_path, checksum_url, download_name):", self.source) self.assertIn("def _build_update_script(self, app_dir, source_dir, exe_name, target_pid):", self.source) self.assertIn("set TARGET_PID=", self.source) + self.assertIn("set BACKUP_DIR=", self.source) + self.assertIn(":rollback", self.source) if __name__ == "__main__":