From 0aa7490bc6f92e21932042a6e03da736f41cec5f Mon Sep 17 00:00:00 2001 From: Lex Christopherson Date: Wed, 25 Mar 2026 22:55:44 -0600 Subject: [PATCH] refactor: extract merge-state cleanup helper in reconcileMergeState The same ~20-line cleanup sequence (merge abort / squash msg unlink / hard reset) appeared twice in reconcileMergeState(). Extract into a private abortAndResetMerge() helper to eliminate the duplication. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/resources/extensions/gsd/auto-recovery.ts | 67 +++++++++---------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/src/resources/extensions/gsd/auto-recovery.ts b/src/resources/extensions/gsd/auto-recovery.ts index a03b5887a..ef892f6b5 100644 --- a/src/resources/extensions/gsd/auto-recovery.ts +++ b/src/resources/extensions/gsd/auto-recovery.ts @@ -515,6 +515,35 @@ export function diagnoseExpectedArtifact( // ─── Merge State Reconciliation ─────────────────────────────────────────────── +/** + * Best-effort abort of a pending merge/squash and hard-reset to HEAD. + * Handles both real merges (MERGE_HEAD) and squash merges (SQUASH_MSG). + */ +function abortAndResetMerge( + basePath: string, + hasMergeHead: boolean, + squashMsgPath: string, +): void { + if (hasMergeHead) { + try { + nativeMergeAbort(basePath); + } catch { + /* best-effort */ + } + } else if (squashMsgPath) { + try { + unlinkSync(squashMsgPath); + } catch { + /* best-effort */ + } + } + try { + nativeResetHard(basePath); + } catch { + /* best-effort */ + } +} + /** * Detect leftover merge state from a prior session and reconcile it. * If MERGE_HEAD or SQUASH_MSG exists, check whether conflicts are resolved. @@ -571,24 +600,7 @@ export function reconcileMergeState( } } if (!resolved) { - if (hasMergeHead) { - try { - nativeMergeAbort(basePath); - } catch { - /* best-effort */ - } - } else if (hasSquashMsg) { - try { - unlinkSync(squashMsgPath); - } catch { - /* best-effort */ - } - } - try { - nativeResetHard(basePath); - } catch { - /* best-effort */ - } + abortAndResetMerge(basePath, hasMergeHead, squashMsgPath); ctx.ui.notify( "Detected leftover merge state — auto-resolve failed, cleaned up. Re-deriving state.", "warning", @@ -596,24 +608,7 @@ export function reconcileMergeState( } } else { // Code conflicts present — abort and reset - if (hasMergeHead) { - try { - nativeMergeAbort(basePath); - } catch { - /* best-effort */ - } - } else if (hasSquashMsg) { - try { - unlinkSync(squashMsgPath); - } catch { - /* best-effort */ - } - } - try { - nativeResetHard(basePath); - } catch { - /* best-effort */ - } + abortAndResetMerge(basePath, hasMergeHead, squashMsgPath); ctx.ui.notify( "Detected leftover merge state with unresolved conflicts — cleaned up. Re-deriving state.", "warning",