blob: 9067da29887cd7848b1d78e67262ef22d8913737 [file] [log] [blame] [edit]
// 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;
}
}