feat(core): M150 新增 GitHub Releases 更新源(D50)
D50 定案 GitHub Releases 为唯一更新源,清单地址固定为 `releases/latest/download/manifest.json`。此前 update 模块只有对拍用的 DirSource,这次把真实源补上。 - `update::github::GitHubReleaseSource` 实现 `UpdateSource`:清单从 `<base>/<owner>/<repo>/releases/latest/download/manifest.json` 取, 产物按 D49 命名规则(文件名)拼到同一条 latest/download 路径下;清单里 已写完整 http(s) 地址的原样使用。 - 网络全走 `core::download`,不新造栈:包体交给引擎 `download()`(镜像展开 → 地区判定 → 健康度排序 → 退避 → 续传 → 原子落盘),清单走引擎的 `plan()` + 共享 client 逐候选取文本(与 `game::java` 的一锤子 GET 同一手法)。 两条路径都吃到 mirrors.json 与地区档案里生效的 gh-proxy 前缀。 - 可配置面只有 owner/repo(默认 AskaEth/Unlucky-Launcher)与 base(默认 https://github.com,测试指向本地假服务);渠道只有 stable 有清单, beta/alpha/nightly 返回 Ok(None)(D50「先只发 stable」),清单 404 也算 「还没发布」而不是错误。 - `UpdateErrorKind` 新增 `Network`:远端取字节失败(连不上/超时/5xx/候选全挂) 与本地 IO 分开——前者可重试,后者重试无意义。引擎把逐源失败压成 AllSourcesFailed,本源从失败摘要里还原「所有源都 404」为 SourceMissing (产物没上传不该被报成网络抖动)。 - 校验仍只有一处:包体请求只带 expected_size,长度/摘要双检留在 `update::verify`(与 DirSource 同口径)。 - 单测 13 条,全程离线(假 HTTP 服务在 127.0.0.1):固定清单地址、产物 URL 解析、自定义 base/owner/repo、清单 404/非 JSON/字段非法/渠道不符/5xx 各自 归到白名单分类、产物下载、产物 404 → SourceMissing、镜像优先下 gh-proxy 前缀(清单与产物都验)、与 DirSource 同清单同产物选择结果一致。
This commit is contained in:
1 parent
afdbc9fd51
commit
f001b93942
7 files changed
+945
-18
No files matched your search
@@ -1,8 +1,9 @@
|
||||
//! 自更新内核:版本比较、发布清单、渠道准入、下载校验、原子替换。
|
||||
//!
|
||||
//! 用户已定的主线是「安装包 + 自动更新通道」,但**更新源还没拍板**。所以这一层只做与源无关
|
||||
//! 的部分,源本身是插拔的 [`UpdateSource`]:core 里没有任何 CDN 常量、没有任何厂商名,
|
||||
//! 接哪家由上层注入(本地目录源 [`DirSource`] 是内置的对照/测试实现)。
|
||||
//! 更新源已定(D50):**GitHub Releases 是唯一更新源**,真实实现在
|
||||
//! [`GitHubReleaseSource`](清单固定地址 + 产物走 `core::download` 引擎)。
|
||||
//! 这一层仍然保持源无关:核心只认 [`UpdateSource`] 三个方法,接哪家由上层注入
|
||||
//! (本地目录源 [`DirSource`] 留作对拍基准与内网手工分发)。
|
||||
//!
|
||||
//! 设计输入:`DevDocs/analyse/07-settings-packaging-update-p2.md` §4(HMCL 自更新)与 §6.2
|
||||
//! (多平台清单扩展)。我们抄骨架、补两处 HMCL 明确放弃的东西:**回滚**与**按平台分发**。
|
||||
@@ -23,9 +24,9 @@
|
||||
//! ```text
|
||||
//! version 语义化版本解析与排序(alpha/beta/rc、build metadata) channel 渠道阶梯与准入
|
||||
//! manifest 清单模型 + JSON 校验 target 目标平台与包形态
|
||||
//! source UpdateSource trait + 本地目录源 verify 暂存 + 长度/摘要校验
|
||||
//! checker 选择哪一份发布、急不急 install 原子替换 + 回滚
|
||||
//! error 分类与文案
|
||||
//! source UpdateSource trait + 本地目录源 github GitHub Releases 源(D50)
|
||||
//! verify 暂存 + 长度/摘要校验 checker 选择哪一份发布、急不急
|
||||
//! install 原子替换 + 回滚 error 分类与文案
|
||||
//! ```
|
||||
//!
|
||||
//! # 刻意不做的事
|
||||
@@ -40,6 +41,7 @@
|
||||
pub mod channel;
|
||||
pub mod checker;
|
||||
pub mod error;
|
||||
pub mod github;
|
||||
pub mod install;
|
||||
pub mod manifest;
|
||||
pub mod source;
|
||||
@@ -53,6 +55,7 @@ pub use crate::platform::os_info::OsFamily;
|
||||
pub use self::channel::Channel;
|
||||
pub use self::checker::{CheckOutcome, UpdateCandidate, UpdateChecker, Urgency};
|
||||
pub use self::error::{UpdateError, UpdateErrorKind};
|
||||
pub use self::github::GitHubReleaseSource;
|
||||
pub use self::install::{
|
||||
backup_path, install_staged, InstallFailure, InstallReceipt, ReplacePolicy,
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user