From 481d55ea70b8ca7ef5ae1621fde8f009ed57ddd9 Mon Sep 17 00:00:00 2001 From: BeniBenj Date: Wed, 19 Aug 2026 11:10:31 +0200 Subject: [PATCH] Agent Host changes for benibenj/agents/log-analysis-error-fix-prioritization-60ed07f4 --- .../agentHost/node/agentHostGitService.ts | 9 +++++++-- .../node/agentHostGitService.integrationTest.ts | 17 +++++++++++++++++ .../test/node/agentHostGitService.test.ts | 4 ++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/agentHost/node/agentHostGitService.ts b/src/vs/platform/agentHost/node/agentHostGitService.ts index cfaeb27d56b..026319e3a5f 100644 --- a/src/vs/platform/agentHost/node/agentHostGitService.ts +++ b/src/vs/platform/agentHost/node/agentHostGitService.ts @@ -1308,7 +1308,9 @@ export function parseUntrackedPaths(output: string | undefined): string[] { * Parses NUL-separated `git status --porcelain=v1 -z --untracked-files=all` * output and returns all changed repo-relative paths. Rename/copy entries * include both the destination and source paths so scoped `git add -A` - * stages both sides of the change. + * stages both sides of the change. Paths added to the index and then deleted + * from the worktree are omitted because they do not exist in either HEAD or + * the worktree. * * Exported for tests. */ @@ -1334,7 +1336,10 @@ export function parseChangedPaths(output: string | undefined, includeStatus: (st const path = seg.substring(3); const isRenameOrCopy = status[0] === 'R' || status[1] === 'R' || status[0] === 'C' || status[1] === 'C'; if (includeStatus(status)) { - addPath(path); + const isDeletedIndexAddition = status[1] === 'D' && (status[0] === 'A' || status[0] === 'R' || status[0] === 'C'); + if (!isDeletedIndexAddition) { + addPath(path); + } if (isRenameOrCopy) { const sourcePath = segments[++i]; if (sourcePath) { diff --git a/src/vs/platform/agentHost/test/node/agentHostGitService.integrationTest.ts b/src/vs/platform/agentHost/test/node/agentHostGitService.integrationTest.ts index 00adf4eb4fd..d6b94eef745 100644 --- a/src/vs/platform/agentHost/test/node/agentHostGitService.integrationTest.ts +++ b/src/vs/platform/agentHost/test/node/agentHostGitService.integrationTest.ts @@ -310,6 +310,23 @@ suite('AgentHostGitService - computeSessionFileDiffs (real git)', () => { }); }); + (hasGit ? test : test.skip)('ignores an index addition deleted from the worktree during temp-index staging', async () => { + const fs = await import('fs/promises'); + const { dir, run } = initRepo(); + await fs.writeFile(join(dir, 'tracked.txt'), 'tracked\n'); + run('add', '.'); + run('commit', '-q', '-m', 'init'); + + await fs.writeFile(join(dir, 'deleted-addition.txt'), 'temporary\n'); + run('add', 'deleted-addition.txt'); + await fs.unlink(join(dir, 'deleted-addition.txt')); + await fs.writeFile(join(dir, 'fresh.txt'), 'fresh\n'); + + const result = await svc!.computeSessionFileDiffs(URI.file(dir), { sessionUri: 'copilot:/s' }); + + assert.deepStrictEqual(result?.map(diff => URI.parse(diff.after?.uri ?? diff.before!.uri).path.split('/').pop()), ['fresh.txt']); + }); + (hasGit && !isWindows ? test : test.skip)('returns undefined when temp-index staging fails', async () => { const fs = await import('fs/promises'); const { dir } = initRepo(); diff --git a/src/vs/platform/agentHost/test/node/agentHostGitService.test.ts b/src/vs/platform/agentHost/test/node/agentHostGitService.test.ts index e5261c6c737..d01bc18bbc8 100644 --- a/src/vs/platform/agentHost/test/node/agentHostGitService.test.ts +++ b/src/vs/platform/agentHost/test/node/agentHostGitService.test.ts @@ -278,6 +278,9 @@ suite('AgentHostGitService', () => { 'renamed-old.txt', ' C copied-new.txt', 'copied-old.txt', + 'AD deleted-index-addition.txt', + 'RD deleted-rename-destination.txt', + 'rename-source.txt', ' M modified.txt', '', ].join('\x00'); @@ -291,6 +294,7 @@ suite('AgentHostGitService', () => { 'renamed-old.txt', 'copied-new.txt', 'copied-old.txt', + 'rename-source.txt', ]); });