| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import 'package:args/command_runner.dart'; |
| import 'package:cli_util/cli_logging.dart'; |
| |
| import '../model.dart'; |
| import '../utils.dart'; |
| |
| class AnalyzeCommand extends Command { |
| @override |
| String get name => 'analyze'; |
| |
| @override |
| String get description => 'Analyze all DevTools packages.'; |
| |
| @override |
| Future run() async { |
| final sdk = FlutterSdk.getSdk(); |
| if (sdk == null) { |
| print('Unable to locate a Flutter sdk.'); |
| return 1; |
| } |
| |
| final log = Logger.standard(); |
| final repo = DevToolsRepo.getInstance()!; |
| final packages = repo.getPackages(); |
| |
| log.stdout('Running flutter analyze...'); |
| |
| int failureCount = 0; |
| |
| for (Package p in packages) { |
| if (!p.hasAnyDartCode) { |
| continue; |
| } |
| |
| final progress = log.progress(' ${p.relativePath}'); |
| |
| final process = await Process.start( |
| sdk.dartToolPath, |
| ['analyze', '--fatal-infos'], |
| workingDirectory: p.packagePath, |
| ); |
| final Stream<List<int>> stdout = process.stdout; |
| final Stream<List<int>> stderr = process.stderr; |
| |
| final int exitCode = await process.exitCode; |
| |
| if (exitCode == 0) { |
| progress.finish(showTiming: true); |
| } else { |
| failureCount++; |
| |
| // Display stderr when there's an error. |
| final List<List<int>> out = await stdout.toList(); |
| final stdOutput = convertProcessOutputToString(out, ' '); |
| |
| final List<List<int>> err = await stderr.toList(); |
| final errorOutput = convertProcessOutputToString(err, ' '); |
| |
| progress.finish(message: 'failed'); |
| |
| log.stderr(stdOutput); |
| log.stderr(log.ansi.error(errorOutput)); |
| } |
| } |
| |
| return failureCount == 0 ? 0 : 1; |
| } |
| } |