blob: e220919a03ccc41a1144a5b94bd12a5d1c05dc42 [file] [log] [blame] [edit]
// Copyright 2020 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
import 'dart:async';
import 'package:args/command_runner.dart';
import 'package:cli_util/cli_logging.dart';
import 'package:io/io.dart';
import '../model.dart';
import '../utils.dart';
const _fatalInfosArg = 'fatal-infos';
const _skipUnimportantArg = 'skip-unimportant';
const _unimportantDirectories = ['fixtures'];
class AnalyzeCommand extends Command {
AnalyzeCommand() {
argParser
..addFlag(
_fatalInfosArg,
help: 'Sets the "fatal-infos" flag for the dart analyze command',
defaultsTo: true,
negatable: true,
)
..addFlag(
_skipUnimportantArg,
help:
'Skips analysis for unimportant directories '
'${_unimportantDirectories.toString()}',
defaultsTo: false,
negatable: false,
);
}
@override
String get name => 'analyze';
@override
String get description => 'Analyze all DevTools packages.';
@override
Future run() async {
final log = Logger.standard();
final repo = DevToolsRepo.getInstance();
final processManager = ProcessManager();
final skipUnimportant = argResults![_skipUnimportantArg] as bool;
final packages = repo.getPackages(
skip: skipUnimportant ? _unimportantDirectories : [],
// Analyzing packages that are subdirectories of another package is
// redundant.
includeSubdirectories: false,
);
final fatalInfos = argResults![_fatalInfosArg] as bool;
log.stdout('Running flutter analyze...');
int failureCount = 0;
for (final p in packages) {
if (!p.hasAnyDartCode) {
continue;
}
final progress = log.progress(' ${p.relativePath}');
final process = await processManager.runProcess(
CliCommand.dart(
['analyze', if (fatalInfos) '--fatal-infos'],
// Run all so we can see the full set of results instead of stopping
// on the first error.
throwOnException: false,
),
workingDirectory: p.packagePath,
);
if (process.exitCode == 0) {
progress.finish(showTiming: true);
} else {
failureCount++;
progress.finish(message: 'failed');
}
}
return failureCount == 0 ? 0 : 1;
}
}