Skip to content

fix(Badge): 修复活动栏未提交变更数角标更新不及时(迁至隐藏 TreeView 承载) - #52

Merged
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/fix-git-icon-badge-count
Jul 4, 2026
Merged

fix(Badge): 修复活动栏未提交变更数角标更新不及时(迁至隐藏 TreeView 承载)#52
ThreeFish-AI merged 2 commits into
feature/1.x.xfrom
ThreeFish-AI/fix-git-icon-badge-count

Conversation

@ThreeFish-AI

Copy link
Copy Markdown
Owner

背景

活动栏 Hyper Git 图标的「未提交变更数」角标更新不及时:有时已有变更文件却不显示角标,有时文件已提交/撤销角标却不消失,误导用户对仓库状态的判断。

根因(循证)

角标此前承载于 Commit WebviewViewWebviewView.badge#8 移除 Changes 视图后迁入)。命中 VS Code 已知限制:webview 角标在 resolveWebviewView(即用户至少打开过一次面板)之前无法显示 —— microsoft/vscode#164974#146330。源码印证:未 resolve 时 updateBadge 仅写入 pendingBadge、永不上屏。因此只要面板未打开/隐藏(用户在编辑器或其他活动容器工作),新变更无法点亮、提交/撤销后无法清除 —— 与两个症状完全吻合。

TreeView 无此限制:createTreeView 可在 activate() 强制实例化视图对象,其 .badge 无论视图是否可见都可靠聚合到容器图标(容器角标 = 容器内各视图 badge 之和)。

改动

  • package.json:新增隐藏承载视图 hyperGit.changesBadgewhen:false,永不渲染)。
  • src/engine/scm-mapping/change-count.ts(新增,纯函数)toRelKey + countUniqueChanges,作为变更去重的单一事实源
  • git-repository-service.ts:新增 getChangeCount()(仅计数、不构造 ChangeItem),getChanges() 复用 toRelKey
  • extension.tscreateTreeView 承载角标;角标走独立 40ms 微防抖快路径(面板未开也近实时、合并事件风暴),与 150ms 重刷新解耦;释放期清理定时器;首帧同步置初值。
  • commit-webview.ts:移除死代码 updateBadge/pendingBadge(杜绝容器求和 2× 计数),更新 JSDoc。
  • tests/unit/change-count.test.ts(新增):锁定 getChangeCount() === getChanges().length 去重不变式。
  • docs/.agents/issue.md:补录 Issue feat(Parity-Batch2): Git 提交图 Webview + Console #10

验证

  • check-types(tsc) / lint(eslint) / esbuild 编译 / test:unit332/332 通过,含新增 8 例)。
  • ⚠️ 集成测试(@vscode/test-electron)本地因下载 VS Code 网络超时未跑通(环境限制,非代码问题)。
  • 📋 实机门槛:EDH(F5)下不打开 Hyper Git 面板 → 改动文件应即时出现角标、提交/撤销应清除;若 when:false 承载实机不上屏,回退为 visibility:collapsed 空视图(仅改 package.json 一处)。

影响面

活动栏角标承载由 WebviewView 迁至隐藏 TreeView;不改变计数语义(index+工作区+未跟踪去重);不新增可见视图、不影响现有 Commit/Log/Branches 等视图与命令。

- 根因:角标挂在 Commit WebviewView 上,VS Code 在 resolveWebviewView(用户打开过面板)前无法显示 webview 角标(vscode#164974/#146330),故面板未打开时新变更不点亮、提交/撤销后不清除;
- 承载迁移:改由隐藏 TreeView(hyperGit.changesBadge, when:false)承载,createTreeView 于 activate 即实例化,其 badge 无论面板是否打开都可靠聚合到容器图标;
- 单一事实源:新增 engine 纯函数 change-count(toRelKey/countUniqueChanges)与 GitRepositoryService.getChangeCount(),getChanges 复用同一去重逻辑,避免双实现漂移;
- 及时且高效:角标走独立 40ms 微防抖快路径,与 150ms 重刷新解耦、合并事件风暴;释放期清理悬挂定时器;
- 熵减:移除 Commit webview 死代码(updateBadge/pendingBadge)杜绝容器求和 2× 计数;补充 change-count 单元测试锁定计数等值不变式。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
留存本次角标更新不及时问题的表因/根因/处理/防范,并交叉引用 #8 关于 badge 承载与 pendingBadge 时序的预警。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
@ThreeFish-AI
ThreeFish-AI merged commit 0f6f90d into feature/1.x.x Jul 4, 2026
5 checks passed
ThreeFish-AI added a commit that referenced this pull request Jul 4, 2026
…ELOG; (#58)

- package.json version 0.0.9 → 0.0.10(方案 A:纯 major.minor.patch,由 --pre-release 标志发预发布,规避 VS Code Marketplace 不接受 -rc.N semver 后缀的限制);
- 新增 docs/releases/v0.0.10-rc.1.md(文件名精确匹配 tag ref_name,作 GitHub Release 正文单一事实源),归纳 v0.0.9→HEAD 真实变更:Graph 视图对齐官方 (#53)、悬浮浮层 iframe 裁剪修复 (#53)、未提交角标承载迁移 (#52)、README 双语与真实性校准 (#51);
- CHANGELOG 新增 [0.0.10-rc.1] 段(遵循 Keep a Changelog);
- 本版作为 VS Code Marketplace 发布链路打通的验证版(首次以 vsce publish --pre-release 于 Marketplace/OpenVSX/GitHub Release 三渠道并发)。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
@ThreeFish-AI
ThreeFish-AI deleted the ThreeFish-AI/fix-git-icon-badge-count branch July 4, 2026 08:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant