getModifiedDartFiles method

Future<List<String>> getModifiedDartFiles(
  1. String baseCommit, {
  2. List<String> targetPaths = const [],
})

Finds Dart files modified between baseCommit and HEAD.

Implementation

Future<List<String>> getModifiedDartFiles(
  String baseCommit, {
  List<String> targetPaths = const [],
}) async {
  final repoRoot = await getRepoRoot();
  final args = ['diff', '--name-only', '--diff-filter=ACMR', baseCommit];

  final res = await _runGit(args);
  if (res.exitCode != 0) {
    throw ArgumentError(
      'Git diff failed against base commit "$baseCommit": '
      '${(res.stderr as String).trim()}',
    );
  }

  final output = (res.stdout as String).trim();
  if (output.isEmpty) {
    return [];
  }

  final allChanged = output.split('\n').map((l) => l.trim()).toList();
  final results = <String>[];

  for (final relPath in allChanged) {
    if (relPath.isEmpty || p.extension(relPath) != '.dart') {
      continue;
    }
    if (isExcludedPath(relPath)) {
      continue;
    }

    final absPath = p.join(repoRoot, relPath);
    if (targetPaths.isNotEmpty) {
      final matches = targetPaths.any((t) {
        final absTarget = p.join(repoRoot, t);
        return p.isWithin(absTarget, absPath) || p.equals(absTarget, absPath);
      });
      if (!matches) {
        continue;
      }
    }

    results.add(relPath);
  }

  return results;
}