log method

Future<List<GitCommit>> log({
  1. int? maxCount,
  2. String? since,
  3. String? until,
  4. String? author,
  5. String? path,
  6. bool oneline = false,
  7. String? workDir,
})

Returns commit log entries.

Implementation

Future<List<GitCommit>> log({
  int? maxCount,
  String? since,
  String? until,
  String? author,
  String? path,
  bool oneline = false,
  String? workDir,
}) async {
  final args = <String>[
    'log',
    '--format=%H%n%h%n%an%n%ae%n%aI%n%P%n%s%n---END---',
  ];

  if (maxCount != null) args.add('--max-count=$maxCount');
  if (since != null) args.add('--since=$since');
  if (until != null) args.add('--until=$until');
  if (author != null) args.add('--author=$author');
  if (path != null) {
    args.add('--');
    args.add(path);
  }

  final result = await _runGit(args, workDir: workDir ?? defaultWorkDir);
  final output = (result.stdout as String).trim();
  if (output.isEmpty) return [];

  final commits = <GitCommit>[];
  final blocks = output.split('---END---');

  for (final block in blocks) {
    final lines = LineSplitter.split(block.trim()).toList();
    if (lines.length < 6) continue;

    commits.add(
      GitCommit(
        hash: lines[0],
        shortHash: lines[1],
        author: lines[2],
        email: lines[3],
        date: DateTime.tryParse(lines[4]) ?? DateTime.now(),
        parents: lines[5].isNotEmpty ? lines[5].split(' ') : [],
        message: lines.length > 6 ? lines.sublist(6).join('\n') : '',
      ),
    );
  }

  return commits;
}