import type { FileChange, TaskSummary } from "./git.ts"; import { sanitizeTerminalText } from "./patch.ts"; export function fileIcon(status: FileChange["status"]): string { if (status === "A") return "+"; if (status === "D") return "-"; return "~"; } export function fileCounts(file: FileChange): string { if (file.binary) return "(binary)"; return `+${file.insertions} -${file.deletions}`; } export function displayPath(file: string): string { return /[\u0000-\u001f\u007f-\u009f]/.test(file) ? sanitizeTerminalText(JSON.stringify(file)) : file; } export function formatSummary( summary: TaskSummary, expanded: boolean, expandHint = "F6 for details", ): string { const fileWord = summary.files.length === 1 ? "file" : "files"; const header = `${summary.files.length} ${fileWord} changed +${summary.totalInsertions} -${summary.totalDeletions}`; if (!expanded) { return `${header} (${expandHint})`; } const details = summary.files.map( (file) => `${fileIcon(file.status)} ${displayPath(file.file)} ${fileCounts(file)}`, ); return [header, ...details].join("\n"); }