From 3ec6ac22a737d6a6f40449a5fa64b23b6e0e5f77 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Feb 2026 02:12:15 +0000 Subject: [PATCH 1/3] Initial plan From a9b3115b0fec223fd986833978e98a514b8f9491 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Feb 2026 02:16:53 +0000 Subject: [PATCH 2/3] Add nbdime merge.tool guard with terminal guidance Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com> --- src/extension.ts | 3 +++ src/gitIntegration.ts | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 9d921a0..faeec88 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -128,6 +128,9 @@ function registerGitStateWatchers(context: vscode.ExtensionContext): void { export function activate(context: vscode.ExtensionContext) { console.log('MergeNB extension is now active'); const isTestMode = process.env.MERGENB_TEST_MODE === 'true'; + void gitIntegration.ensureSupportedMergeTool().catch((error) => { + console.error('[MergeNB] Unsupported merge tool configuration detected:', error); + }); resolver = new NotebookConflictResolver(context.extensionUri); diff --git a/src/gitIntegration.ts b/src/gitIntegration.ts index d5b012e..a14f7e5 100644 --- a/src/gitIntegration.ts +++ b/src/gitIntegration.ts @@ -29,6 +29,69 @@ try { } const execAsync = promisify(exec); +const nbdimeWarningShownRoots = new Set(); + +export class UnsupportedMergeToolError extends Error { + constructor(public readonly gitRoot: string, public readonly mergeTool: string) { + super(`[MergeNB] Unsupported Git merge tool configured: merge.tool=${mergeTool}`); + this.name = 'UnsupportedMergeToolError'; + } +} + +function getNbdimeDisableCommands(): string { + return [ + '# MergeNB detected merge.tool=nbdime (unsupported in the same merge flow)', + 'git config --unset merge.tool', + 'git config --global --unset merge.tool', + 'git config --remove-section mergetool.nbdime || true', + 'git config --global --remove-section mergetool.nbdime || true', + '# Optional: uninstall nbdime if you no longer use it', + 'python -m pip uninstall nbdime' + ].join('\n'); +} + +async function showUnsupportedMergeToolGuidance(error: UnsupportedMergeToolError): Promise { + if (!vscode || nbdimeWarningShownRoots.has(error.gitRoot)) { + return; + } + + nbdimeWarningShownRoots.add(error.gitRoot); + const terminalChoice = 'Show terminal fix commands'; + const selection = await vscode.window.showErrorMessage( + `MergeNB cannot run while Git merge.tool is set to "${error.mergeTool}" in this repo. Disable nbdime merge tool and retry.`, + terminalChoice + ); + + if (selection === terminalChoice) { + const terminal = vscode.window.createTerminal('MergeNB nbdime fix'); + terminal.show(true); + terminal.sendText(getNbdimeDisableCommands(), false); + } +} + +export async function ensureSupportedMergeTool(gitRootOrPath?: string): Promise { + let gitRoot = gitRootOrPath; + if (!gitRoot && vscode?.workspace?.workspaceFolders?.[0]?.uri?.fsPath) { + gitRoot = vscode.workspace.workspaceFolders[0].uri.fsPath; + } + if (!gitRoot) { + return; + } + + try { + const { stdout } = await execAsync('git config --get merge.tool', { cwd: gitRoot }); + const mergeTool = stdout.trim().toLowerCase(); + if (mergeTool === 'nbdime') { + const error = new UnsupportedMergeToolError(gitRoot, mergeTool); + await showUnsupportedMergeToolGuidance(error); + throw error; + } + } catch (error) { + if (error instanceof UnsupportedMergeToolError) { + throw error; + } + } +} function toGitPath(filePath: string): string { const converted = filePath.replace(/\\/g, '/'); From 1cedc204242e34bc7d6a146b2519450e7a893ebe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Feb 2026 02:19:15 +0000 Subject: [PATCH 3/3] Refine nbdime guidance and error handling notes Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com> --- src/gitIntegration.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/gitIntegration.ts b/src/gitIntegration.ts index a14f7e5..e0884ad 100644 --- a/src/gitIntegration.ts +++ b/src/gitIntegration.ts @@ -38,16 +38,17 @@ export class UnsupportedMergeToolError extends Error { } } -function getNbdimeDisableCommands(): string { +function getNbdimeDisableCommands(): string[] { return [ '# MergeNB detected merge.tool=nbdime (unsupported in the same merge flow)', + '# Review the commands below, then press Enter to run the selected ones.', 'git config --unset merge.tool', 'git config --global --unset merge.tool', 'git config --remove-section mergetool.nbdime || true', 'git config --global --remove-section mergetool.nbdime || true', - '# Optional: uninstall nbdime if you no longer use it', + '# Optional: uninstall nbdime if you no longer use it (interactive prompt expected)', 'python -m pip uninstall nbdime' - ].join('\n'); + ]; } async function showUnsupportedMergeToolGuidance(error: UnsupportedMergeToolError): Promise { @@ -65,7 +66,7 @@ async function showUnsupportedMergeToolGuidance(error: UnsupportedMergeToolError if (selection === terminalChoice) { const terminal = vscode.window.createTerminal('MergeNB nbdime fix'); terminal.show(true); - terminal.sendText(getNbdimeDisableCommands(), false); + terminal.sendText(getNbdimeDisableCommands().join('\n'), false); } } @@ -90,6 +91,7 @@ export async function ensureSupportedMergeTool(gitRootOrPath?: string): Promise< if (error instanceof UnsupportedMergeToolError) { throw error; } + // `git config --get merge.tool` exits with code 1 when unset; ignore to keep default flow. } }