From 4659b0c402b2b4a3244c7b463cbb259c3aa7bb25 Mon Sep 17 00:00:00 2001 From: raphire08 Date: Mon, 18 Dec 2023 14:26:07 +0530 Subject: [PATCH] refactored cli tool ipa method name to support --export-options-plist (#138555) This PR changes the way the IPA method is read in the run command for `build ipa` command. If export options plist argument is provided it takes method name from plist, otherwise it uses the method name from export method argument. *List which issues are fixed by this PR. You must list at least one issue. An issue is not required if the PR fixes something trivial like a typo.* fixes [#122179](https://github.com/flutter/flutter/issues/122179) --- .../lib/src/commands/build_ios.dart | 8 ++- .../hermetic/build_ipa_test.dart | 69 +++++++++++++++++++ 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index 98fb199d399..241413f5ef7 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -463,13 +463,15 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand { final String relativeOutputPath = app.ipaOutputPath; final String absoluteOutputPath = globals.fs.path.absolute(relativeOutputPath); final String absoluteArchivePath = globals.fs.path.absolute(app.archiveBundleOutputPath); - final String exportMethod = stringArg('export-method')!; - final bool isAppStoreUpload = exportMethod == 'app-store'; + String? exportOptions = exportOptionsPlist; + String? exportMethod = exportOptions != null ? + globals.plistParser.getValueFromFile(exportOptions, 'method') : null; + exportMethod ??= stringArg('export-method')!; + final bool isAppStoreUpload = exportMethod == 'app-store'; File? generatedExportPlist; try { final String exportMethodDisplayName = isAppStoreUpload ? 'App Store' : exportMethod; status = globals.logger.startProgress('Building $exportMethodDisplayName IPA...'); - String? exportOptions = exportOptionsPlist; if (exportOptions == null) { generatedExportPlist = _createExportPlist(); exportOptions = generatedExportPlist.path; 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 dd59cc4b248..2ae5e91356b 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 @@ -379,6 +379,75 @@ void main() { XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); + testUsingContext('ipa build reports method from --export-method when used', () async { + final BuildCommand command = BuildCommand( + artifacts: artifacts, + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + logger: logger, + fileSystem: fileSystem, + processUtils: processUtils, + osUtils: FakeOperatingSystemUtils(), + ); + fakeProcessManager.addCommands([ + xattrCommand, + setUpFakeXcodeBuildHandler(), + exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), + ]); + createMinimalMockProjectFiles(); + await createTestCommandRunner(command).run( + const ['build', 'ipa','--export-method', 'ad-hoc', '--no-pub'] + ); + + expect(logger.statusText, contains('build/ios/archive/Runner.xcarchive')); + expect(logger.statusText, contains('Building ad-hoc IPA')); + }, overrides: { + FileSystem: () => fileSystem, + Logger: () => logger, + ProcessManager: () => fakeProcessManager, + Platform: () => macosPlatform, + XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), + }); + + testUsingContext('ipa build reports method from --export-options-plist when used', () async { + final File exportOptions = fileSystem.file('/ExportOptions.plist') + ..createSync(); + createMinimalMockProjectFiles(); + + plistUtils.fileContents[exportOptions.path] = { + 'CFBundleIdentifier': 'io.flutter.someProject', + 'method': 'enterprise' + }; + + fakeProcessManager.addCommands([ + xattrCommand, + setUpFakeXcodeBuildHandler(), + exportArchiveCommand(exportOptionsPlist: exportOptions.path), + ]); + final BuildCommand command = BuildCommand( + artifacts: artifacts, + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + logger: logger, + fileSystem: fileSystem, + processUtils: processUtils, + osUtils: FakeOperatingSystemUtils(), + ); + await createTestCommandRunner(command).run( + ['build', 'ipa', '--export-options-plist', exportOptions.path, '--no-pub'] + ); + + expect(logger.statusText, contains('build/ios/archive/Runner.xcarchive')); + expect(logger.statusText, contains('Building enterprise IPA')); + }, overrides: { + FileSystem: () => fileSystem, + Logger: () => logger, + ProcessManager: () => fakeProcessManager, + Platform: () => macosPlatform, + XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), + PlistParser: () => plistUtils, + }); + testUsingContext('ipa build reports when IPA fails', () async { final BuildCommand command = BuildCommand( artifacts: artifacts,