// 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:flutter_plugin_tools/src/common/plugin_utils.dart'; import 'package:platform/platform.dart'; import 'common/core.dart'; import 'common/gradle.dart'; import 'common/package_looping_command.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 example to have been build at least once before running.'; @override Future runForPackage(RepositoryPackage package) async { if (!pluginSupportsPlatform(platformAndroid, package, requiredMode: PlatformSupport.inline)) { return PackageResult.skip( 'Plugin does not have an Android implemenatation.'); } final RepositoryPackage example = package.getSingleExampleDeprecated(); final GradleProject project = GradleProject(example.directory, processRunner: processRunner, platform: platform); if (!project.isConfigured()) { return PackageResult.fail(['Build example 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'); return exitCode == 0 ? PackageResult.success() : PackageResult.fail(); } }