Skip to content

Commit 3fc5acd

Browse files
committed
BB-75: test Libra browser tag deletion
Signed-off-by: Eli Ma <eli@patch.sh>
1 parent a9dbd57 commit 3fc5acd

5 files changed

Lines changed: 81 additions & 6 deletions

File tree

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mega2"
3-
version = "0.41.69"
3+
version = "0.41.70"
44
edition = "2024"
55
license = "MIT OR Apache-2.0"
66
description = "Monorepo engine and Git hosting server for AI agents: trunk-based storage, Git Smart HTTP, Git LFS, OCI registry, and Agent Session Capture"

‎docs/deploy-trunk.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,4 +436,4 @@ CASE='<case>'
436436
docker compose -p mega2-trunk -f docker/docker-compose-storage-only.yml --profile interop exec -T -e MEGA2_SMOKE_CASE="$CASE" interop-smoke bash /repo/scripts/libra_smoke_storage_only.sh 2>&1 | tee target/tmp/bb-libra-case.log
437437
```
438438

439-
已登记 case:`LIBRA clone HTTP`、`LIBRA fetch HTTP`、`LIBRA ls-remote HTTP`、`LIBRA trunk push HTTP`、`LIBRA multi-commit push HTTP`、`LIBRA reject unauthenticated push`、`LIBRA reject tag push`、`LIBRA reject non-main branch push`、`LIBRA clone SSH`、`LIBRA reject SSH push`、`LIBRA LFS push and clone`、`LIBRA browser list root`、`LIBRA browser list at ref`、`LIBRA browser unknown path`、`LIBRA browser list text`、`LIBRA browser create dir`、`LIBRA browser delete dir`、`LIBRA browser move dir`、`LIBRA browser rename dir`、`LIBRA browser list tags`、`LIBRA browser tags page two`、`LIBRA browser create lightweight tag`、`LIBRA browser create annotated tag`。HTTP clone case 在 `/project` 写入带 `RUN_ID` 的种子文件,并用只读 Git clone 对照 Libra 克隆的文件 SHA-256;fetch case 在克隆后新增服务端文件,以只读 Git `ls-remote` 对照 Libra 的 `origin/main`;ls-remote case 对照两个客户端读取的 `refs/heads/main` OID;trunk push case 通过 stdin 在隔离 HOME 中配置加密存储的环回 HTTP token,再用不含凭据的 `origin` 推送一个 Libra commit,由只读 Git 观察者验证 tip 与文件内容;multi-commit push case 一次推送三个连续 Libra commit,并由 Git 观察者核对三个文件内容;无凭据推送 case 使用全新 HOME 和 Libra 配置库,确认认证拒绝且 Git 观察者所见的远端 tip 不变;tag push case 使用隔离凭据推送唯一标注 tag,检查服务端明确拒绝且 Git 观察者未见远端 tag;非 main 推送 case 用本地 `main` 作为来源尝试写入唯一远端分支,检查服务端 trunk 拒绝且 Git 观察者未见远端分支;SSH clone case 用隔离 known_hosts 严格校验环回 SSH 主机,比较 Libra SSH clone 与只读 Git HTTP 观察者的 `/project` tip 和种子文件 SHA-256。当前 Libra SSH 客户端从 URL 路径去掉首个斜杠,因此 SSH URL 使用 `ssh://git@127.0.0.1:2222//project`,使服务端收到绝对路径 `/project`。为兼容已有 LFS 指针的仓库,该 case 先通过 SSH `--no-checkout` 拉取 Git 对象,再临时把 origin 指向同一 `/project` 的 HTTP LFS 端点检出工作区,核对后恢复 SSH origin。SSH push case 在已验证的 SSH 克隆中提交新文件,要求 Libra 推送非零退出、隔离 SSH stderr 含服务端关闭 receive-pack 的明确拒绝,且只读 Git 观察者看到的远端 tip 不变。LFS case 跟踪 `*.bin`,在隔离 clone 中经 `commit -a` 生成 1 MiB 对象并推送,以只读 Git 观察者确认远端 LFS pointer 的 OID 与大小,再用全新 Libra clone 核对 SHA-256;默认栈的 upload action 给出 `Content-Length`,RustFS presigned PUT 可直接使用。browser root case 在非 TTY 中比较 Libra JSON 的 `items[].name` 与 HTTP `/api/v1/tree?path=/` 的名称集合。browser ref case 先创建根标签并记录 `/project` 历史列表,再在 main 写入唯一文件,确认 `--ref <tag>` 的列表保持不变而当前列表包含该文件;完成后尽力删除临时根标签。browser unknown-path case 注入仅供泄漏检测的哨兵环境 token,要求命令非零退出、stderr 为含 HTTP 404 的 `LBR-NET-002` JSON、stdout 为空,并确认 stdout 与 stderr 都不含该 token。browser list-text case 先用 0600 header 文件在 `/project` 创建唯一目录,再在非 TTY 中要求 stdout 含精确 `dir <NAME>` 行、不是 JSON 且 stderr 为空,并以匿名 tree API 的 `content_type=directory` 核对同名目录。browser create-dir case 用 0600 token 文件执行一次 JSON 写操作,核对完整 target 与非空 receipt,再以不带 token 的匿名 tree API 确认同名目录及其类型。browser delete-dir case 用 curl 创建并匿名确认唯一目录,再用 0600 token 文件执行 JSON 删除操作,核对完整 target 与非空 receipt,并以匿名 tree API 确认同名条目消失。browser move-dir case 用 curl 创建并匿名确认唯一源目录与目标父目录,再用 0600 token 文件执行 JSON 移动操作,核对完整 from/to target 与非空 receipt,并从源、目标两侧匿名确认移动结果。browser rename-dir case 用 curl 创建并匿名确认旧名目录且新名不存在,再用 0600 token 文件执行 JSON 改名操作,核对共享父目录的完整 from/to target 与非空 receipt,并匿名确认旧名消失、新名目录出现。browser list-tags case 用 curl 创建唯一 annotated root tag,再分别通过无凭据 Libra JSON 与匿名 HTTP API 查询第一页两个 tag,逐序比较名称与总数,最后删除夹具 tag。browser tags-page-two case 用 curl 创建两个唯一 annotated root tag,再比较 Libra 与匿名 HTTP API 的第二页单条结果和总数,同时确认 HTTP 第一、二页名称不同,最后删除两个夹具 tag。browser create-lightweight-tag case 以只读 Git 记录 root HEAD,用 0600 token-file 经 Libra 创建轻量 root tag,再以匿名 tag GET 确认 tag_id 和 object_id 均为该 HEAD,随后删除夹具并扫描 token。browser create-annotated-tag case 以只读 Git 记录 root HEAD,用 0600 token-file 经 Libra 创建带 message 的 annotated root tag,再以匿名 tag GET 确认 message、object_id 与 HEAD 一致且 tag_id 不同,随后删除夹具并扫描 token。客户端工作目录运行后清理。点名尚未登记的 case 退出 2。后续 BB-75 继续登记剩余互通场景。
439+
已登记 case:`LIBRA clone HTTP`、`LIBRA fetch HTTP`、`LIBRA ls-remote HTTP`、`LIBRA trunk push HTTP`、`LIBRA multi-commit push HTTP`、`LIBRA reject unauthenticated push`、`LIBRA reject tag push`、`LIBRA reject non-main branch push`、`LIBRA clone SSH`、`LIBRA reject SSH push`、`LIBRA LFS push and clone`、`LIBRA browser list root`、`LIBRA browser list at ref`、`LIBRA browser unknown path`、`LIBRA browser list text`、`LIBRA browser create dir`、`LIBRA browser delete dir`、`LIBRA browser move dir`、`LIBRA browser rename dir`、`LIBRA browser list tags`、`LIBRA browser tags page two`、`LIBRA browser create lightweight tag`、`LIBRA browser create annotated tag`、`LIBRA browser delete tag`。HTTP clone case 在 `/project` 写入带 `RUN_ID` 的种子文件,并用只读 Git clone 对照 Libra 克隆的文件 SHA-256;fetch case 在克隆后新增服务端文件,以只读 Git `ls-remote` 对照 Libra 的 `origin/main`;ls-remote case 对照两个客户端读取的 `refs/heads/main` OID;trunk push case 通过 stdin 在隔离 HOME 中配置加密存储的环回 HTTP token,再用不含凭据的 `origin` 推送一个 Libra commit,由只读 Git 观察者验证 tip 与文件内容;multi-commit push case 一次推送三个连续 Libra commit,并由 Git 观察者核对三个文件内容;无凭据推送 case 使用全新 HOME 和 Libra 配置库,确认认证拒绝且 Git 观察者所见的远端 tip 不变;tag push case 使用隔离凭据推送唯一标注 tag,检查服务端明确拒绝且 Git 观察者未见远端 tag;非 main 推送 case 用本地 `main` 作为来源尝试写入唯一远端分支,检查服务端 trunk 拒绝且 Git 观察者未见远端分支;SSH clone case 用隔离 known_hosts 严格校验环回 SSH 主机,比较 Libra SSH clone 与只读 Git HTTP 观察者的 `/project` tip 和种子文件 SHA-256。当前 Libra SSH 客户端从 URL 路径去掉首个斜杠,因此 SSH URL 使用 `ssh://git@127.0.0.1:2222//project`,使服务端收到绝对路径 `/project`。为兼容已有 LFS 指针的仓库,该 case 先通过 SSH `--no-checkout` 拉取 Git 对象,再临时把 origin 指向同一 `/project` 的 HTTP LFS 端点检出工作区,核对后恢复 SSH origin。SSH push case 在已验证的 SSH 克隆中提交新文件,要求 Libra 推送非零退出、隔离 SSH stderr 含服务端关闭 receive-pack 的明确拒绝,且只读 Git 观察者看到的远端 tip 不变。LFS case 跟踪 `*.bin`,在隔离 clone 中经 `commit -a` 生成 1 MiB 对象并推送,以只读 Git 观察者确认远端 LFS pointer 的 OID 与大小,再用全新 Libra clone 核对 SHA-256;默认栈的 upload action 给出 `Content-Length`,RustFS presigned PUT 可直接使用。browser root case 在非 TTY 中比较 Libra JSON 的 `items[].name` 与 HTTP `/api/v1/tree?path=/` 的名称集合。browser ref case 先创建根标签并记录 `/project` 历史列表,再在 main 写入唯一文件,确认 `--ref <tag>` 的列表保持不变而当前列表包含该文件;完成后尽力删除临时根标签。browser unknown-path case 注入仅供泄漏检测的哨兵环境 token,要求命令非零退出、stderr 为含 HTTP 404 的 `LBR-NET-002` JSON、stdout 为空,并确认 stdout 与 stderr 都不含该 token。browser list-text case 先用 0600 header 文件在 `/project` 创建唯一目录,再在非 TTY 中要求 stdout 含精确 `dir <NAME>` 行、不是 JSON 且 stderr 为空,并以匿名 tree API 的 `content_type=directory` 核对同名目录。browser create-dir case 用 0600 token 文件执行一次 JSON 写操作,核对完整 target 与非空 receipt,再以不带 token 的匿名 tree API 确认同名目录及其类型。browser delete-dir case 用 curl 创建并匿名确认唯一目录,再用 0600 token 文件执行 JSON 删除操作,核对完整 target 与非空 receipt,并以匿名 tree API 确认同名条目消失。browser move-dir case 用 curl 创建并匿名确认唯一源目录与目标父目录,再用 0600 token 文件执行 JSON 移动操作,核对完整 from/to target 与非空 receipt,并从源、目标两侧匿名确认移动结果。browser rename-dir case 用 curl 创建并匿名确认旧名目录且新名不存在,再用 0600 token 文件执行 JSON 改名操作,核对共享父目录的完整 from/to target 与非空 receipt,并匿名确认旧名消失、新名目录出现。browser list-tags case 用 curl 创建唯一 annotated root tag,再分别通过无凭据 Libra JSON 与匿名 HTTP API 查询第一页两个 tag,逐序比较名称与总数,最后删除夹具 tag。browser tags-page-two case 用 curl 创建两个唯一 annotated root tag,再比较 Libra 与匿名 HTTP API 的第二页单条结果和总数,同时确认 HTTP 第一、二页名称不同,最后删除两个夹具 tag。browser create-lightweight-tag case 以只读 Git 记录 root HEAD,用 0600 token-file 经 Libra 创建轻量 root tag,再以匿名 tag GET 确认 tag_id 和 object_id 均为该 HEAD,随后删除夹具并扫描 token。browser create-annotated-tag case 以只读 Git 记录 root HEAD,用 0600 token-file 经 Libra 创建带 message 的 annotated root tag,再以匿名 tag GET 确认 message、object_id 与 HEAD 一致且 tag_id 不同,随后删除夹具并扫描 token。browser delete-tag case 经 curl 创建并匿名确认唯一 annotated root tag,再用 0600 token-file 经 Libra 删除,核对删除 receipt 和匿名 GET 404;失败时清理夹具。客户端工作目录运行后清理。点名尚未登记的 case 退出 2。

‎docs/plan/plan-20261001.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Storage-only 形态 OCI / Artifacts / Libra 客户端黑盒 smoke 计划(2026-10-01)
22

33
**模板版本:** v2.1;依据 [`plan-template.md`](plan-template.md)。源码核对日期 2026-10-01;tip `da6e895`(R10 时刷新;`7b2a435` 之后另一会话发布了 license / README 元数据与 `v0.41.0`「默认 `push_policy` 改为 trunk、文档一致性」),crate `0.41.0`。各卡开工时仍按 GC-01 刷新锚点。
4-
**计划状态:** **实施中**。原始事实基线与 R1–R11 评审记录保留成稿时状态;逐卡进度以各卡 `Lifecycle / Acceptance` 和发布证据为准。BB-72 已发布 v0.41.67 且 Docker D 组成功;BB-73 已发布 v0.41.68 且 Docker D 组成功;BB-74 本地验收通过,待 v0.41.69 的远端 D 组。
4+
**计划状态:** **实施中**。原始事实基线与 R1–R11 评审记录保留成稿时状态;逐卡进度以各卡 `Lifecycle / Acceptance` 和发布证据为准。BB-72 已发布 v0.41.67 且 Docker D 组成功;BB-73 已发布 v0.41.68 且 Docker D 组成功;BB-74 已发布 v0.41.69 且 Docker D 组成功;BB-75 实施中。
55

66
## 文档职责
77

@@ -4746,7 +4746,7 @@
47464746
### Task BB-74: LIBRA browser create annotated tag
47474747
47484748
**Task type:** `implementation`\
4749-
**Lifecycle / Acceptance:** `in-progress` / `remote-pending`(单例 1/1、完整回归 23/23;annotated message、写前 HEAD、tag_id/object_id 关系、匿名 GET 与清理均通过;单例与整跑日志 token 零命中;bash -n、ShellCheck warning 级、nightly fmt、全目标全特性 Clippy 通过;代码复核 PASS;`.env.test` 全量 cargo test 18 目标 / 2055 通过 / 0 失败 / 1 ignored;cargo build 无警告,cargo build --tests 退出 0 但有已记录的 macOS `ld: __eh_frame section too large` 警告。待推送 v0.41.69 并核对 Docker D 组)\
4749+
**Lifecycle / Acceptance:** `done` / `complete`(v0.41.69 / `a9dbd5743d2ddc954f01b88e19668e7b6078116b`;单例 1/1、完整回归 23/23;annotated message、写前 HEAD、tag_id/object_id 关系、匿名 GET 与清理均通过;单例与整跑日志 token 零命中;bash -n、ShellCheck warning 级、nightly fmt、全目标全特性 Clippy 通过;代码复核 PASS;`.env.test` 全量 cargo test 18 目标 / 2055 通过 / 0 失败 / 1 ignored;cargo build 无警告,cargo build --tests 退出 0 但有已记录的 macOS `ld: __eh_frame section too large` 警告;main、标注 tag、人工 Release 已发布且 body 比对通过;Docker Actions `37255418940` job `111591304005` success)\
47504750
**Description:** 自 R12 未提交草案 BB-71 的建 tag 场景拆出(成稿主卡 BB-73)。在 `scripts/libra_smoke_storage_only.sh` 注册唯一 case `LIBRA browser create annotated tag`。唯一行为轴:非交互创建 annotated root tag。夹具与调用:写前用 `git ls-remote "$MEGA2_BASE_URL/" HEAD` 记录 root HEAD OID,再带 0600 token-file 执行 `--create-tag <NAME> --message <TEXT> /`。使用 `RUN_ID` 避免依赖旧数据;写命令的 token 只经本 case 隔离目录下 0600 `--token-file`,读命令不带 token flag;curl 写夹具也用 0600 header 文件。tag 夹具创建后按本次 run id 清理(BB-75 被测删除除外)。\
47514751
**Out of scope:** 其它 browser case、产品 `src/**` 修复、既有 curl + git smoke 脚本;发现缺陷按 ER-10 另立 `FIX-*`。\
47524752
**Current evidence:** [Libra v0.30.26 的命令参数](https://github.com/libra-tools/libra/blob/fc85e6eb65595b4219c13a4e684c413e0f7cac46/src/command/mega2.rs#L123-L185) 与 [操作实现](https://github.com/libra-tools/libra/blob/fc85e6eb65595b4219c13a4e684c413e0f7cac46/src/command/mega2_browser/noninteractive.rs#L236-L390);本仓 `src/api/router/preview_router.rs`、`src/api/router/tag_router.rs`。开工按 GC-01 刷新行号和镜像版本。\
@@ -4799,7 +4799,7 @@
47994799
### Task BB-75: LIBRA browser delete tag
48004800
48014801
**Task type:** `implementation`\
4802-
**Lifecycle / Acceptance:** `pending` / (空)\
4802+
**Lifecycle / Acceptance:** `in-progress` / `remote-pending`(单例 1/1、完整 Libra 回归 24/24;唯一 annotated 夹具写前匿名 GET 200、Libra 删除 receipt、写后匿名 GET 404;单例与整跑日志 token 零命中;bash -n、ShellCheck warning 级、nightly fmt、全目标全特性 Clippy 通过;代码复核 PASS;cargo build 无警告,cargo build --tests 退出 0 但有已记录的 macOS `ld: __eh_frame section too large` 警告。`.env.test` 全量 cargo test 首轮仅既有 SSH 浅 fetch 夹具在运行三天的 Docker bind mount 中报 `.gitkeep` 消失;重启 `mega2-it-git-cli-1` 后精确复跑 1/1,第二轮原样全量 18 目标 / 2055 通过 / 0 失败 / 1 ignored。待推送 v0.41.70 并核对 Docker D 组)\
48034803
**Description:** 在 `scripts/libra_smoke_storage_only.sh` 注册唯一 case `LIBRA browser delete tag`。唯一行为轴:非交互删除 root tag。夹具与调用:经 curl 建唯一 root tag 并确认存在,带 0600 token-file 执行 `--delete-tag <NAME> /`。使用 `RUN_ID` 避免依赖旧数据;写命令的 token 只经本 case 隔离目录下 0600 `--token-file`,读命令不带 token flag;curl 写夹具也用 0600 header 文件。tag 夹具创建后按本次 run id 清理(BB-75 被测删除除外)。\
48044804
**Out of scope:** 其它 browser case、产品 `src/**` 修复、既有 curl + git smoke 脚本;发现缺陷按 ER-10 另立 `FIX-*`。\
48054805
**Current evidence:** [Libra v0.30.26 的命令参数](https://github.com/libra-tools/libra/blob/fc85e6eb65595b4219c13a4e684c413e0f7cac46/src/command/mega2.rs#L123-L185) 与 [操作实现](https://github.com/libra-tools/libra/blob/fc85e6eb65595b4219c13a4e684c413e0f7cac46/src/command/mega2_browser/noninteractive.rs#L236-L390);本仓 `src/api/router/preview_router.rs`、`src/api/router/tag_router.rs`。开工按 GC-01 刷新行号和镜像版本。\

0 commit comments

Comments
 (0)