| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// List the packages in pkg/ as well information about their | |
| /// analysis_options.yaml configuration. | |
| library; | |
| import 'dart:io'; | |
| void main(List<String> args) { | |
| const indent = 29; | |
| var dirs = Directory('pkg').listSync().whereType<Directory>().toList(); | |
| dirs.sort((a, b) => a.path.compareTo(b.path)); | |
| for (var dir in dirs) { | |
| var pubspec = File('${dir.path}/pubspec.yaml'); | |
| if (!pubspec.existsSync()) continue; | |
| var sloc = _calcLines(dir) / 1024.0; | |
| var slocDesc = '(${sloc.toStringAsFixed(1).padLeft(6)}k lines)'; | |
| var options = File('${dir.path}/analysis_options.yaml'); | |
| var name = dir.path.split('/').last; | |
| var type = 'default'; | |
| if (options.existsSync()) { | |
| type = '** custom **'; | |
| var optionsContent = options.readAsStringSync(); | |
| if (optionsContent.contains('package:lints/core.yaml')) { | |
| type = 'core'; | |
| } else if (optionsContent.contains('package:lints/recommended.yaml')) { | |
| type = 'recommended'; | |
| } else if (optionsContent.contains( | |
| 'package:dart_flutter_team_lints/analysis_options.yaml', | |
| )) { | |
| type = 'dart_flutter_team_lints'; | |
| } | |
| } | |
| print('${name.padRight(indent)}: ${type.padRight(23)} $slocDesc'); | |
| } | |
| } | |
| int _calcLines(Directory dir) { | |
| var result = 0; | |
| for (var entity in dir.listSync()) { | |
| if (entity.name.startsWith('.')) continue; | |
| if (entity is Directory) { | |
| result += _calcLines(entity); | |
| } else { | |
| if (entity is File && entity.name.endsWith('.dart')) { | |
| result += entity | |
| .readAsLinesSync() | |
| .where((line) => line.trim().isNotEmpty) | |
| .length; | |
| } | |
| } | |
| } | |
| return result; | |
| } | |
| extension FileSystemEntityExtension on FileSystemEntity { | |
| String get name => path.split('/').last; | |
| } |