mirror of
https://github.com/anthropics/claude-code.git
synced 2026-09-14 19:48:39 +08:00
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import Limits from '../../limits'
|
|
import { cutHunks } from '../cut-hunks'
|
|
import { hunkOf } from '../hunk-of'
|
|
import { LARGE_FILE_HUNKS } from '../large-file-hunks'
|
|
import type Types from '../types'
|
|
import { HUNK_HEADER } from './hunk-header'
|
|
import { isBodyLine } from './is-body-line'
|
|
|
|
/**
|
|
* One file's unified `git diff` output as hunks, the body cut at
|
|
* MAX_LINES_PER_FILE lines in all, as the built-in panel parses one file.
|
|
*
|
|
* Past MAX_DIFF_BYTES there are no hunks and `isLarge` is set; everything
|
|
* before the first hunk header is the file's header.
|
|
*
|
|
* @param stdout the command's standard output for that one path
|
|
* @returns the parsed body
|
|
*/
|
|
export function parseFileDiff(stdout: string): Types.FileHunks {
|
|
if (stdout.length > Limits.MAX_DIFF_BYTES) {
|
|
return LARGE_FILE_HUNKS
|
|
}
|
|
|
|
const rows = stdout.split('\n')
|
|
|
|
const headerRows = rows.flatMap((row, at) =>
|
|
HUNK_HEADER.test(row) ? [at] : [],
|
|
)
|
|
|
|
return {
|
|
...cutHunks(
|
|
headerRows.map((at, ordinal) =>
|
|
hunkOf(
|
|
HUNK_HEADER.exec(rows[at] ?? '')?.groups,
|
|
rows.slice(at + 1, headerRows[ordinal + 1]).filter(isBodyLine),
|
|
),
|
|
),
|
|
),
|
|
isLarge: false,
|
|
}
|
|
}
|