Skip to content

[r2cn-测试任务] 为 libra 的 branch 命令添加 -d 参数(安全删除) #168

@Nook001

Description

@Nook001

[具体描述] branch -d 具体功能描述
Git 的 -d 选项会在删除分支前检查该分支是否已完全合并到当前 HEAD。如果分支包含
未合并的提交,-d 会拒绝删除并提示用户使用 -D 强制删除。

安全删除的特点:

  1. 检查分支是否已合并:通过遍历提交图判断分支的所有提交是否都可以从
    当前 HEAD 到达。
  2. 防止数据丢失:拒绝删除包含未合并工作的分支,避免意外丢失代码。
  3. 提供明确提示:告知用户分支未合并,并建议使用 -D 强制删除。
  • libra branch -d merged-branch → 成功删除已合并分支
  • libra branch -d unmerged-branch → 拒绝删除并提示错误
  • libra branch -D any-branch → 强制删除(已有实现)

[实现方案] branch -d 实现方案描述

  1. 在 BranchArgs 结构体中使用已存在的 delete_safe 字段(对应 -d 参数),
    通过 clap 库的 Parser trait 解析命令行参数。

  2. 在 execute 函数中添加 delete_safe 的处理分支,并且使用 Rust 惯用的
    if let Some(name) = args.delete_safe 模式替代 is_some() + unwrap()

  3. 实现 delete_branch_safe 函数,包含完整的合并检查逻辑:

    • 检查分支是否存在
    • 检查是否尝试删除当前分支
    • 获取 HEAD 和待删除分支的所有可达提交(使用 log::get_reachable_commits)
    • 使用 HashSet 检查分支的所有提交是否都在 HEAD 的历史中
    • 如果未完全合并,输出错误信息并建议使用 -D
    • 如果已合并,执行删除并显示确认信息
  4. 编写集成测试 test_branch_delete_safe,覆盖两个场景:

    • 场景 1:创建未合并的 feature 分支,验证 -d 拒绝删除
    • 场景 2:将 master 快进到 feature 提交后,验证 -d 成功删除
    • 同时验证所有现有的 8 个 branch 测试仍然通过
  5. 更新 README.md 兼容性表格,将 branch -d 从 ⛔ (P1) 更新为 ✅。

[测试验证]

  • 所有 8 个 branch 相关测试通过 ✅
  • 新增的 test_branch_delete_safe 测试通过 ✅
  • 编译无警告(仅有预存在的 3 个 unused import 警告)

[技术细节]

  • 采用模式匹配 if let 处理 Option 类型,避免不安全的 unwrap
  • 遵循项目现有的代码风格和命名约定

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions