Unverified Commit 9492e13c authored by Ahmed Ashour's avatar Ahmed Ashour Committed by GitHub

Reland [flutter_tools] show only supported sub commands (#86153)

parent 93b358f9
...@@ -24,25 +24,31 @@ import 'build_winuwp.dart'; ...@@ -24,25 +24,31 @@ import 'build_winuwp.dart';
class BuildCommand extends FlutterCommand { class BuildCommand extends FlutterCommand {
BuildCommand({ bool verboseHelp = false }) { BuildCommand({ bool verboseHelp = false }) {
addSubcommand(BuildAarCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildAarCommand(verboseHelp: verboseHelp));
addSubcommand(BuildApkCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildApkCommand(verboseHelp: verboseHelp));
addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp));
addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp));
addSubcommand(BuildIOSFrameworkCommand( _addSubcommand(BuildIOSFrameworkCommand(
buildSystem: globals.buildSystem, buildSystem: globals.buildSystem,
verboseHelp: verboseHelp, verboseHelp: verboseHelp,
)); ));
addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp));
addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp));
addSubcommand(BuildWebCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildWebCommand(verboseHelp: verboseHelp));
addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp));
addSubcommand(BuildLinuxCommand( _addSubcommand(BuildLinuxCommand(
operatingSystemUtils: globals.os, operatingSystemUtils: globals.os,
verboseHelp: verboseHelp verboseHelp: verboseHelp
)); ));
addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp));
addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildWindowsUwpCommand(verboseHelp: verboseHelp));
addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp)); _addSubcommand(BuildFuchsiaCommand(verboseHelp: verboseHelp));
}
void _addSubcommand(BuildSubCommand command) {
if (command.supported) {
addSubcommand(command);
}
} }
@override @override
...@@ -63,6 +69,8 @@ abstract class BuildSubCommand extends FlutterCommand { ...@@ -63,6 +69,8 @@ abstract class BuildSubCommand extends FlutterCommand {
@override @override
bool get reportNullSafety => true; bool get reportNullSafety => true;
bool get supported => true;
/// Display a message describing the current null safety runtime mode /// Display a message describing the current null safety runtime mode
/// that was selected. /// that was selected.
/// ///
......
...@@ -58,6 +58,9 @@ class BuildFuchsiaCommand extends BuildSubCommand { ...@@ -58,6 +58,9 @@ class BuildFuchsiaCommand extends BuildSubCommand {
@override @override
String get description => 'Build the Fuchsia target (Experimental).'; String get description => 'Build the Fuchsia target (Experimental).';
@override
bool get supported => globals.platform.isLinux || globals.platform.isMacOS;
@override @override
Future<FlutterCommandResult> runCommand() async { Future<FlutterCommandResult> runCommand() async {
if (!featureFlags.isFuchsiaEnabled) { if (!featureFlags.isFuchsiaEnabled) {
...@@ -68,7 +71,7 @@ class BuildFuchsiaCommand extends BuildSubCommand { ...@@ -68,7 +71,7 @@ class BuildFuchsiaCommand extends BuildSubCommand {
} }
final BuildInfo buildInfo = await getBuildInfo(); final BuildInfo buildInfo = await getBuildInfo();
final FlutterProject flutterProject = FlutterProject.current(); 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.'); throwToolExit('"build fuchsia" is only supported on Linux and MacOS hosts.');
} }
if (!flutterProject.fuchsia.existsSync()) { if (!flutterProject.fuchsia.existsSync()) {
......
...@@ -224,12 +224,15 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand { ...@@ -224,12 +224,15 @@ abstract class _BuildIOSSubCommand extends BuildSubCommand {
Directory _outputAppDirectory(String xcodeResultOutput); Directory _outputAppDirectory(String xcodeResultOutput);
@override
bool get supported => globals.platform.isMacOS;
@override @override
Future<FlutterCommandResult> runCommand() async { Future<FlutterCommandResult> runCommand() async {
defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release; defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release;
final BuildInfo buildInfo = await getBuildInfo(); final BuildInfo buildInfo = await getBuildInfo();
if (!globals.platform.isMacOS) { if (!supported) {
throwToolExit('Building for iOS is only supported on macOS.'); throwToolExit('Building for iOS is only supported on macOS.');
} }
if (forSimulator && !buildInfo.supportsSimulator) { if (forSimulator && !buildInfo.supportsSimulator) {
......
...@@ -141,11 +141,14 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -141,11 +141,14 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
return buildInfos; return buildInfos;
} }
@override
bool get supported => _platform.isMacOS;
@override @override
Future<void> validateCommand() async { Future<void> validateCommand() async {
await super.validateCommand(); await super.validateCommand();
_project = FlutterProject.current(); _project = FlutterProject.current();
if (!_platform.isMacOS) { if (!supported) {
throwToolExit('Building frameworks for iOS is only supported on the Mac.'); throwToolExit('Building frameworks for iOS is only supported on the Mac.');
} }
......
...@@ -39,6 +39,9 @@ class BuildMacosCommand extends BuildSubCommand { ...@@ -39,6 +39,9 @@ class BuildMacosCommand extends BuildSubCommand {
@override @override
String get description => 'Build a macOS desktop application.'; String get description => 'Build a macOS desktop application.';
@override
bool get supported => globals.platform.isMacOS;
@override @override
Future<FlutterCommandResult> runCommand() async { Future<FlutterCommandResult> runCommand() async {
final BuildInfo buildInfo = await getBuildInfo(); final BuildInfo buildInfo = await getBuildInfo();
...@@ -46,7 +49,7 @@ class BuildMacosCommand extends BuildSubCommand { ...@@ -46,7 +49,7 @@ class BuildMacosCommand extends BuildSubCommand {
if (!featureFlags.isMacOSEnabled) { if (!featureFlags.isMacOSEnabled) {
throwToolExit('"build macos" is not currently supported. To enable, run "flutter config --enable-macos-desktop".'); 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.'); throwToolExit('"build macos" only supported on macOS hosts.');
} }
displayNullSafetyMode(buildInfo); displayNullSafetyMode(buildInfo);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
// @dart = 2.8 // @dart = 2.8
import 'package:args/command_runner.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:file_testing/file_testing.dart'; import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
...@@ -11,6 +12,7 @@ import 'package:flutter_tools/src/base/platform.dart'; ...@@ -11,6 +12,7 @@ import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/commands/build_fuchsia.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_kernel_compiler.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_kernel_compiler.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart'; import 'package:flutter_tools/src/fuchsia/fuchsia_pm.dart';
...@@ -109,9 +111,10 @@ void main() { ...@@ -109,9 +111,10 @@ void main() {
final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync(); final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
pubspecFile.writeAsStringSync('name: $appName'); pubspecFile.writeAsStringSync('name: $appName');
final bool supported = BuildFuchsiaCommand(verboseHelp: false).supported;
expect( expect(
createTestCommandRunner(command).run(const <String>['build', 'fuchsia']), createTestCommandRunner(command).run(const <String>['build', 'fuchsia']),
throwsToolExit(), supported ? throwsToolExit() : throwsA(isA<UsageException>()),
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Platform: () => windowsPlatform, Platform: () => windowsPlatform,
......
...@@ -4,11 +4,13 @@ ...@@ -4,11 +4,13 @@
// @dart = 2.8 // @dart = 2.8
import 'package:args/command_runner.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/commands/build_ios.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
...@@ -160,9 +162,10 @@ void main() { ...@@ -160,9 +162,10 @@ void main() {
fileSystem.file(fileSystem.path.join('lib', 'main.dart')) fileSystem.file(fileSystem.path.join('lib', 'main.dart'))
.createSync(recursive: true); .createSync(recursive: true);
final bool supported = BuildIOSCommand(verboseHelp: false).supported;
expect(createTestCommandRunner(command).run( expect(createTestCommandRunner(command).run(
const <String>['build', 'ios', '--no-pub'] const <String>['build', 'ios', '--no-pub']
), throwsToolExit()); ), supported ? throwsToolExit() : throwsA(isA<UsageException>()));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Platform: () => notMacosPlatform, Platform: () => notMacosPlatform,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
......
...@@ -4,12 +4,14 @@ ...@@ -4,12 +4,14 @@
// @dart = 2.8 // @dart = 2.8
import 'package:args/command_runner.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build.dart';
import 'package:flutter_tools/src/commands/build_ios.dart';
import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart';
import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/reporting/reporting.dart';
...@@ -155,9 +157,10 @@ void main() { ...@@ -155,9 +157,10 @@ void main() {
fileSystem.file(fileSystem.path.join('lib', 'main.dart')) fileSystem.file(fileSystem.path.join('lib', 'main.dart'))
.createSync(recursive: true); .createSync(recursive: true);
final bool supported = BuildIOSArchiveCommand(verboseHelp: false).supported;
expect(createTestCommandRunner(command).run( expect(createTestCommandRunner(command).run(
const <String>['build', 'ipa', '--no-pub'] const <String>['build', 'ipa', '--no-pub']
), throwsToolExit()); ), supported ? throwsToolExit() : throwsA(isA<UsageException>()));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Platform: () => notMacosPlatform, Platform: () => notMacosPlatform,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
......
...@@ -149,7 +149,7 @@ void main() { ...@@ -149,7 +149,7 @@ void main() {
expect(createTestCommandRunner(command).run( expect(createTestCommandRunner(command).run(
const <String>['build', 'macos', '--no-pub'] const <String>['build', 'macos', '--no-pub']
), throwsToolExit(message: '"build macos" only supported on macOS hosts.')); ), throwsA(isA<UsageException>()));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Platform: () => notMacosPlatform, Platform: () => notMacosPlatform,
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
...@@ -390,8 +390,9 @@ void main() { ...@@ -390,8 +390,9 @@ void main() {
testUsingContext('Refuses to build for macOS when feature is disabled', () { testUsingContext('Refuses to build for macOS when feature is disabled', () {
final CommandRunner<void> runner = createTestCommandRunner(BuildCommand()); final CommandRunner<void> runner = createTestCommandRunner(BuildCommand());
final bool supported = BuildMacosCommand(verboseHelp: false).supported;
expect(() => runner.run(<String>['build', 'macos', '--no-pub']), expect(() => runner.run(<String>['build', 'macos', '--no-pub']),
throwsToolExit()); supported ? throwsToolExit() : throwsA(isA<UsageException>()));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: false), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: false),
}); });
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
// @dart = 2.8 // @dart = 2.8
import 'package:args/args.dart'; import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/commands/attach.dart'; import 'package:flutter_tools/src/commands/attach.dart';
import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build.dart';
...@@ -75,6 +76,13 @@ void main() { ...@@ -75,6 +76,13 @@ void main() {
FakeBuildSubCommand().test(sound); FakeBuildSubCommand().test(sound);
expect(testLogger.statusText, contains('💪 Building with sound null safety 💪')); expect(testLogger.statusText, contains('💪 Building with sound null safety 💪'));
}); });
testUsingContext('Include only supported sub commands', () {
final BuildCommand command = BuildCommand();
for (final Command<void> x in command.subcommands.values) {
expect((x as BuildSubCommand).supported, isTrue);
}
});
} }
class FakeBuildSubCommand extends BuildSubCommand { class FakeBuildSubCommand extends BuildSubCommand {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment