Case insensitive check flavor names against Xcode schemes (#61140)
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 4398459..1223b2e 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -119,18 +119,10 @@ await removeFinderExtendedAttributes(app.project.hostAppRoot, processUtils, globals.logger); - final XcodeProjectInfo projectInfo = await globals.xcodeProjectInterpreter.getInfo(app.project.hostAppRoot.path); + final XcodeProjectInfo projectInfo = await app.project.projectInfo(); final String scheme = projectInfo.schemeFor(buildInfo); if (scheme == null) { - globals.printError(''); - if (projectInfo.definesCustomSchemes) { - globals.printError('The Xcode project defines schemes: ${projectInfo.schemes.join(', ')}'); - globals.printError('You must specify a --flavor option to select one of them.'); - } else { - globals.printError('The Xcode project does not define custom schemes.'); - globals.printError('You cannot use the --flavor option.'); - } - return XcodeBuildResult(success: false); + projectInfo.reportFlavorNotFoundAndExit(); } final String configuration = projectInfo.buildConfigurationFor(buildInfo, scheme); if (configuration == null) {
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart index 873c6af..8b09b35 100644 --- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart +++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -391,7 +391,7 @@ if (result.exitCode == missingProjectExitCode) { throwToolExit('Unable to get Xcode project information:\n ${result.stderr}'); } - return XcodeProjectInfo.fromXcodeBuildOutput(result.toString()); + return XcodeProjectInfo.fromXcodeBuildOutput(result.toString(), _logger); } } @@ -435,9 +435,14 @@ /// /// Represents the output of `xcodebuild -list`. class XcodeProjectInfo { - XcodeProjectInfo(this.targets, this.buildConfigurations, this.schemes); + XcodeProjectInfo( + this.targets, + this.buildConfigurations, + this.schemes, + Logger logger + ) : _logger = logger; - factory XcodeProjectInfo.fromXcodeBuildOutput(String output) { + factory XcodeProjectInfo.fromXcodeBuildOutput(String output, Logger logger) { final List<String> targets = <String>[]; final List<String> buildConfigurations = <String>[]; final List<String> schemes = <String>[]; @@ -461,16 +466,18 @@ if (schemes.isEmpty) { schemes.add('Runner'); } - return XcodeProjectInfo(targets, buildConfigurations, schemes); + return XcodeProjectInfo(targets, buildConfigurations, schemes, logger); } final List<String> targets; final List<String> buildConfigurations; final List<String> schemes; + final Logger _logger; bool get definesCustomSchemes => !(schemes.contains('Runner') && schemes.length == 1); /// The expected scheme for [buildInfo]. + @visibleForTesting static String expectedSchemeFor(BuildInfo buildInfo) { return toTitleCase(buildInfo?.flavor ?? 'runner'); } @@ -507,6 +514,16 @@ }); } + void reportFlavorNotFoundAndExit() { + _logger.printError(''); + if (definesCustomSchemes) { + _logger.printError('The Xcode project defines schemes: ${schemes.join(', ')}'); + throwToolExit('You must specify a --flavor option to select one of the available schemes.'); + } else { + throwToolExit('The Xcode project does not define custom schemes. You cannot use the --flavor option.'); + } + } + /// Returns unique build configuration matching [buildInfo] and [scheme], or /// null, if there is no unique best match. String buildConfigurationFor(BuildInfo buildInfo, String scheme) {