[任务描述]
为了对齐核心的 Git 功能,需要为 libra 实现 tag 命令。该命令允许用户为项目历史中的重要节点(如版本发布、重要更新)创建永久性的引用标记。该功能应支持创建两种类型的标签:轻量标签(lightweight)和附注标签(annotated),并提供列出、查看和删除标签的能力,其核心行为应与 git tag 保持一致。
[功能特点]
- 创建标签:
- 轻量标签: 能够创建一个指向特定 commit 的简单指针,仅包含标签名称。
- 附注标签: 支持创建包含作者、日期、附注信息等元数据的完整对象。通过 -m 或 --message 参数创建。
- 列出标签: 提供 -l 或 --list 参数,用于展示所有已存在的标签列表。
- 查看标签: 当执行 libra tag <tag_name> 时,能够显示标签的详细信息。
- 对于轻量标签,显示其指向的 commit 的信息。
- 对于附注标签,除了显示 commit 信息外,还应展示标签自身的元数据(如 Tagger、日期和附注)。
- 删除标签: 提供 -d 或 --delete 参数,用于删除一个指定的标签引用。
[实现方案]
- 定义命令行接口 (libra/src/command/tag.rs)
在 TagArgs 结构体中使用 clap 来定义命令的参数和标志:
- name: String 类型,用于指定要创建、查看或删除的标签名。
- --message (-m): Option 类型,用于提供附注信息,它的存在与否决定了创建的是附注标签还是轻量标签。
- --list (-l): bool 类型,一个标志,用于触发列出标签的操作。
- --delete (-d): bool 类型,一个标志,与 name 参数配合使用,删除指定标签。
- 实现命令分发逻辑 (execute 函数)
根据解析后的 TagArgs,编写 execute 函数,将逻辑分发到不同的处理函数,如 create_tag()、list_tags()、show_tag() 和 delete_tag()。
- 开发核心内部模块 (libra/src/internal/tag.rs)
- create(): 实现创建标签的核心逻辑。检查 message 参数,如果存在,则构建一个 mercury 的 Tag 对象,计算其哈希,存入对象数据库,并创建指向该 tag 对象的引用。如果 message 不存在,则直接创建一个指向当前 HEAD commit 的引用。
- list(): 实现列出所有标签的功能。通过查询数据库中 refs/tags/ 前缀下的所有引用来实现。
- delete(): 实现删除标签的功能,即从数据库中移除对应的引用记录。
- find_tag_and_commit(): 实现查找逻辑,根据标签名找到对应的 Tag 对象或 Commit 对象,并最终解析出其指向的 Commit。
- 数据库集成
- 利用项目中已有的 reference 数据模型,将标签作为一种引用类型存储。
- 所有标签的引用路径统一为 refs/tags/<tag_name>。
[测试方案]
在 libra/src/command/tag.rs 文件末尾的 tests 模块中添加全面的单元和集成测试。
- 测试环境: 所有测试均应使用 tempfile 在隔离的临时目录中执行,确保测试之间互不干扰。
- 轻量标签测试:
- test_create_and_list_lightweight_tag: 测试成功创建、列出轻量标签。
- test_show_lightweight_tag: 验证查看轻量标签时能正确显示其指向的 commit 信息。
- 附注标签测试:
- test_create_and_list_annotated_tag: 测试成功创建、列出附注标签。
- test_show_annotated_tag: 验证查看附注标签时能正确显示标签自身的元数据和 commit 信息。
- 删除功能测试:
- test_delete_tag: 验证在删除一个标签后,该标签不再出现在列表中。
[任务描述]
为了对齐核心的 Git 功能,需要为 libra 实现 tag 命令。该命令允许用户为项目历史中的重要节点(如版本发布、重要更新)创建永久性的引用标记。该功能应支持创建两种类型的标签:轻量标签(lightweight)和附注标签(annotated),并提供列出、查看和删除标签的能力,其核心行为应与 git tag 保持一致。
[功能特点]
[实现方案]
在 TagArgs 结构体中使用 clap 来定义命令的参数和标志:
根据解析后的 TagArgs,编写 execute 函数,将逻辑分发到不同的处理函数,如 create_tag()、list_tags()、show_tag() 和 delete_tag()。
[测试方案]
在 libra/src/command/tag.rs 文件末尾的 tests 模块中添加全面的单元和集成测试。