Skip to content

补齐 Git Log 引用右键操作并统一 Windows/macOS 的 Rust Core 能力 #293

Description

@1lck

背景

Windows 端的 Git Log 引用树目前右键没有反应。生产环境会统一禁用 WebView 原生右键菜单,而 Git 引用树没有接入应用自己的 ContextMenu。

macOS 端已经有部分 Git 引用右键操作,但远程分支相关动作不完整。两个平台的 Git 行为不应分别实现:确定性的 Git 命令构造、参数校验、引用解析和结果模型应继续统一放在 rust/lithe-core,Windows 和 macOS 只负责 UI、状态编排及平台边界适配。

目标

以“当前本地分支为 main,选中远程引用 origin/feature”为例,在 Windows 和 macOS 的 Git Log 引用树中提供一致的核心操作:

  1. 检出选中引用
  2. 从选中引用新建分支
  3. 检出选中分支,并将其变基到操作前的当前分支
  4. 与当前分支比较
  5. 显示与工作树的差异
  6. 将当前分支变基到选中引用
  7. 将选中引用合并到当前分支
  8. 使用变基将选中的远程分支拉入当前分支
  9. 使用合并将选中的远程分支拉入当前分支

标签仅保留适用操作;例如 tag 不显示远程拉取,当前分支不显示会对自身执行的检出、合并或变基。

架构约束

调用链保持如下:

  • macOS:SwiftUI -> GitFeatureModel/GitService -> RustGitOperations -> C ABI -> rust/lithe-core
  • Windows:React -> Git API -> Tauri platform_invoke -> lithe_core::execute_json

具体要求:

  • rust/lithe-core 负责共享 Git 语义、完整引用校验、命令参数构造和稳定错误。
  • shared/contracts 与 shared/fixtures 记录新增的跨平台行为。
  • Windows 不新增另一套 Git 实现,也不能把远程引用强制包装为 refs/heads/*。
  • macOS 不直接从 View 调用 Rust C ABI,工作流仍由 GitFeatureModel 和 GitService 编排。
  • 两个平台传递完整 GitReference,包括 fullName、shortName 和 kind。
  • 继续通过结构化参数执行 Git,不通过 shell 拼接命令。

当前差距

Windows

  • GitReferenceTree 只有左键选择,没有应用内右键菜单。
  • 全局禁用了原生右键菜单,因此用户看到的是“右键无反应”。
  • checkout 固定使用 referenceKind: local。
  • merge、rebase 和部分创建分支路径会把输入强制转换为 refs/heads/,无法正确处理 refs/remotes/
  • 缺少“引用与工作树比较”的专用 UI/API 入口。
  • 需要补齐确认框、分支名输入框、执行中禁用、成功/失败提示和冲突状态刷新。

macOS

  • 已有“从引用新建分支”“与工作树比较”“选择/执行引用比较”。
  • checkout、merge、rebase 等操作目前主要限制在本地引用。
  • 远程 checkout 的 Rust 适配能力已经存在,但 Git Log 右键菜单没有完整暴露。
  • 需要补齐“检出并变基”和“按合并/变基策略拉入选中远程引用”等工作流。

Rust Core

现有能力可直接复用:

  • createBranch
  • checkout(支持 local、remote、tag,远程分支可创建 tracking branch)
  • merge
  • rebase
  • fetch
  • pull(当前分支 upstream)
  • git.diff / git.comparison
  • checkoutPreflight / integrationPreflight
  • 冲突 continue、abort、skip

建议仅为确实缺失的共享语义扩展 Core:

  1. checkoutAndRebase:记录操作前的当前本地分支,检查工作树,检出选中的本地/远程分支,再将检出后的分支变基到原当前分支。
  2. 显式远程引用拉取:pull 接收完整 refs/remotes// 与 merge/rebase 策略,由 Core 安全拆解 remote 和 branch 并执行,不由 TS/Swift 拼 Git 参数。

实施方案

1. 共享契约与 Rust Core

  • 更新 shared/contracts/rust-core-api.md。
  • 先更新 shared/fixtures/git/write.json,再让第二个平台消费新增行为。
  • 为新增操作补充请求校验、稳定错误和 Rust 测试。
  • 组合检出/变基在脏工作树上必须先阻止操作,不能先切换分支再因 rebase 失败而留下半完成状态。
  • 远程引用必须保留 refs/remotes/* 身份,禁止误当成本地分支。

2. Windows 适配层

  • Tauri 翻译器同时兼容现有短分支名调用和新的完整引用调用。
  • checkout、checkout preflight、merge、rebase、integration preflight、create branch 都支持 fullName。
  • 增加引用到工作树 diff 的兼容命令,翻译到现有 git.diff。
  • 保留现有本地分支管理器行为,避免回归。

3. Windows UI

  • 在 GitReferenceTree 的叶子引用上接入应用现有 ContextMenu。
  • 右键时同步选中对应引用。
  • 在 GitLogToolWindow 或专用 hook 中实现输入、确认、执行、刷新和提示流程。
  • 菜单按引用 kind、isCurrent 和当前操作状态显示或禁用。
  • 所有文案补齐英文和中文本地化。
  • Git 冲突后刷新 operation state,继续使用现有冲突解决入口。

4. macOS UI

  • 扩展 GitLogView 的现有 contextMenu。
  • 通过 GitFeatureModel/GitService 调用共享 Core 能力。
  • 复用现有 checkout、integration preflight、冲突和通知流程。
  • 对远程引用开放合法的 checkout、merge、rebase、比较和拉取入口。

验收标准

  • Windows Git Log 中右键本地分支、远程分支和 tag 均会打开应用内菜单。
  • Windows 和 macOS 对同一引用显示一致且适用的核心动作。
  • 上述 9 个远程分支场景均可从 UI 完成。
  • 远程引用从 UI 到 Rust Core 全链路保持 fullName 和 kind,不被转换为 refs/heads/*。
  • 自合并、自变基、当前分支重复检出等情况被稳定阻止。
  • 脏工作树、checkout 阻塞、merge/rebase 冲突均有明确反馈,且不会静默丢失更改。
  • 操作成功后工作树、提交历史和引用列表正确刷新。
  • Windows 菜单和对话框提供中英文文案。
  • Rust、Windows TypeScript/Tauri 和 macOS 均有针对性测试。

验证

至少执行:

  • ./scripts/verify-rust-core.sh
  • ./scripts/verify-shared-contracts.sh
  • ./scripts/verify-windows-boundaries.sh
  • ./scripts/test-macos.sh
  • Windows 前端相关 Bun 测试与 typecheck
  • Windows Tauri Rust 测试
  • 在 Parallels Windows 环境中执行 Release 构建并实际验证右键菜单及关键流程

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestmacossomething related to macos stronglywindowssomething related to windows strongly

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions