From 6c4e095f093240186d6c52e33bf9d62c8176c12b Mon Sep 17 00:00:00 2001 From: municorn Date: Fri, 17 Oct 2025 07:46:52 -0600 Subject: [PATCH 1/2] fix(git): don't use external diff tools when getting git diff --- src/utils/git.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/git.ts b/src/utils/git.ts index b9619cde..bf68cc57 100644 --- a/src/utils/git.ts +++ b/src/utils/git.ts @@ -134,7 +134,7 @@ export const getDiff = async ({ files }: { files: string[] }) => { const { stdout: diff } = await execa( 'git', - ['diff', '--staged', '--', ...diffableFiles], + ['diff', '--staged', '--no-ext-diff', '--', ...diffableFiles], { cwd: gitDir } ); From ff59b4c8af339cd1875aeb3eb14def6ba78bcb30 Mon Sep 17 00:00:00 2001 From: di-sukharev Date: Sun, 23 Aug 2026 22:34:49 +0300 Subject: [PATCH 2/2] test(git): cover configured external diff tools --- out/cli.cjs | 2 +- test/e2e/oneFile.test.ts | 56 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/out/cli.cjs b/out/cli.cjs index 460ac3c1..a017dff8 100755 --- a/out/cli.cjs +++ b/out/cli.cjs @@ -85950,7 +85950,7 @@ ${excludedFiles.join( const diffableFiles = files.filter((file) => !isFileExcludedFromDiff(file)); const { stdout: diff } = await execa( "git", - ["diff", "--staged", "--", ...diffableFiles], + ["diff", "--staged", "--no-ext-diff", "--", ...diffableFiles], { cwd: gitDir } ); return diff; diff --git a/test/e2e/oneFile.test.ts b/test/e2e/oneFile.test.ts index ee43f47d..1a1053c3 100644 --- a/test/e2e/oneFile.test.ts +++ b/test/e2e/oneFile.test.ts @@ -7,9 +7,11 @@ import { prepareEnvironment, prepareRepo, runCli, + runGit, startMockOpenAiServer, appendRepoFile, - waitForExit + waitForExit, + writeRepoFile } from './utils'; it('cli flow to generate commit message for 1 new file (staged)', async () => { @@ -63,6 +65,58 @@ it('cli flow to generate commit message for 1 new file (staged)', async () => { } }); +it('cli ignores configured external diff tools when generating the prompt', async () => { + const { gitDir, cleanup } = await prepareEnvironment({ remotes: 0 }); + const server = await startMockOpenAiServer( + 'fix(diff): use the staged patch in the prompt' + ); + + try { + await prepareRepo( + gitDir, + { + 'index.ts': 'console.log("before");\n' + }, + { + stage: true, + commitMessage: 'add initial file' + } + ); + writeRepoFile(gitDir, 'index.ts', 'console.log("after");\n'); + await runGit(['add', 'index.ts'], gitDir); + await runGit( + ['config', 'diff.external', 'echo OCO_EXTERNAL_DIFF_USED'], + gitDir + ); + + const oco = await runCli(['--yes'], { + cwd: gitDir, + env: getMockOpenAiEnv(server.baseUrl) + }); + + expect(await waitForExit(oco)).toBe(0); + await assertHeadCommit( + gitDir, + 'fix(diff): use the staged patch in the prompt' + ); + + const requestContents = server.requestBodies + .flatMap( + (body) => + (body as { messages?: Array<{ content: string }> }).messages ?? [] + ) + .map((message) => message.content) + .join('\n'); + + expect(requestContents).toContain('-console.log("before");'); + expect(requestContents).toContain('+console.log("after");'); + expect(requestContents).not.toContain('OCO_EXTERNAL_DIFF_USED'); + } finally { + await server.cleanup(); + await cleanup(); + } +}); + it('cli flow to generate commit message for 1 changed file (not staged)', async () => { const { gitDir, cleanup } = await prepareEnvironment(); const server = await startMockOpenAiServer(