Skip to content

Commit 66cec29

Browse files
committed
Fix checkpoint verification when diff views are closed
1 parent ba18a1d commit 66cec29

File tree

2 files changed

+86
-7
lines changed

2 files changed

+86
-7
lines changed

src/core/Cline.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2547,6 +2547,7 @@ export class Cline extends EventEmitter<ClineEvents> {
25472547

25482548
// Track number of active diff views to know when all are closed
25492549
let activeViews = changes.length
2550+
console.log(`[checkpointDiff] Starting with ${activeViews} active views`)
25502551

25512552
// Show each change in the diff approve view
25522553
for (const change of changes) {
@@ -2618,11 +2619,16 @@ export class Cline extends EventEmitter<ClineEvents> {
26182619
await vscode.workspace.fs.delete(oldVersionUri)
26192620

26202621
// Decrement active views counter
2622+
console.log(
2623+
`[checkpointDiff] Decrementing activeViews from ${activeViews} to ${activeViews - 1}`,
2624+
)
26212625
activeViews--
26222626

26232627
// When all views are closed, reset the verified checkpoint
26242628
if (activeViews === 0) {
2625-
console.log("[checkpointDiff] All diff views closed, resetting verified checkpoint")
2629+
console.log(
2630+
"✅✅✅ [checkpointDiff] All diff views closed, resetting verified checkpoint ✅✅✅",
2631+
)
26262632
const service = this.getCheckpointService()
26272633
if (service) {
26282634
// First reset the verified checkpoint

src/integrations/diff-approve/DiffApproveProvider.ts

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,18 @@ export class DiffApproveProvider {
7777
async (message: { type: string; blockId?: number }) => {
7878
if (!this.diffContent) return
7979

80+
console.log(`[DiffApproveProvider] Received message: ${message.type}`, { blockId: message.blockId })
81+
8082
switch (message.type) {
8183
case "approve":
8284
case "deny": {
8385
if (message.blockId !== undefined) {
8486
// Find the group containing this block
8587
const blocks = this.findRelatedBlocks(message.blockId)
8688
if (blocks.length > 0) {
89+
console.log(
90+
`[DiffApproveProvider] Processing ${blocks.length} blocks in group for ${message.type}`,
91+
)
8792
// Process all blocks in the group
8893
for (const block of blocks) {
8994
await this.onBlockApprove?.(block.id, message.type === "approve")
@@ -97,7 +102,15 @@ export class DiffApproveProvider {
97102
})
98103

99104
if (this.pendingBlocks.size === 0) {
100-
await this.onAllBlocksProcessed?.()
105+
console.log(
106+
`[DiffApproveProvider] All blocks processed, calling onAllBlocksProcessed`,
107+
)
108+
try {
109+
await this.onAllBlocksProcessed?.()
110+
console.log(`[DiffApproveProvider] onAllBlocksProcessed completed successfully`)
111+
} catch (error) {
112+
console.error(`[DiffApproveProvider] Error in onAllBlocksProcessed:`, error)
113+
}
101114
this.dispose()
102115
}
103116
}
@@ -107,6 +120,9 @@ export class DiffApproveProvider {
107120
case "approveAll":
108121
case "denyAll": {
109122
const isApprove = message.type === "approveAll"
123+
console.log(
124+
`[DiffApproveProvider] Processing ${this.pendingBlocks.size} pending blocks for ${isApprove ? "approve" : "deny"} all`,
125+
)
110126
for (const blockId of this.pendingBlocks) {
111127
await this.onBlockApprove?.(blockId, isApprove)
112128
}
@@ -115,7 +131,20 @@ export class DiffApproveProvider {
115131
type: isApprove ? "allBlocksApproved" : "allBlocksDenied",
116132
})
117133
this.pendingBlocks.clear()
118-
await this.onAllBlocksProcessed?.()
134+
console.log(
135+
`[DiffApproveProvider] All blocks processed in ${isApprove ? "approve" : "deny"} all, calling onAllBlocksProcessed`,
136+
)
137+
try {
138+
await this.onAllBlocksProcessed?.()
139+
console.log(
140+
`[DiffApproveProvider] onAllBlocksProcessed completed successfully for ${isApprove ? "approve" : "deny"} all`,
141+
)
142+
} catch (error) {
143+
console.error(
144+
`[DiffApproveProvider] Error in onAllBlocksProcessed for ${isApprove ? "approve" : "deny"} all:`,
145+
error,
146+
)
147+
}
119148
this.dispose()
120149
break
121150
}
@@ -128,6 +157,20 @@ export class DiffApproveProvider {
128157
// Clean up when panel is closed
129158
panel.onDidDispose(
130159
() => {
160+
console.log(`[DiffApproveProvider] Panel disposed, ${this.pendingBlocks.size} pending blocks remaining`)
161+
// If there are still pending blocks when the panel is closed,
162+
// we should still call onAllBlocksProcessed
163+
if (this.pendingBlocks.size > 0) {
164+
console.log(`[DiffApproveProvider] Panel closed with pending blocks, calling onAllBlocksProcessed`)
165+
try {
166+
this.onAllBlocksProcessed?.().catch((error) => {
167+
console.error(`[DiffApproveProvider] Error in onAllBlocksProcessed on panel close:`, error)
168+
})
169+
console.log(`[DiffApproveProvider] onAllBlocksProcessed called on panel close`)
170+
} catch (error) {
171+
console.error(`[DiffApproveProvider] Error calling onAllBlocksProcessed on panel close:`, error)
172+
}
173+
}
131174
this.dispose()
132175
},
133176
null,
@@ -515,12 +558,42 @@ export class DiffApproveProvider {
515558
}
516559

517560
public dispose(): void {
518-
DiffApproveProvider.currentPanel?.dispose()
519-
DiffApproveProvider.currentPanel = undefined
561+
console.log(`[DiffApproveProvider] dispose called, cleaning up resources`)
562+
563+
// Ensure onAllBlocksProcessed is called whenever we dispose
564+
if (this.pendingBlocks.size > 0) {
565+
console.log(
566+
`[DiffApproveProvider] dispose: Calling onAllBlocksProcessed for ${this.pendingBlocks.size} remaining blocks`,
567+
)
568+
try {
569+
this.onAllBlocksProcessed?.().catch((error) => {
570+
console.error(`[DiffApproveProvider] Error in onAllBlocksProcessed during dispose:`, error)
571+
})
572+
} catch (error) {
573+
console.error(`[DiffApproveProvider] Error calling onAllBlocksProcessed during dispose:`, error)
574+
}
575+
}
576+
577+
// Only dispose the panel if it matches the current one
578+
if (DiffApproveProvider.currentPanel) {
579+
try {
580+
DiffApproveProvider.currentPanel.dispose()
581+
console.log(`[DiffApproveProvider] Panel disposed successfully`)
582+
} catch (error) {
583+
console.error(`[DiffApproveProvider] Error disposing panel:`, error)
584+
}
585+
DiffApproveProvider.currentPanel = undefined
586+
}
520587

588+
// Clean up all disposables
521589
while (this.disposables.length) {
522-
const disposable = this.disposables.pop()
523-
disposable?.dispose()
590+
try {
591+
const disposable = this.disposables.pop()
592+
disposable?.dispose()
593+
} catch (error) {
594+
console.error(`[DiffApproveProvider] Error disposing a disposable:`, error)
595+
}
524596
}
597+
console.log(`[DiffApproveProvider] All resources cleaned up`)
525598
}
526599
}

0 commit comments

Comments
 (0)