moesnow 41cca02b94
refactor: 重构更新系统为模块化架构
## 主要改动

### 1. 更新系统架构重构
- 将单文件 `updater.py` 拆分为 `module/update/` 下的独立模块:
  - `version_check.py` - 版本检查和更新检测逻辑
  - `update_engine.py` - 更新引擎核心逻辑
  - `downloader.py` - 文件下载器(支持断点续传)
  - `extractor.py` - 文件解压器(支持 7z 格式)
  - `download_proxy.py` - 代理配置处理
  - `helper_app.py` - 辅助应用管理
  - `update_window.py` - 更新进度窗口

### 2. 新增 7z 解压支持
- 添加 `py7zr` 依赖用于处理 7z 格式压缩包
- 同步更新 `pyproject.toml` 和 `requirements.txt`
- 更新 `uv.lock` 锁定文件

### 3. 任务系统适配
- 新增 `tasks/version/app_update.py` 应用更新任务
- 重构 `tasks/version/__init__.py` 适配新模块接口
- 更新 `utils/tasks.py` 添加新任务支持

### 4. 本地化更新
- 更新全部 5 个语言文件:
  - zh_CN.json - 简体中文
  - zh_TW.json - 繁体中文
  - en_US.json - 英语
  - ja_JP.json - 日语
  - ko_KR.json - 韩语
- 新增更新相关的翻译字符串

### 5. 构建配置调整
- 更新 `March7th Updater.spec` 适配新模块结构

### 6. 界面适配
- 更新 `app/tools/check_update.py` 检查更新界面适配新接口
- 更新 `main.py` 添加新的初始化逻辑

## 影响
- 提高代码可维护性和可测试性
- 支持更多压缩格式
- 更好的模块化设计
2026-05-05 01:13:42 +08:00

61 lines
2.0 KiB
Python

"""命令行更新入口。
检测到新版本后启动 March7th Updater.exe 进行完整更新。
"""
from __future__ import annotations
import os
import subprocess
import sys
from module.config import cfg
from module.logger import log
from module.localization import tr
from module.update.update_engine import build_independent_process_env
from module.update.version_check import check_for_update
def start():
log.hr(tr("开始更新三月七小助手"), 0)
try:
source = getattr(cfg, "update_source", "GitHub")
cdk = getattr(cfg, "mirrorchyan_cdk", "")
prerelease = bool(getattr(cfg, "update_prerelease_enable", False))
log.debug(f"更新配置: source={source}, cdk={'***' if cdk else 'empty'}, prerelease={prerelease}")
info = check_for_update(source, cdk, prerelease)
if info is None:
log.info(tr("当前已是最新版本"))
log.hr(tr("完成"), 2)
return
log.info(f"{tr('发现新版本')}: {info.version} ({info.source})")
log.debug(f"下载URL: {info.url[:80]}..., 文件名: {info.file_name}")
# 启动更新程序
updater = os.path.abspath("./March7th Updater.exe")
if not os.path.exists(updater):
log.error(tr("未找到更新程序 March7th Updater.exe"))
log.hr(tr("完成"), 2)
return
log.info(tr("启动更新器"))
creationflags = (
getattr(subprocess, "DETACHED_PROCESS", 0)
| getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0)
)
command = [updater, info.url, info.file_name]
if info.sha256:
command.extend(["--sha256", info.sha256])
subprocess.Popen(
command,
creationflags=creationflags,
env=build_independent_process_env(),
close_fds=True,
)
sys.exit(0)
except Exception as e:
log.error(f"{tr('更新失败')}: {e}")
log.hr(tr("完成"), 2)