Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evals/apps/cli/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ const runExercise = async ({ run, task, server }: { run: Run; task: Task; server
ROO_CODE_IPC_SOCKET_PATH: taskSocketPath,
},
shell: "/bin/bash",
})`code --disable-workspace-trust -n ${workspacePath}`
})`code --disable-workspace-trust -W ${workspacePath}`

// Give VSCode some time to spawn before connecting to its unix socket.
await new Promise((resolve) => setTimeout(resolve, 3_000))
Expand Down
69 changes: 60 additions & 9 deletions src/integrations/editor/DiffViewProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export class DiffViewProvider {
originalContent: string | undefined
private createdDirs: string[] = []
private documentWasOpen = false
private originalViewColumn?: vscode.ViewColumn // Store the original view column
private relPath?: string
private newContent?: string
private activeDiffEditor?: vscode.TextEditor
Expand Down Expand Up @@ -65,11 +66,22 @@ export class DiffViewProvider {
.filter(
(tab) => tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath),
)
// Check if the document is already open and store its state
// DO NOT close the original tab to preserve pin status
for (const tab of tabs) {
if (!tab.isDirty) {
await vscode.window.tabGroups.close(tab)
if (tab.input instanceof vscode.TabInputText && arePathsEqual(tab.input.uri.fsPath, absolutePath)) {
this.originalViewColumn = tab.group.viewColumn
this.documentWasOpen = true
// Ensure the tab is not dirty before proceeding, but don't close it
if (tab.isDirty) {
// Find the document associated with the tab and save it
const doc = vscode.workspace.textDocuments.find((d) => arePathsEqual(d.uri.fsPath, absolutePath))
if (doc) {
await doc.save()
}
}
break // Found the relevant tab, no need to check others
}
this.documentWasOpen = true
}
this.activeDiffEditor = await this.openDiffEditor()
this.fadedOverlayController = new DecorationController("fadedOverlay", this.activeDiffEditor)
Expand Down Expand Up @@ -156,9 +168,31 @@ export class DiffViewProvider {
await updatedDocument.save()
}

await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), { preview: false })
// Close the diff view first
await this.closeAllDiffViews()

// If the original document was open, try to focus it.
// VS Code should handle showing the updated content automatically since the file was saved.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider abstracting the logic for refocusing the original document (duplicated in both saveChanges and revertChanges) into a helper method. This would improve modularity and reduce redundancy.

This comment was generated because it violated the following rules: mrule_htmKIslKUiIk1Afo and mrule_fYE6mUdYYxZL58YF.

if (this.documentWasOpen && this.originalViewColumn) {
// Find the editor for the original document and reveal it
const originalEditor = vscode.window.visibleTextEditors.find(
(editor) =>
arePathsEqual(editor.document.uri.fsPath, absolutePath) &&
editor.viewColumn === this.originalViewColumn,
)
if (originalEditor) {
// Reveal a range (e.g., the start) to ensure focus
const position = new vscode.Position(0, 0)
originalEditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.AtTop)
} else {
// Fallback if editor not found (shouldn't happen often if documentWasOpen is true)
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), {
preview: false,
viewColumn: this.originalViewColumn,
})
}
}

/*
Getting diagnostics before and after the file edit is a better approach than
automatically tracking problems in real-time. This method ensures we only
Expand Down Expand Up @@ -237,12 +271,28 @@ export class DiffViewProvider {
await vscode.workspace.applyEdit(edit)
await updatedDocument.save()
console.log(`File ${absolutePath} has been reverted to its original content.`)
if (this.documentWasOpen) {
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), {
preview: false,
})
}
// Close the diff view first
await this.closeAllDiffViews()

// If the document was originally open, ensure it's focused.
// The revert logic already applied the original content and saved.
if (this.documentWasOpen && this.originalViewColumn) {
const originalEditor = vscode.window.visibleTextEditors.find(
(editor) =>
arePathsEqual(editor.document.uri.fsPath, absolutePath) &&
editor.viewColumn === this.originalViewColumn,
)
if (originalEditor) {
const position = new vscode.Position(0, 0)
originalEditor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.AtTop)
} else {
// Fallback
await vscode.window.showTextDocument(vscode.Uri.file(absolutePath), {
preview: false,
viewColumn: this.originalViewColumn,
})
}
}
}

// edit is done
Expand Down Expand Up @@ -358,6 +408,7 @@ export class DiffViewProvider {
this.originalContent = undefined
this.createdDirs = []
this.documentWasOpen = false
this.originalViewColumn = undefined // Reset stored view column
this.activeDiffEditor = undefined
this.fadedOverlayController = undefined
this.activeLineController = undefined
Expand Down