From 84e576786c3dc5a839134b4862177c24f9030c85 Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Thu, 8 Jul 2021 23:56:06 +0200 Subject: [PATCH] [flutter_tools] show only supported sub commands (#85125) --- .../flutter_tools/lib/src/commands/build.dart | 34 ++++++++++++------- .../lib/src/commands/build_fuchsia.dart | 5 ++- .../lib/src/commands/build_ios.dart | 5 ++- .../lib/src/commands/build_ios_framework.dart | 5 ++- .../lib/src/commands/build_macos.dart | 5 ++- .../hermetic/build_fuchsia_test.dart | 3 +- .../hermetic/build_ios_test.dart | 3 +- .../hermetic/build_ipa_test.dart | 3 +- .../hermetic/build_macos_test.dart | 4 +-- .../general.shard/commands/build_test.dart | 8 +++++ 10 files changed, 53 insertions(+), 22 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index d1213de7671..80222633d76 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -24,25 +24,31 @@ import 'build_winuwp.dart'; class BuildCommand extends FlutterCommand { BuildCommand({ bool verboseHelp = false }) { - addSubcommand(BuildAarCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildApkCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildIOSFrameworkCommand( + _addSubcommand(BuildAarCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildApkCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildIOSFrameworkCommand( buildSystem: globals.buildSystem, verboseHelp: verboseHelp, )); - addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildWebCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildLinuxCommand( + _addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildWebCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildLinuxCommand( operatingSystemUtils: globals.os, verboseHelp: verboseHelp )); - addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp)); - addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp)); + } + + void _addSubcommand(BuildSubCommand command) { + if (command.supported) { + addSubcommand(command); + } } @override @@ -63,6 +69,8 @@ abstract class BuildSubCommand extends FlutterCommand { @override bool get reportNullSafety => true; + bool get supported => true; + /// Display a message describing the current null safety runtime mode /// that was selected. /// diff --git a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart index e26e7227e00..cd0b67baace 100644 --- a/packages/flutter_tools/lib/src/commands/build_fuchsia.dart +++ b/packages/flutter_tools/lib/src/commands/build_fuchsia.dart @@ -58,6 +58,9 @@ class BuildFuchsiaCommand extends BuildSubCommand { @override String get description => 'Build the Fuchsia target (Experimental).'; + @override + bool get supported => globals.platform.isLinux || globals.platform.isMacOS; + @override Future runCommand() async { if (!featureFlags.isFuchsiaEnabled) { @@ -68,7 +71,7 @@ class BuildFuchsiaCommand extends BuildSubCommand { } final BuildInfo buildInfo = await getBuildInfo(); final FlutterProject flutterProject = FlutterProject.current(); - if (!globals.platform.isLinux && !globals.platform.isMacOS) { + if (!supported) { throwToolExit('"build fuchsia" is only supported on Linux and MacOS hosts.'); } if (!flutterProject.fuchsia.existsSync()) { diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index 07f57f45fb1..331ecc961ee 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -224,12 +224,15 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand { Directory _outputAppDirectory(String xcodeResultOutput); + @override + bool get supported => globals.platform.isMacOS; + @override Future runCommand() async { defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release; final BuildInfo buildInfo = await getBuildInfo(); - if (!globals.platform.isMacOS) { + if (!supported) { throwToolExit('Building for iOS is only supported on macOS.'); } if (forSimulator && !buildInfo.supportsSimulator) { diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index 10c2da8339c..bb56a93638d 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -141,11 +141,14 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { return buildInfos; } + @override + bool get supported => _platform.isMacOS; + @override Future validateCommand() async { await super.validateCommand(); _project = FlutterProject.current(); - if (!_platform.isMacOS) { + if (!supported) { throwToolExit('Building frameworks for iOS is only supported on the Mac.'); } diff --git a/packages/flutter_tools/lib/src/commands/build_macos.dart b/packages/flutter_tools/lib/src/commands/build_macos.dart index c6834096c2b..161d00517eb 100644 --- a/packages/flutter_tools/lib/src/commands/build_macos.dart +++ b/packages/flutter_tools/lib/src/commands/build_macos.dart @@ -39,6 +39,9 @@ class BuildMacosCommand extends BuildSubCommand { @override String get description => 'Build a macOS desktop application.'; + @override + bool get supported => globals.platform.isMacOS; + @override Future runCommand() async { final BuildInfo buildInfo = await getBuildInfo(); @@ -46,7 +49,7 @@ class BuildMacosCommand extends BuildSubCommand { if (!featureFlags.isMacOSEnabled) { throwToolExit('"build macos" is not currently supported. To enable, run "flutter config --enable-macos-desktop".'); } - if (!globals.platform.isMacOS) { + if (!supported) { throwToolExit('"build macos" only supported on macOS hosts.'); } displayNullSafetyMode(buildInfo); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart index cd934bcb00b..a2205347923 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart @@ -4,6 +4,7 @@ // @dart = 2.8 +import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; @@ -111,7 +112,7 @@ void main() { expect( createTestCommandRunner(command).run(const ['build', 'fuchsia']), - throwsToolExit(), + throwsA(isA()), ); }, overrides: { Platform: () => windowsPlatform, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart index 9974e564a32..e108f60fb94 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart @@ -4,6 +4,7 @@ // @dart = 2.8 +import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; @@ -162,7 +163,7 @@ void main() { expect(createTestCommandRunner(command).run( const ['build', 'ios', '--no-pub'] - ), throwsToolExit()); + ), throwsA(isA())); }, overrides: { Platform: () => notMacosPlatform, FileSystem: () => fileSystem, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart index d4705c569b7..b23b9e3d807 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart @@ -4,6 +4,7 @@ // @dart = 2.8 +import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; @@ -157,7 +158,7 @@ void main() { expect(createTestCommandRunner(command).run( const ['build', 'ipa', '--no-pub'] - ), throwsToolExit()); + ), throwsA(isA())); }, overrides: { Platform: () => notMacosPlatform, FileSystem: () => fileSystem, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart index 5ae6e72faeb..32143097bf4 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart @@ -149,7 +149,7 @@ void main() { expect(createTestCommandRunner(command).run( const ['build', 'macos', '--no-pub'] - ), throwsToolExit(message: '"build macos" only supported on macOS hosts.')); + ), throwsA(isA())); }, overrides: { Platform: () => notMacosPlatform, FileSystem: () => fileSystem, @@ -391,7 +391,7 @@ void main() { final CommandRunner runner = createTestCommandRunner(BuildCommand()); expect(() => runner.run(['build', 'macos', '--no-pub']), - throwsToolExit()); + throwsA(isA())); }, overrides: { FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: false), }); diff --git a/packages/flutter_tools/test/general.shard/commands/build_test.dart b/packages/flutter_tools/test/general.shard/commands/build_test.dart index f75faec6235..d5463e3a43d 100644 --- a/packages/flutter_tools/test/general.shard/commands/build_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/build_test.dart @@ -5,6 +5,7 @@ // @dart = 2.8 import 'package:args/args.dart'; +import 'package:args/command_runner.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/commands/attach.dart'; import 'package:flutter_tools/src/commands/build.dart'; @@ -75,6 +76,13 @@ void main() { FakeBuildSubCommand().test(sound); expect(testLogger.statusText, contains('💪 Building with sound null safety 💪')); }); + + testUsingContext('Include only supported sub commands', () { + final BuildCommand command = BuildCommand(); + for (final Command x in command.subcommands.values) { + expect((x as BuildSubCommand).supported, isTrue); + } + }); } class FakeBuildSubCommand extends BuildSubCommand {