已关闭
feat: 实现 cjv self update 自更新功能 #1
huqi创建于  8月4日关闭于  4 天前
huqi
huqi成员
8月4日 创建

缺口

cjv self update 当前是空 stub,直接返回错误:

// src/self_update.rs
pub fn self_update() -> Result<()> {
    Err(CjvError::InvalidArgument(
        "cjv self update is not implemented in this beta; install a newer release manually"
            .to_string(),
    ))
}

README 命令参考表里也标注为"暂未实现;当前 beta 会明确报错"。同时 cmd_updatesrc/cli.rs)在 auto-self-update=enable 时会跳过并打印同一句"not implemented"提示——本 issue 一并移除。

实现方案(最小闭环,单 PR)

1. 下载源

复用 install.sh 已定义的发布规律:

https://github.com/cj-awesome/cjv/releases/download/v{VERSION}/cjv-{GOOS}-{GOARCH}.tar.gz
https://atomgit.com/cj-awesome/cjv/releases/download/v{VERSION}/cjv-{GOOS}-{GOARCH}.tar.gz  (镜像)

其中 {GOOS}-{GOARCH} 由现有 utils::current_platform() 产出(linux-amd64 / darwin-arm64 / windows-amd64)。VERSION 取仓内 CARGO_PKG_VERSION 前缀(如 0.3.0-beta → 查 release tag v0.3.0-beta)。

2. 流程

  1. 调用 GitHub/AtomGit Releases API 查最新 tag(按创建时间倒序,首个非 pre-release / 或直接取 latest);若失败回退到 AtomGit 镜像
  2. 与当前 CARGO_PKG_VERSION 比较;一致则提示已是最新并返回
  3. 下载 cjv-{platform}.tar.gz 到临时目录(复用 dist::download_file
  4. 校验 SHA256(若 release 附 .sha256 文件则下载并比对,否则警告跳过——与 install.sh 行为一致)
  5. 解压到临时目录(复用 dist::extract_archive
  6. 替换当前可执行文件:
    • Unix:std::fs::rename 原子替换当前 std::env::current_exe();若目标在只读挂载则回退到 ~/.cjv/bin/cjv
    • Windows:先 rename 现有二进制为 cjv.exe.old(重启时清理),再写入新二进制
  7. 打印新版本号与下一步提示(重启生效)

3. cmd_update 联动

cli.rs::cmd_updateauto_self_update=enable 分支改为调用 self_update::self_update(),成功后继续更新工具链;失败时按 auto-self-update=check 提示用户手动执行。

4. 镜像回退

下载 URL 优先 GitHub;失败(429/5xx/超时)回退 AtomGit 镜像。两源均失败时返回明确错误。

5. 测试

  • 单元:resolve_latest_release_tag 解析 logic(mock JSON)
  • 不跑网络测试(CI 限制)
  • cargo test 全通过

6. 文档

  • README �命令参考表 cjv self update 行改为"已实现"
  • 移除 README 中"暂未实现"的脚注

�范围边界

  • 不实现 cjv self update --version <ver>指定版本(issue 未要求)
  • 不动 self_uninstall 现有行为
  • 不动 init_cmd/downloads purge 等其他自管理命令

请确认方向是否 OK,确认后即开始编码。

likedislike
huqi
huqi成员
8月4日 评论:

领取本 issue,按上述方案开始实现。fork 已建:huqi/fork-cjv,分支 feat/self-update。

likedislike
huqihuqi成员
8月4日 关联了pull request:feat(self-update): 实现 cjv self update 自更新功能
晓明同学晓明同学成员
4 天前 关闭了 issue