Skip to content

[Feature] 将 Viva 工作树操作的可用性、状态和新建建议路径下沉到 Core #1817

Closed

Description

@xiaoyumuxi

Problem to solve / 要解决的问题

Viva 重构 PR #1799 的 Git 工具窗口新增了“工作树”页(列表、概览/更改/提交历史详情,以及新建、删除、强制删除、锁定、清理和修复)。下面几条规则目前写在 Go 界面层 desktop/internal/workbench/gitworktree.go:

  • worktreeRemoveBlocked / worktreeLockBlocked:哪些工作树不能删除或锁定,以及不能操作的原因(主工作区、当前工作区、路径丢失、已锁定)。
  • worktreeStatusOf:列表状态标签的优先级(路径丢失 > 已锁定 > 有修改 > 当前 > 可用)。
  • worktreeDestination / worktreeLeaf:新建工作树时建议的目标路径(仓库同级目录,用分支名或修订号的最后一段生成,非法字符替换为 -)。
  • worktreeCreation.ready 和 referenceChoices:新建对话框按模式过滤可选引用(已有分支模式排除已被其他工作树检出的本地分支),并判断表单能否提交。

按 develop-lithe 的逻辑归属规则,可以在客户端之间共享的判定和投影应由 Core 持有,界面层只负责绘制和输入。放在 Go 是因为迁移期间先补齐功能。规则留在界面层的代价:

  • 以后换界面外壳或增加其他客户端时,要把这些规则重写一遍,按钮可用性也可能和 Core 实际拒绝的条件不一致。现在 Core 已经对主工作区、当前工作区和已锁定工作树的删除分别返回错误码,界面层又按同样的条件预先禁用按钮,两边各维护一份。
  • 建议路径的规则和旧 macOS 客户端不同步,以后修改时容易漏掉。

判定依据:在 #1799 分支上搜索上述函数名,只有 desktop/internal/workbench/gitworktree.go、gitworktree_view.go 和对应测试使用;desktop/internal/core 只提供 GitWorktrees、GitCreateWorktree 等执行接口,没有可用性或建议路径的接口。#1662 下沉清单没有覆盖工作树操作的可用性。

Proposed solution / 建议方案

在 Core 的 git.worktrees 结果里为每个工作树返回状态和可用操作:status(按上述优先级)、actions.remove / actions.lock 是否可用,以及不可用时的原因代码。原因代码与删除接口已有的拒绝错误码一一对应:git_worktree_primary、git_worktree_current、git_worktree_locked,并为路径丢失新增一个代码。

再增加 git.worktreeCreationPreview:输入模式、引用、分支名、修订号和当前仓库根目录,返回可选引用列表、清理后的分支名及其校验结果(复用 git.branchNamePreview)、建议目标路径和是否可以提交。界面层只把原因代码映射为界面文案。

增加共享 fixture,覆盖主工作区、当前工作区、linked、已锁定(有原因和无原因)、路径丢失、bare 和 detached 工作树,以及建议路径中的斜杠、空格、非 ASCII 字符和空名字。

风险:修改 git.worktrees 的返回结构需要更新契约镜像 shared/contracts/rust-core-api.md 和对应 fixture。

Target platform / 目标平台

Cross-platform / 跨平台

Area / 模块

Git

Priority / 优先级

P2 / 后续考虑:目前不着急,可安排到后续版本

Alternatives considered / 已考虑的替代方案

继续在 Go 客户端维护:改动最少,但规则无法给其他客户端复用,按钮可用性和 Core 的拒绝条件要在两处同步维护。

Additional context / 补充信息

Checklist / 提交前检查

  • I searched existing issues for duplicates. / 我已搜索现有 Issue,确认没有重复建议。

Activity

  1. xiaoyumuxi commented on Nov 14, 2026

    @xiaoyumuxi
    CollaboratorAuthor

    已完成:规则由 Lithe-IDEA/Lithe-core-rust#31 在 Core 中实现(2026-11-14 squash 合入 main,合并提交 62b8a08),桌面端由 #1889 改用这些 Core 命令并删除 Go 中的同名规则,已合入 preview。Core 固定版本改到 62b8a08 的收尾在 #1891。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    refactor清理无用代码或重构review: highghfind author score; see https://ghfind.com

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions