From 3e43c3e11072eea99fa357776299c20a6b2212c6 Mon Sep 17 00:00:00 2001 From: Pierre-Louis <6655696+guidezpl@users.noreply.github.com> Date: Wed, 6 Oct 2021 02:28:04 +0200 Subject: [PATCH] Categorize flutter tool commands (#87747) --- .../flutter_tools/lib/src/commands/analyze.dart | 3 +++ .../flutter_tools/lib/src/commands/assemble.dart | 3 +++ packages/flutter_tools/lib/src/commands/attach.dart | 3 +++ packages/flutter_tools/lib/src/commands/build.dart | 3 +++ .../flutter_tools/lib/src/commands/channel.dart | 3 +++ packages/flutter_tools/lib/src/commands/clean.dart | 3 +++ packages/flutter_tools/lib/src/commands/config.dart | 3 +++ packages/flutter_tools/lib/src/commands/create.dart | 3 +++ .../lib/src/commands/custom_devices.dart | 3 +++ packages/flutter_tools/lib/src/commands/daemon.dart | 3 +++ .../flutter_tools/lib/src/commands/devices.dart | 3 +++ packages/flutter_tools/lib/src/commands/doctor.dart | 3 +++ .../flutter_tools/lib/src/commands/downgrade.dart | 3 +++ packages/flutter_tools/lib/src/commands/drive.dart | 5 ++++- .../flutter_tools/lib/src/commands/emulators.dart | 3 +++ packages/flutter_tools/lib/src/commands/format.dart | 3 +++ .../lib/src/commands/generate_localizations.dart | 3 +++ .../flutter_tools/lib/src/commands/install.dart | 3 +++ packages/flutter_tools/lib/src/commands/logs.dart | 3 +++ .../flutter_tools/lib/src/commands/packages.dart | 3 +++ .../flutter_tools/lib/src/commands/precache.dart | 3 +++ packages/flutter_tools/lib/src/commands/run.dart | 3 +++ .../flutter_tools/lib/src/commands/screenshot.dart | 3 +++ .../lib/src/commands/shell_completion.dart | 3 +++ .../flutter_tools/lib/src/commands/symbolize.dart | 3 +++ packages/flutter_tools/lib/src/commands/test.dart | 3 +++ .../flutter_tools/lib/src/commands/upgrade.dart | 3 +++ .../lib/src/runner/flutter_command.dart | 7 +++++++ .../flutter_tools/test/general.shard/args_test.dart | 13 +++++++++++++ 29 files changed, 102 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart index aa096f9c4a9..63d3ede975e 100644 --- a/packages/flutter_tools/lib/src/commands/analyze.dart +++ b/packages/flutter_tools/lib/src/commands/analyze.dart @@ -105,6 +105,9 @@ class AnalyzeCommand extends FlutterCommand { @override String get description => "Analyze the project's Dart code."; + @override + String get category => FlutterCommandCategory.project; + @override bool get shouldRunPub { // If they're not analyzing the current project. diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart index 8b74194b81d..96f121b8c04 100644 --- a/packages/flutter_tools/lib/src/commands/assemble.dart +++ b/packages/flutter_tools/lib/src/commands/assemble.dart @@ -139,6 +139,9 @@ class AssembleCommand extends FlutterCommand { @override String get name => 'assemble'; + @override + String get category => FlutterCommandCategory.project; + @override Future get usageValues async { final FlutterProject flutterProject = FlutterProject.current(); diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart index 7debc8e1d89..c9618d6be30 100644 --- a/packages/flutter_tools/lib/src/commands/attach.dart +++ b/packages/flutter_tools/lib/src/commands/attach.dart @@ -144,6 +144,9 @@ If the app or module is already running and the specific observatory port is known, it can be explicitly provided to attach via the command-line, e.g. `$ flutter attach --debug-port 12345`'''; + @override + final String category = FlutterCommandCategory.tools; + int get debugPort { if (argResults['debug-port'] == null) { return null; diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index 80222633d76..2fc4b73b3ee 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -57,6 +57,9 @@ class BuildCommand extends FlutterCommand { @override final String description = 'Build an executable app or install bundle.'; + @override + String get category => FlutterCommandCategory.project; + @override Future runCommand() async => null; } diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart index cd394351b9a..d404d57664e 100644 --- a/packages/flutter_tools/lib/src/commands/channel.dart +++ b/packages/flutter_tools/lib/src/commands/channel.dart @@ -27,6 +27,9 @@ class ChannelCommand extends FlutterCommand { @override final String description = 'List or switch Flutter channels.'; + @override + final String category = FlutterCommandCategory.sdk; + @override String get invocation => '${runner.executableName} $name []'; diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart index a70103b2efa..c41b8dd1f81 100644 --- a/packages/flutter_tools/lib/src/commands/clean.dart +++ b/packages/flutter_tools/lib/src/commands/clean.dart @@ -29,6 +29,9 @@ class CleanCommand extends FlutterCommand { @override final String description = 'Delete the build/ and .dart_tool/ directories.'; + @override + String get category => FlutterCommandCategory.project; + @override Future> get requiredArtifacts async => const {}; diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart index 533d2c0d777..72f8fb6b486 100644 --- a/packages/flutter_tools/lib/src/commands/config.dart +++ b/packages/flutter_tools/lib/src/commands/config.dart @@ -54,6 +54,9 @@ class ConfigCommand extends FlutterCommand { 'The Flutter tool anonymously reports feature usage statistics and basic crash reports to help improve ' "Flutter tools over time. See Google's privacy policy: https://www.google.com/intl/en/policies/privacy/"; + @override + final String category = FlutterCommandCategory.sdk; + @override final List aliases = ['configure']; diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart index c56590c453c..af1ee79fffe 100644 --- a/packages/flutter_tools/lib/src/commands/create.dart +++ b/packages/flutter_tools/lib/src/commands/create.dart @@ -78,6 +78,9 @@ class CreateCommand extends CreateBase { final String description = 'Create a new Flutter project.\n\n' 'If run on a project that already exists, this will repair the project, recreating any files that are missing.'; + @override + String get category => FlutterCommandCategory.project; + @override String get invocation => '${runner.executableName} $name '; diff --git a/packages/flutter_tools/lib/src/commands/custom_devices.dart b/packages/flutter_tools/lib/src/commands/custom_devices.dart index 4b6d3172203..91c820338c7 100644 --- a/packages/flutter_tools/lib/src/commands/custom_devices.dart +++ b/packages/flutter_tools/lib/src/commands/custom_devices.dart @@ -158,6 +158,9 @@ Requires the custom devices feature to be enabled. You can enable it using "flut @override String get name => 'custom-devices'; + @override + String get category => FlutterCommandCategory.tools; + @override Future runCommand() async => null; diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index de85eaf0804..f356bec2307 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -49,6 +49,9 @@ class DaemonCommand extends FlutterCommand { @override final String description = 'Run a persistent, JSON-RPC based server to communicate with devices.'; + @override + final String category = FlutterCommandCategory.tools; + @override final bool hidden; diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart index ebef8e78b17..25961501570 100644 --- a/packages/flutter_tools/lib/src/commands/devices.dart +++ b/packages/flutter_tools/lib/src/commands/devices.dart @@ -33,6 +33,9 @@ class DevicesCommand extends FlutterCommand { @override final String description = 'List all connected devices.'; + @override + final String category = FlutterCommandCategory.tools; + @override Duration get deviceDiscoveryTimeout { if (argResults['timeout'] != null) { diff --git a/packages/flutter_tools/lib/src/commands/doctor.dart b/packages/flutter_tools/lib/src/commands/doctor.dart index 6f3d2f560fb..c22595353f0 100644 --- a/packages/flutter_tools/lib/src/commands/doctor.dart +++ b/packages/flutter_tools/lib/src/commands/doctor.dart @@ -31,6 +31,9 @@ class DoctorCommand extends FlutterCommand { @override final String description = 'Show information about the installed tooling.'; + @override + final String category = FlutterCommandCategory.sdk; + @override Future runCommand() async { globals.flutterVersion.fetchTagsAndUpdate(); diff --git a/packages/flutter_tools/lib/src/commands/downgrade.dart b/packages/flutter_tools/lib/src/commands/downgrade.dart index d4f37f6f0b7..c71df4a9ba1 100644 --- a/packages/flutter_tools/lib/src/commands/downgrade.dart +++ b/packages/flutter_tools/lib/src/commands/downgrade.dart @@ -76,6 +76,9 @@ class DowngradeCommand extends FlutterCommand { @override String get name => 'downgrade'; + @override + final String category = FlutterCommandCategory.sdk; + @override Future runCommand() async { // Commands do not necessarily have access to the correct zone injected diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart index 49326df3f63..fdb30d02da8 100644 --- a/packages/flutter_tools/lib/src/commands/drive.dart +++ b/packages/flutter_tools/lib/src/commands/drive.dart @@ -22,7 +22,7 @@ import '../device.dart'; import '../drive/drive_service.dart'; import '../globals_null_migrated.dart' as globals; import '../resident_runner.dart'; -import '../runner/flutter_command.dart' show FlutterCommandResult, FlutterOptions; +import '../runner/flutter_command.dart' show FlutterCommandCategory, FlutterCommandResult, FlutterOptions; import '../web/web_device.dart'; import 'run.dart'; @@ -172,6 +172,9 @@ class DriveCommand extends RunCommandBase { @override final String description = 'Run integration tests for the project on an attached device or emulator.'; + @override + String get category => FlutterCommandCategory.project; + @override final List aliases = ['driver']; diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart index eb8b35c40ff..6b520dc8178 100644 --- a/packages/flutter_tools/lib/src/commands/emulators.dart +++ b/packages/flutter_tools/lib/src/commands/emulators.dart @@ -31,6 +31,9 @@ class EmulatorsCommand extends FlutterCommand { @override final String description = 'List, launch and create emulators.'; + @override + final String category = FlutterCommandCategory.tools; + @override final List aliases = ['emulator']; diff --git a/packages/flutter_tools/lib/src/commands/format.dart b/packages/flutter_tools/lib/src/commands/format.dart index ca9ede5e7b7..7acb88b65be 100644 --- a/packages/flutter_tools/lib/src/commands/format.dart +++ b/packages/flutter_tools/lib/src/commands/format.dart @@ -29,6 +29,9 @@ class FormatCommand extends FlutterCommand { @override final String description = 'Format one or more Dart files.'; + @override + String get category => FlutterCommandCategory.project; + @override String get invocation => '${runner.executableName} $name '; diff --git a/packages/flutter_tools/lib/src/commands/generate_localizations.dart b/packages/flutter_tools/lib/src/commands/generate_localizations.dart index a4029234720..66526a37ed7 100644 --- a/packages/flutter_tools/lib/src/commands/generate_localizations.dart +++ b/packages/flutter_tools/lib/src/commands/generate_localizations.dart @@ -194,6 +194,9 @@ class GenerateLocalizationsCommand extends FlutterCommand { @override String get name => 'gen-l10n'; + @override + String get category => FlutterCommandCategory.project; + @override Future runCommand() async { if (_fileSystem.file('l10n.yaml').existsSync()) { diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart index 1c0c321fdfb..104cf483865 100644 --- a/packages/flutter_tools/lib/src/commands/install.dart +++ b/packages/flutter_tools/lib/src/commands/install.dart @@ -30,6 +30,9 @@ class InstallCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts @override final String description = 'Install a Flutter app on an attached device.'; + @override + final String category = FlutterCommandCategory.tools; + Device device; bool get uninstallOnly => boolArg('uninstall-only'); diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart index 2a34f97f5a8..80733ef7f1f 100644 --- a/packages/flutter_tools/lib/src/commands/logs.dart +++ b/packages/flutter_tools/lib/src/commands/logs.dart @@ -28,6 +28,9 @@ class LogsCommand extends FlutterCommand { @override final String description = 'Show log output for running Flutter apps.'; + @override + final String category = FlutterCommandCategory.tools; + @override Future> get requiredArtifacts async => const {}; diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart index 557bc0acb51..bb507823748 100644 --- a/packages/flutter_tools/lib/src/commands/packages.dart +++ b/packages/flutter_tools/lib/src/commands/packages.dart @@ -50,6 +50,9 @@ class PackagesCommand extends FlutterCommand { @override final String description = 'Commands for managing Flutter packages.'; + @override + String get category => FlutterCommandCategory.project; + @override Future runCommand() async => null; } diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart index 56ec32c4f7c..39de6503826 100644 --- a/packages/flutter_tools/lib/src/commands/precache.dart +++ b/packages/flutter_tools/lib/src/commands/precache.dart @@ -77,6 +77,9 @@ class PrecacheCommand extends FlutterCommand { 'If no explicit platform flags are provided, this command will download the artifacts ' 'for all currently enabled platforms'; + @override + final String category = FlutterCommandCategory.sdk; + @override bool get shouldUpdateCache => false; diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index c8d420fbed2..c56742dc6b8 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -343,6 +343,9 @@ class RunCommand extends RunCommandBase { @override final String description = 'Run your Flutter app on an attached device.'; + @override + String get category => FlutterCommandCategory.project; + List devices; bool webMode = false; diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart index 86e106f93fc..0f7419190d6 100644 --- a/packages/flutter_tools/lib/src/commands/screenshot.dart +++ b/packages/flutter_tools/lib/src/commands/screenshot.dart @@ -61,6 +61,9 @@ class ScreenshotCommand extends FlutterCommand { @override String get description => 'Take a screenshot from a connected device.'; + @override + final String category = FlutterCommandCategory.tools; + @override final List aliases = ['pic']; diff --git a/packages/flutter_tools/lib/src/commands/shell_completion.dart b/packages/flutter_tools/lib/src/commands/shell_completion.dart index b13f71c590c..c06774bd872 100644 --- a/packages/flutter_tools/lib/src/commands/shell_completion.dart +++ b/packages/flutter_tools/lib/src/commands/shell_completion.dart @@ -31,6 +31,9 @@ class ShellCompletionCommand extends FlutterCommand { 'install it in your shell environment. Once it is sourced, your shell will be able to ' 'complete flutter commands and options.'; + @override + final String category = FlutterCommandCategory.sdk; + @override final List aliases = ['zsh-completion']; diff --git a/packages/flutter_tools/lib/src/commands/symbolize.dart b/packages/flutter_tools/lib/src/commands/symbolize.dart index e44978491d7..df915b50cad 100644 --- a/packages/flutter_tools/lib/src/commands/symbolize.dart +++ b/packages/flutter_tools/lib/src/commands/symbolize.dart @@ -59,6 +59,9 @@ class SymbolizeCommand extends FlutterCommand { @override String get name => 'symbolize'; + @override + final String category = FlutterCommandCategory.tools; + @override bool get shouldUpdateCache => false; diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index aeba69a00f3..fae28596bb3 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -249,6 +249,9 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { @override String get description => 'Run Flutter unit tests for the current project.'; + @override + String get category => FlutterCommandCategory.project; + @override Future verifyThenRunCommand(String commandPath) { _testFiles = argResults.rest.map(globals.fs.path.absolute).toList(); diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart index 9b5c6d0890f..038a02969aa 100644 --- a/packages/flutter_tools/lib/src/commands/upgrade.dart +++ b/packages/flutter_tools/lib/src/commands/upgrade.dart @@ -63,6 +63,9 @@ class UpgradeCommand extends FlutterCommand { @override final String description = 'Upgrade your copy of Flutter.'; + @override + final String category = FlutterCommandCategory.sdk; + @override bool get shouldUpdateCache => false; diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index cc42503cc08..b642ee95196 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -122,6 +122,13 @@ class FlutterOptions { static const String kInitializeFromDill = 'initialize-from-dill'; } +/// flutter command categories for usage. +class FlutterCommandCategory { + static const String sdk = 'Flutter SDK'; + static const String project = 'Project'; + static const String tools = 'Tools & Devices'; +} + abstract class FlutterCommand extends Command { /// The currently executing command (or sub-command). /// diff --git a/packages/flutter_tools/test/general.shard/args_test.dart b/packages/flutter_tools/test/general.shard/args_test.dart index 81f33411746..2441015b281 100644 --- a/packages/flutter_tools/test/general.shard/args_test.dart +++ b/packages/flutter_tools/test/general.shard/args_test.dart @@ -7,6 +7,7 @@ import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:flutter_tools/executable.dart' as executable; +import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/runner/flutter_command_runner.dart'; import '../src/common.dart'; @@ -34,6 +35,18 @@ void verifyCommandRunner(CommandRunner runner) { void verifyCommand(Command runner) { expect(runner.argParser, isNotNull, reason: 'command ${runner.name} has no argParser'); verifyOptions(runner.name, runner.argParser.options.values); + if (runner.hidden == false && runner.parent == null) { + expect( + runner.category, + anyOf( + FlutterCommandCategory.sdk, + FlutterCommandCategory.project, + FlutterCommandCategory.tools, + ), + reason: "top-level command ${runner.name} doesn't have a valid category", + ); + } + runner.subcommands.values.forEach(verifyCommand); }