filesNeedingFormat method

Future<List<String>> filesNeedingFormat(
  1. String packageDir,
  2. bool usesFlutter, {
  3. int? lineLength,
})

Implementation

Future<List<String>> filesNeedingFormat(String packageDir, bool usesFlutter,
    {int? lineLength}) async {
  final dirs = await listFocusDirs(packageDir);
  if (dirs.isEmpty) {
    return const [];
  }
  final files = <String>{};
  for (final dir in dirs) {
    final fullPath = p.join(packageDir, dir);

    final params = <String>[
      'format',
      '--output=none',
      '--set-exit-if-changed',
    ];
    if (lineLength != null && lineLength > 0) {
      params.addAll(<String>['--line-length', lineLength.toString()]);
    }
    params.add(fullPath);

    final result = await runConstrained(
      [..._dartSdk.dartCmd, ...params],
      environment:
          usesFlutter ? _flutterSdk.environment : _dartSdk.environment,
      timeout: _dartFormatTimeout,
    );
    if (result.exitCode == 0) {
      continue;
    }

    final dirPrefix = packageDir.endsWith('/') ? packageDir : '$packageDir/';
    final output = result.asJoinedOutput;
    final lines = LineSplitter.split(result.asJoinedOutput)
        .where((l) => l.startsWith('Changed'))
        .map((l) => l.substring(8).replaceAll(dirPrefix, '').trim())
        .toList();

    // `dart format` exits with code = 1
    if (result.exitCode == 1) {
      assert(lines.isNotEmpty);
      files.addAll(lines);
      continue;
    }

    final errorMsg = LineSplitter.split(output).take(10).join('\n');
    final isUserProblem = output.contains(
            'Could not format because the source could not be parsed') ||
        output.contains('The formatter produced unexpected output.');
    if (!isUserProblem) {
      throw Exception(
        'dart format on $dir/ failed with exit code ${result.exitCode}\n$output',
      );
    }
    throw ToolException(errorMsg, result);
  }
  return files.toList()..sort();
}