Skip to content

feat: use mcpp.lock commit as offline anchor for git branch dependencies #329

Description

@ZheFeng7110

问题

[dependencies] ccc = { git = "https://github.com/ZheFeng7110/ccc", branch = "develop" } 这种 branch 引用的 git 依赖,每次 mcpp build 都会执行 git ls-remote,即使 mcpp.lock 已经锁定了具体 commit。

当前 src/build/prepare.cppm 对 branch 依赖的处理是:每次 build 都 ls-remote 分支 HEAD,然后解析为 commit 再作为缓存 key。这导致:

  • 慢网络下频繁等待
  • 离线/无网环境下构建失败
  • mcpp.lock 的“锁定语义”不一致

期望行为

mcpp.lock 作为 git 依赖的离线锚点:

  • 若 lock 已记录该 git 依赖的 commit,且本地 ~/.mcpp/git/<hash> 缓存的 HEAD 与 lock commit 一致,则直接复用缓存,不再 ls-remote
  • 仅当 lock 不存在/无该包/无 commit/缓存 commit 不匹配时,才执行网络请求。
  • mcpp update 清除 lock 条目后,下次 build 重新 ls-remote 并写入新 commit。
  • revtag 也纳入 lock 决策,保持统一语义。

离线模式

  • --offline 下,若 lock 有 commit 且缓存命中,应允许构建。
  • 若 lock 有 commit 但缓存缺失,离线模式应失败(无法 clone)。
  • 若 lock 无 commit,离线模式应失败,提示需要先用非离线模式或 mcpp update

涉及模块

  • src/pm/lock_io.cppm:新增 lock 中 git source 的解析工具
  • src/build/prepare.cppm:读取 lock、命中 branch 缓存、离线模式
  • tests/e2e/24_git_dependency.sh:增加 branch 锁定/不重新 ls-remote 的用例

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions