Skip to content

Commit acd836f

Browse files
refactor(diff-view): capture rollback recovery context and report whether a revert ran
1 parent 53cb5b5 commit acd836f

4 files changed

Lines changed: 2077 additions & 40 deletions

File tree

‎src/core/task/Task.ts‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3820,7 +3820,12 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
38203820
try {
38213821
// If we're not streaming then `abortStream` won't be called.
38223822
if (this.isStreaming && this.diffViewProvider.isEditing) {
3823-
this.diffReversionPromise = this.diffViewProvider.revertChanges().catch(console.error)
3823+
// The field records that the reversion settled. Whether a rollback actually ran is
3824+
// revertChanges()'s own report, and a disposing task has nothing left to act on either way.
3825+
this.diffReversionPromise = this.diffViewProvider
3826+
.revertChanges()
3827+
.then(() => undefined)
3828+
.catch(console.error)
38243829
}
38253830
} catch (error) {
38263831
console.error("Error reverting diff changes:", error)

‎src/core/task/__tests__/Task.dispose.test.ts‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ describe("Task dispose method", () => {
240240

241241
test("should await diff reversion during abort without waiting for output cleanup", async () => {
242242
let resolveCleanup!: () => void
243-
let resolveReversion!: () => void
243+
let resolveReversion!: (restored: boolean) => void
244244
vi.mocked(OutputInterceptor.cleanup).mockReturnValueOnce(
245245
new Promise((resolve) => {
246246
resolveCleanup = resolve
@@ -249,7 +249,7 @@ describe("Task dispose method", () => {
249249
task.isStreaming = true
250250
task.diffViewProvider.isEditing = true
251251
const revertChangesSpy = vi.spyOn(task.diffViewProvider, "revertChanges").mockReturnValue(
252-
new Promise((resolve) => {
252+
new Promise<boolean>((resolve) => {
253253
resolveReversion = resolve
254254
}),
255255
)
@@ -260,7 +260,7 @@ describe("Task dispose method", () => {
260260
await vi.waitFor(() => expect(revertChangesSpy).toHaveBeenCalledOnce())
261261
expect(saveMessages).not.toHaveBeenCalled()
262262

263-
resolveReversion()
263+
resolveReversion(true)
264264
await abort
265265
expect(saveMessages).toHaveBeenCalledOnce()
266266

@@ -277,8 +277,8 @@ describe("Task dispose method", () => {
277277
})
278278

279279
test("should expose completion of deferred diff reversion", async () => {
280-
let resolveReversion: () => void
281-
const reversion = new Promise<void>((resolve) => {
280+
let resolveReversion: (restored: boolean) => void
281+
const reversion = new Promise<boolean>((resolve) => {
282282
resolveReversion = resolve
283283
})
284284
task.isStreaming = true
@@ -295,7 +295,8 @@ describe("Task dispose method", () => {
295295
expect(disposalComplete).toBe(false)
296296
expect(revertChangesSpy).toHaveBeenCalledOnce()
297297

298-
resolveReversion!()
298+
// A completed rollback: this is the reversion the deferred disposal is waiting for.
299+
resolveReversion!(true)
299300
await disposal
300301
expect(disposalComplete).toBe(true)
301302
})

0 commit comments

Comments
 (0)