formatFileDiff function

String formatFileDiff(
  1. FileDiff d
)

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();
}