gitStatus function

Future<List<GitStatusEntry>> gitStatus({
  1. String? dir,
})

Get git status (porcelain v1 format).

Implementation

Future<List<GitStatusEntry>> gitStatus({String? dir}) async {
  final result = await runGit([
    'status',
    '--porcelain=v1',
  ], workingDirectory: dir);

  if (!result.success) return [];

  return result.output.split('\n').where((l) => l.length >= 3).map((line) {
    final xy = line.substring(0, 2);
    final path = line.substring(3);

    final status = switch (xy.trim()) {
      'A' || '??' => GitFileStatus.added,
      'M' || 'MM' => GitFileStatus.modified,
      'D' => GitFileStatus.deleted,
      'R' => GitFileStatus.renamed,
      'C' => GitFileStatus.copied,
      '!!' => GitFileStatus.ignored,
      _ when xy.contains('?') => GitFileStatus.untracked,
      _ => GitFileStatus.modified,
    };

    String? originalPath;
    if (status == GitFileStatus.renamed && path.contains(' -> ')) {
      final parts = path.split(' -> ');
      originalPath = parts[0];
      return GitStatusEntry(
        path: parts[1],
        status: status,
        originalPath: originalPath,
      );
    }

    return GitStatusEntry(path: path, status: status);
  }).toList();
}