// 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. import 'dart:io'; void main(List args) { const indent = 29; var dirs = Directory('pkg').listSync().whereType().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; if (options.existsSync()) { var 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'; } print('${name.padRight(indent)}: ${type.padRight(12)} $slocDesc'); } else { print('${name.padRight(indent)}: default $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; }