| // Copyright 2013 The Flutter 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 'package:file/file.dart'; |
| import 'package:platform/platform.dart'; |
| |
| import 'common/core.dart'; |
| import 'common/gradle.dart'; |
| import 'common/package_looping_command.dart'; |
| import 'common/plugin_utils.dart'; |
| import 'common/process_runner.dart'; |
| import 'common/repository_package.dart'; |
| |
| /// Run 'gradlew lint'. |
| /// |
| /// See https://developer.android.com/studio/write/lint. |
| class LintAndroidCommand extends PackageLoopingCommand { |
| /// Creates an instance of the linter command. |
| LintAndroidCommand( |
| Directory packagesDir, { |
| ProcessRunner processRunner = const ProcessRunner(), |
| Platform platform = const LocalPlatform(), |
| }) : super(packagesDir, processRunner: processRunner, platform: platform); |
| |
| @override |
| final String name = 'lint-android'; |
| |
| @override |
| final String description = 'Runs "gradlew lint" on Android plugins.\n\n' |
| 'Requires the examples to have been build at least once before running.'; |
| |
| @override |
| Future<PackageResult> runForPackage(RepositoryPackage package) async { |
| if (!pluginSupportsPlatform(platformAndroid, package, |
| requiredMode: PlatformSupport.inline)) { |
| return PackageResult.skip( |
| 'Plugin does not have an Android implementation.'); |
| } |
| |
| for (final RepositoryPackage example in package.getExamples()) { |
| final GradleProject project = GradleProject(example, |
| processRunner: processRunner, platform: platform); |
| |
| if (!project.isConfigured()) { |
| // TODO(stuartmorgan): Replace this with a --config-only build once |
| // that's available on stable. |
| return PackageResult.fail(<String>['Build examples before linting']); |
| } |
| |
| final String packageName = package.directory.basename; |
| |
| // Only lint one build mode to avoid extra work. |
| // Only lint the plugin project itself, to avoid failing due to errors in |
| // dependencies. |
| // |
| // TODO(stuartmorgan): Consider adding an XML parser to read and summarize |
| // all results. Currently, only the first three errors will be shown |
| // inline, and the rest have to be checked via the CI-uploaded artifact. |
| final int exitCode = await project.runCommand('$packageName:lintDebug'); |
| if (exitCode != 0) { |
| return PackageResult.fail(); |
| } |
| } |
| |
| return PackageResult.success(); |
| } |
| } |