From 37a5b3798bde68d0e93cd2b4096ea33abd454d8f Mon Sep 17 00:00:00 2001 From: OrcaWin Date: Sat, 12 Sep 2026 18:08:31 -0700 Subject: [PATCH] perf: defer scrollback pruning indexes until needed (#20297) * perf: defer scrollback pruning indexes until needed * test: wait for watcher reconciliation event delivery --------- Co-authored-by: Orca Worker --- .../ipc/worktree-git-common-watch.test.ts | 2 +- .../workspace-session-terminal-buffers.ts | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/ipc/worktree-git-common-watch.test.ts b/src/main/ipc/worktree-git-common-watch.test.ts index bad700b5445..737a173049f 100644 --- a/src/main/ipc/worktree-git-common-watch.test.ts +++ b/src/main/ipc/worktree-git-common-watch.test.ts @@ -626,8 +626,8 @@ describe('worktree git-common narrow watch (local native platforms)', () => { expect(statCalls.filter((path) => path === worktreesDir)).toHaveLength(1) await vi.waitFor(() => { expect(subscribeMock).toHaveBeenCalledTimes(2) + expect(received.flat()).toContainEqual({ type: 'create', path: worktreesDir }) }) - expect(received.flat()).toContainEqual({ type: 'create', path: worktreesDir }) }) it('resumes polling when the dir is still absent on show', async () => { diff --git a/src/shared/workspace-session-terminal-buffers.ts b/src/shared/workspace-session-terminal-buffers.ts index ef8ac6a273b..706dbedc2d7 100644 --- a/src/shared/workspace-session-terminal-buffers.ts +++ b/src/shared/workspace-session-terminal-buffers.ts @@ -77,21 +77,24 @@ export function pruneLocalTerminalScrollbackBuffers( session: WorkspaceSessionState, repos: readonly RepoConnection[] ): WorkspaceSessionState { - const repoById = new Map(repos.map((repo) => [repo.id, repo] as const)) - const worktreeIdByTabId = new Map() + let repoById: Map | null = null + let worktreeIdByTabId: Map | null = null const tabsByWorktree = session.tabsByWorktree ?? {} const terminalLayoutsByTabIdForRead = session.terminalLayoutsByTabId ?? {} - for (const [worktreeId, tabs] of Object.entries(tabsByWorktree)) { - for (const tab of tabs) { - worktreeIdByTabId.set(tab.id, worktreeId) - } - } - let terminalLayoutsByTabId: WorkspaceSessionState['terminalLayoutsByTabId'] | null = null for (const [tabId, layout] of Object.entries(terminalLayoutsByTabIdForRead)) { if (!layout.buffersByLeafId && !layout.scrollbackRefsByLeafId) { continue } + repoById ??= new Map(repos.map((repo) => [repo.id, repo] as const)) + if (!worktreeIdByTabId) { + worktreeIdByTabId = new Map() + for (const [worktreeId, tabs] of Object.entries(tabsByWorktree)) { + for (const tab of tabs) { + worktreeIdByTabId.set(tab.id, worktreeId) + } + } + } const worktreeId = worktreeIdByTabId.get(tabId) if (shouldPreserveTerminalScrollbackBuffersForRepoMap(worktreeId, repoById)) { const capped = capTerminalScrollbackLeafBuffers(layout.buffersByLeafId)