formatFileDiff function
Renders a FileDiff for omnyshell drive diff: a size/hash header for each
side, then a unified line diff (- local, + remote) when both sides are
small text. Big or binary files fall back to the header alone.
Implementation
String formatFileDiff(FileDiff d) {
final buf = StringBuffer()
..writeln('diff ${d.path}')
..writeln(' local: ${_sideSummary(d.local)}')
..writeln(' remote: ${_sideSummary(d.origin)}');
if (d.identical) {
buf.writeln('No differences.');
return buf.toString();
}
if (d.local == null) {
buf.writeln('Only on remote (node).');
} else if (d.origin == null) {
buf.writeln('Only on local.');
}
final verdict = _divergenceLine(d.side);
if (verdict != null) buf.writeln(verdict);
if (d.tooLarge) {
buf.writeln('File too large for an inline diff — size/hash only.');
return buf.toString();
}
if (d.binary) {
buf.writeln('Binary file — size/hash only.');
return buf.toString();
}
if (!d.hasContent) return buf.toString();
final local = const LineSplitter().convert(
utf8.decode(d.localBytes ?? const [], allowMalformed: true),
);
final origin = const LineSplitter().convert(
utf8.decode(d.originBytes ?? const [], allowMalformed: true),
);
if (local.length > _maxDiffLines || origin.length > _maxDiffLines) {
buf.writeln(
'Too many lines for an inline diff '
'(${local.length} local vs ${origin.length} remote) — size/hash only.',
);
return buf.toString();
}
buf
..writeln('--- local')
..writeln('+++ remote');
for (final line in _lineDiff(local, origin)) {
buf.writeln(line);
}
return buf.toString();
}