@@ -6,6 +6,7 @@ import 'package:args/args.dart';
66import 'package:collection/collection.dart' ;
77import 'package:engine_build_configs/engine_build_configs.dart' ;
88import 'package:meta/meta.dart' ;
9+ import 'package:platform/platform.dart' ;
910
1011import 'build_utils.dart' ;
1112import 'environment.dart' ;
@@ -162,28 +163,40 @@ final class BuildPlan {
162163 required Map <String , BuilderConfig > configs,
163164 }) {
164165 // Add --config.
165- final builds = runnableBuilds (
166- environment,
167- configs,
168- environment.verbose || ! help,
166+ final builds = _extractBuilds (
167+ environment.platform,
168+ runnableConfigs: _runnableBuildConfigs (
169+ environment.platform,
170+ configsByName: configs,
171+ ),
172+ hideCiSpecificBuilds: help && ! environment.verbose,
169173 );
170174 debugCheckBuilds (builds);
171175 parser.addOption (
172176 _flagConfig,
173177 abbr: 'c' ,
174- defaultsTo: () {
175- if (builds.any ((b) => b.name == 'host_debug' )) {
176- return 'host_debug' ;
177- }
178- return null ;
179- }(),
178+ help: ''
179+ 'Selects a build configuration for the current platform.\n '
180+ '\n '
181+ 'If omitted, et attempts '
182+ 'to default to a suitable target platform. This is typically a '
183+ '"host_debug" build when building on a supported desktop OS, or a '
184+ 'suitable build when targeting (via "et run") a flutter app.\n '
185+ '\n '
186+ '${environment .verbose ? ''
187+ 'Since verbose mode was selected, both local development '
188+ 'configurations and configurations that are typically only '
189+ 'used on CI will be visible, including possible duplicates.' : ''
190+ 'Configurations include (use --verbose for more details):' }' ,
180191 allowed: [
181192 for (final config in builds) mangleConfigName (environment, config.name),
182- ],
183- allowedHelp: {
184- for (final config in builds)
185- mangleConfigName (environment, config.name): config.description,
186- },
193+ ]..sort (),
194+ allowedHelp: environment.verbose
195+ ? {
196+ for (final config in builds)
197+ mangleConfigName (environment, config.name): config.description,
198+ }
199+ : null ,
187200 );
188201
189202 // Add --lto.
@@ -361,3 +374,41 @@ enum BuildStrategy {
361374 const BuildStrategy (this ._help);
362375 final String _help;
363376}
377+
378+ typedef _ConfigsByName = Iterable <MapEntry <String , BuilderConfig >>;
379+
380+ /// Computes a list of build configs that can can execute on [environment] .
381+ _ConfigsByName _runnableBuildConfigs (
382+ Platform platform, {
383+ required Map <String , BuilderConfig > configsByName,
384+ }) {
385+ return configsByName.entries.where ((entry) {
386+ return entry.value.canRunOn (platform);
387+ });
388+ }
389+
390+ /// Extracts [Build] s from [runnableConfigs] that can execute on [platform] .
391+ ///
392+ /// If [hideCiSpecificBuilds] , builds that are unlikely to be picked for local
393+ /// development (i.e. start with the prefix `ci/` by convention) are not
394+ /// returned in order to make command-line _help_ text shorter.
395+ List <Build > _extractBuilds (
396+ Platform platform, {
397+ required _ConfigsByName runnableConfigs,
398+ required bool hideCiSpecificBuilds,
399+ }) {
400+ return [
401+ for (final buildConfig in runnableConfigs)
402+ ...buildConfig.value.builds.where (
403+ (build) {
404+ if (! build.canRunOn (platform)) {
405+ return false ;
406+ }
407+ if (! hideCiSpecificBuilds) {
408+ return true ;
409+ }
410+ return build.name.startsWith (platform.operatingSystem);
411+ },
412+ ),
413+ ];
414+ }
0 commit comments