diff --git a/src/view/treeNodes/filesCategoryNode.ts b/src/view/treeNodes/filesCategoryNode.ts index ec414574b9..189b060c22 100644 --- a/src/view/treeNodes/filesCategoryNode.ts +++ b/src/view/treeNodes/filesCategoryNode.ts @@ -102,6 +102,12 @@ export class FilesCategoryNode extends TreeNode implements vscode.TreeItem { } else { const fileNodes = [...filesToShow]; fileNodes.sort((a, b) => compareIgnoreCase(a.fileChangeResourceUri.toString(), b.fileChangeResourceUri.toString())); + // In flat layout, files are rendered as direct children of this node. + // Keep parent pointers aligned with the rendered hierarchy so reveal/getParent + // don't try to walk through hidden DirectoryTreeNode instances. + fileNodes.forEach(fileNode => { + fileNode.parent = this; + }); nodes = fileNodes; } Logger.appendLine(`Got all children for Files node`, PR_TREE); diff --git a/src/view/treeNodes/repositoryChangesNode.ts b/src/view/treeNodes/repositoryChangesNode.ts index 5c42145529..c090417022 100644 --- a/src/view/treeNodes/repositoryChangesNode.ts +++ b/src/view/treeNodes/repositoryChangesNode.ts @@ -51,7 +51,7 @@ export class RepositoryChangesNode extends TreeNode implements vscode.TreeItem { this.getTreeItem(); this._register(vscode.window.onDidChangeActiveTextEditor(e => { - if (vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get(FILE_AUTO_REVEAL)) { + if (this.isFileAutoRevealEnabled()) { const tabInput = vscode.window.tabGroups.activeTabGroup.activeTab?.input; if (tabInput instanceof vscode.TabInputTextDiff) { if ((tabInput.original.scheme === Schemes.Review) @@ -66,6 +66,9 @@ export class RepositoryChangesNode extends TreeNode implements vscode.TreeItem { })); this._register(this.parent.view.onDidChangeVisibility(_ => { + if (!this.isFileAutoRevealEnabled()) { + return; + } const activeEditorUri = vscode.window.activeTextEditor?.document.uri.toString(); this.revealActiveEditorInTree(activeEditorUri); })); @@ -77,10 +80,19 @@ export class RepositoryChangesNode extends TreeNode implements vscode.TreeItem { })); } + private isFileAutoRevealEnabled(): boolean { + return vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get(FILE_AUTO_REVEAL, true); + } + private revealActiveEditorInTree(activeEditorUri: string | undefined): void { + // File nodes are wired into the tree when FilesCategoryNode children are built. + // Skip reveal attempts before that to avoid invalid handle lookups. + if (!this._filesCategoryNode) { + return; + } if (this.parent.view.visible && activeEditorUri) { const matchingFile = this._reviewModel.localFileChanges.find(change => change.changeModel.filePath.toString() === activeEditorUri); - if (matchingFile) { + if (matchingFile && matchingFile.parent !== this.parent) { this.reveal(matchingFile, { select: true }); } }