菜单

Git 集成

相关源文件

本文档介绍了 bat 的 Git 集成系统,该系统会检测并显示相对于 Git 索引的文件修改。Git 集成使 bat 在 Git 仓库内显示文件时,能够显示添加、修改和删除行的视觉指示符。

有关显示 Git 更改的视觉样式和装饰的信息,请参阅 样式组件和装饰

目的与范围

bat 中的 Git 集成系统提供以下功能:

  • 自动检测包含正在显示文件的 Git 仓库。
  • 将文件内容与 Git 索引进行比较以识别更改。
  • 将更改分类为不同的类型(添加、修改、删除)。
  • 与 bat 的显示系统集成以显示更改指示符。

该系统在 git 功能标志下进行条件编译,并使用 git2 crate 进行 Git 操作。

Git 集成架构

来源:src/diff.rs19-83

行更改分类系统

Git 集成使用 LineChange 枚举将文件更改分为四种不同的类型:

更改类型描述视觉指示器
Added (添加)添加到文件的新行。通常用 + 或绿色标记显示。
RemovedAbove (上方移除)在当前位置上方移除的行。当文件开头出现移除时,在第 1 行上方显示。
RemovedBelow (下方移除)在当前位置下方移除的行。对于文件中部的移除,显示在特定行位置。
Modified (修改)已更改的现有行。曾经存在但内容已更改的行。

来源:src/diff.rs10-15 src/diff.rs60-75

仓库发现和路径解析

Git 集成遵循特定流程来定位仓库和解析文件路径。

来源:src/diff.rs20-25

差异处理管道

核心差异处理使用 git2::Repository::diff_index_to_workdir() 来比较工作目录与 Git 索引。

来源:src/diff.rs27-34 src/diff.rs38-80

与显示系统集成

Git 集成输出一个 LineChanges 类型,该类型将行号映射到更改类型。

此数据结构与 bat 的打印机系统集成,以在语法高亮显示的内容旁边显示视觉更改指示器。更改信息由装饰系统使用,以渲染适当的视觉标记。

来源:src/diff.rs17

测试基础设施

Git 集成通过快照测试进行全面测试,该测试可验证不同样式组合的视觉输出。

测试套件包括对样式组合的全面覆盖。

  • 单个 changes 样式测试。
  • 组合样式,例如 changes,gridchanges,headerchanges,numbers
  • 所有样式组件的完整集成测试。

来源:tests/snapshot_tests.rs1-45 tests/snapshots/generate_snapshots.py9-18 tests/snapshots/sample.modified.rs1-24

功能标志集成

整个 Git 集成系统使用 git 功能标志进行条件编译。

这使得 bat 在不需要 Git 集成时可以不带 Git 依赖进行构建,从而减少了二进制文件大小和最小安装的依赖项。

来源:src/diff.rs1 tests/snapshot_tests.rs1 tests/snapshot_tests.rs8