fix(coding): preserve conflict and unicode search results

This commit is contained in:
2026-08-23 18:31:53 +08:00
parent 9520872d2f
commit 365c2b0f76
6 changed files with 152 additions and 19 deletions

View File

@@ -101,8 +101,13 @@ function normalizeRelativePath(value: string): string {
return normalized;
}
function statusFromSignature(signature: string, renamed: boolean): ConversationChangedFileStatus {
function statusFromSignature(
signature: string,
renamed: boolean,
conflicted = false,
): ConversationChangedFileStatus {
if (signature === '??') return 'untracked';
if (conflicted) return 'conflicted';
if (renamed || signature.includes('R')) return 'renamed';
if (signature.includes('D')) return 'deleted';
if (signature.includes('A')) return 'added';
@@ -121,7 +126,10 @@ function parsePorcelainV2(value: string): StatusEntry[] {
continue;
}
const renamed = record.startsWith('2 ');
const match = renamed
const conflicted = record.startsWith('u ');
const match = conflicted
? record.match(/^u ([^ ]+) [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ (.*)$/s)
: renamed
? record.match(/^2 ([^ ]+) [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ (.*)$/s)
: record.match(/^1 ([^ ]+) [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ [^ ]+ (.*)$/s);
if (!match) continue;
@@ -129,7 +137,7 @@ function parsePorcelainV2(value: string): StatusEntry[] {
const filePath = normalizeRelativePath(match[2]);
entries.push({
path: filePath,
status: statusFromSignature(signature, renamed),
status: statusFromSignature(signature, renamed, conflicted),
signature,
});
if (renamed) index += 1;