export interface CommitFields { hash: string; shortHash: string; author: string; authorEmail: string; date: string; subject: string; body: string; } export function parseGitLogOutput(output: string): CommitFields[] { const commits: CommitFields[] = []; // Split by NUL character to separate commits const commitBlocks = output.split('\0').filter((block) => block.trim()); for (const block of commitBlocks) { const allLines = block.split('\n'); // Skip leading empty lines that may appear at block boundaries let startIndex = 0; while (startIndex < allLines.length && allLines[startIndex].trim() === '') { startIndex++; } const fields = allLines.slice(startIndex); // Validate we have all expected fields (at least hash, shortHash, author, authorEmail, date, subject) if (fields.length < 6) { continue; // Skip malformed blocks } const commit: CommitFields = { hash: fields[0].trim(), shortHash: fields[1].trim(), author: fields[2].trim(), authorEmail: fields[3].trim(), date: fields[4].trim(), subject: fields[5].trim(), body: fields.slice(6).join('\n').trim(), }; commits.push(commit); } return commits; } /** * Creates a commit object from parsed fields, matching the expected API response format */ export function createCommitFromFields(fields: CommitFields, files?: string[]) { return { hash: fields.hash, shortHash: fields.shortHash, author: fields.author, authorEmail: fields.authorEmail, date: fields.date, subject: fields.subject, body: fields.body, files: files || [], }; }