From 219c1852e4203f19dfa4a7084d0c686ede6a9a68 Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 29 Jun 2026 19:24:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(ActivityBar):=20Hyper=20Git=20=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=98=BE=E7=A4=BA=E6=9C=AA=E6=8F=90=E4=BA=A4=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=95=B0=E8=A7=92=E6=A0=87;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes 视图由 registerTreeDataProvider 改为 createTreeView 以获取 TreeView 句柄承载 .badge;活动栏容器图标的数字角标为容器内各视图 badge.value 之和,故为 hyperGit.changes 设置角标即点亮 Hyper Git 图标。 计数复用 service.getChanges()(index+工作区+未跟踪去重),接入既有 refreshAll 防抖刷新链路与首帧保险,计数为 0 时清空,对齐原生 SCM 行为。 🤖 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 --- src/extension.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index 80cdbaa..a43992c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -59,6 +59,9 @@ export async function activate(context: vscode.ExtensionContext): Promise const registry = new ChangelistRegistry(context.workspaceState, service.repoRoot ?? workspaceRoot); const favorites = new BranchFavorites(context.workspaceState, service.repoRoot ?? workspaceRoot); const tree = new ChangesTreeProvider(service, registry); + // createTreeView(registerTreeDataProvider 的超集)以获取 TreeView 句柄承载 .badge; + // 活动栏容器图标的数字角标 = 容器内各视图 badge.value 之和,故此处点亮即映射到 Hyper Git 图标。 + const changesView = vscode.window.createTreeView('hyperGit.changes', { treeDataProvider: tree }); // AI 接缝注入(Null 实现,M5 替换为真实 provider) const commit = new CommitService(context, service, context.workspaceState, { @@ -90,7 +93,7 @@ export async function activate(context: vscode.ExtensionContext): Promise stashTree, shelfTree, blame, - vscode.window.registerTreeDataProvider('hyperGit.changes', tree), + changesView, vscode.window.registerWebviewViewProvider(CommitWebviewProvider.viewType, commitView), vscode.window.registerTreeDataProvider('hyperGit.log', logTree), vscode.window.registerTreeDataProvider('hyperGit.branches', branchesTree), @@ -116,12 +119,20 @@ export async function activate(context: vscode.ExtensionContext): Promise registerInlineCommitCommand(service, inlineLens), ); + // 活动栏角标:复用 service.getChanges() 计数(index+工作区+未跟踪去重),与 Changes 视图内容一致; + // 计数为 0 时清空,对齐原生 SCM 行为。 + const updateChangesBadge = (): void => { + const count = service.getChanges().length; + changesView.badge = count > 0 ? { value: count, tooltip: `${count} 个未提交变更` } : undefined; + }; + // git 状态变化频繁(add/checkout/diff 缓存失效均触发),防抖合并避免 log/stash 高频重拉。 let refreshTimer: ReturnType | undefined; const refreshAll = (): void => { clearTimeout(refreshTimer); refreshTimer = setTimeout(() => { tree.refresh(); + updateChangesBadge(); commitView.refresh(); logTree.refresh(); branchesTree.refresh(); @@ -142,6 +153,7 @@ export async function activate(context: vscode.ExtensionContext): Promise setTimeout(() => { branchesTree.refresh(); logTree.refresh(); + updateChangesBadge(); }, 500); } From 709fe161a4b58bc9f709e2ea861d03ffc818199f Mon Sep 17 00:00:00 2001 From: ThreeFish Date: Mon, 29 Jun 2026 19:24:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(Branches):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=A0=E4=B8=8A=E6=B8=B8=E5=88=86=E6=94=AF=20Push=20?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=B9=B6=E6=9A=B4=E9=9C=B2=20git=20=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E9=94=99=E8=AF=AF;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hyperGit.push 原以零参数调用 repo.push(),当前分支无上游时 git push (push.default=simple)必然失败,vscode.git 包装为 GitError,其 .message 为通用串「Failed to execute git」,真实 stderr 被吞没。 改为以 HEAD.upstream 是否存在为分支:有上游沿用 repo.push();无上游时 选定 remote(单 remote 直用、多 remote 弹选择)并以 repo.push(remote, branch, true) 建立 -u 追踪。同时增强 errMsg 优先暴露 GitError.stderr, 使「无上游」「non-fast-forward」等失败可读(push/pull/fetch 等同享)。 🤖 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 --- src/adapter/history-commands.ts | 43 +++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/src/adapter/history-commands.ts b/src/adapter/history-commands.ts index 71fc757..f93db5c 100644 --- a/src/adapter/history-commands.ts +++ b/src/adapter/history-commands.ts @@ -16,7 +16,20 @@ export function registerHistoryCommands( favorites: BranchFavorites, ): vscode.Disposable[] { const subs: vscode.Disposable[] = []; - const errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e)); + // vscode.git 在 git 非零退出时抛出 GitError,其 .message 为通用串「Failed to execute git」, + // 真实原因落在 .stderr。优先暴露 stderr,使「无上游」「non-fast-forward」等失败可读。 + const errMsg = (e: unknown): string => { + if (e && typeof e === 'object') { + const ge = e as { stderr?: unknown; message?: unknown }; + if (typeof ge.stderr === 'string' && ge.stderr.trim()) { + return ge.stderr.trim(); + } + if (typeof ge.message === 'string' && ge.message) { + return ge.message; + } + } + return String(e); + }; subs.push(vscode.commands.registerCommand('hyperGit.refreshLog', () => logTree.refresh())); subs.push(vscode.commands.registerCommand('hyperGit.refreshBranches', () => branchesTree.refresh())); @@ -212,9 +225,35 @@ export function registerHistoryCommands( if (!repo) { return; } + const head = repo.state.HEAD; + if (!head?.name) { + void vscode.window.showWarningMessage('当前处于 detached HEAD,无法推送当前分支'); + return; + } try { - await repo.push(); + if (head.upstream) { + // 已配置上游:按 push.default 推送到追踪分支(正确处理本地名/上游名不一致)。 + await repo.push(); + } else { + // 无上游:选定 remote 并以 -u 建立追踪(修复「Failed to execute git」根因)。 + const remotes = repo.state.remotes.map((r) => r.name); + if (remotes.length === 0) { + void vscode.window.showWarningMessage('未配置远程仓库(remote),无法推送'); + return; + } + const remote = + remotes.length === 1 + ? remotes[0] + : await vscode.window.showQuickPick(remotes, { + placeHolder: `为「${head.name}」选择推送目标 remote(将建立上游追踪 -u)`, + }); + if (!remote) { + return; + } + await repo.push(remote, head.name, true); + } branchesTree.refresh(); + void vscode.window.showInformationMessage(`已推送 ${head.name}`); } catch (e) { void vscode.window.showErrorMessage(`Push 失败:${errMsg(e)}`); }