From 8468f940c232c80d9bbb3f4ed01d2d7eb4286c2b Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Mon, 10 Aug 2026 20:17:43 -0700 Subject: [PATCH] fix(sidebar): reveal duplicate owner folder groups --- .../worktree-list-folder-reveal.test.ts | 20 +++++++++++++++++++ .../sidebar/worktree-list-folder-reveal.ts | 11 +++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/renderer/src/components/sidebar/worktree-list-folder-reveal.test.ts b/src/renderer/src/components/sidebar/worktree-list-folder-reveal.test.ts index 261045f7191..624e884401c 100644 --- a/src/renderer/src/components/sidebar/worktree-list-folder-reveal.test.ts +++ b/src/renderer/src/components/sidebar/worktree-list-folder-reveal.test.ts @@ -162,6 +162,26 @@ describe('worktree list folder reveal', () => { ]) }) + it('derives the owner when only project-group ids collide', () => { + const localGroup = makeProjectGroup({ id: 'group-child', executionHostId: 'local' }) + const runtimeGroup = makeProjectGroup({ + id: 'group-child', + executionHostId: 'runtime:env-1' + }) + const runtimeFolder = makeFolderWorkspace({ + id: 'runtime-folder', + executionHostId: 'runtime:env-1' + }) + + expect( + getFolderWorkspaceRevealGroupKeys( + folderWorkspaceKey(runtimeFolder.id), + [runtimeFolder], + [localGroup, runtimeGroup] + ) + ).toEqual([getProjectGroupHeaderKey(runtimeGroup.id, 'runtime:env-1')]) + }) + it('uses qualified DOM row keys only for collision-qualified folder rows', () => { expect( getFolderWorkspaceSidebarRowKey('folder-workspace-1', 'folder-workspace:folder-workspace-1') diff --git a/src/renderer/src/components/sidebar/worktree-list-folder-reveal.ts b/src/renderer/src/components/sidebar/worktree-list-folder-reveal.ts index 1c5c3c6119a..153ed8d6c01 100644 --- a/src/renderer/src/components/sidebar/worktree-list-folder-reveal.ts +++ b/src/renderer/src/components/sidebar/worktree-list-folder-reveal.ts @@ -107,16 +107,21 @@ export function getFolderWorkspaceRevealGroupKeys( return [] } + const resolvedOwnerHostId = + ownerHostId ?? resolveFolderWorkspaceCatalogOwnerHostId(folderWorkspace, projectGroups) + if (!resolvedOwnerHostId) { + return [] + } const projectGroupIndex = buildProjectGroupSidebarIndex(projectGroups) let group = findProjectGroupForSidebarOwner( projectGroupIndex, folderWorkspace.projectGroupId, - ownerHostId + resolvedOwnerHostId ) const keys: string[] = [] const seen = new Set() while (group) { - const identity = JSON.stringify([ownerHostId, group.id]) + const identity = JSON.stringify([resolvedOwnerHostId, group.id]) if (seen.has(identity)) { break } @@ -124,7 +129,7 @@ export function getFolderWorkspaceRevealGroupKeys( keys.unshift( getProjectGroupHeaderKey( group.id, - projectGroupIndex.ambiguousIds.has(group.id) ? ownerHostId : undefined + projectGroupIndex.ambiguousIds.has(group.id) ? resolvedOwnerHostId : undefined ) ) group = findProjectGroupParentForSidebar(projectGroupIndex, group)