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/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 } ); 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(