diff --git a/packages/flutter_tools/lib/src/migrations/swift_package_manager_integration_migration.dart b/packages/flutter_tools/lib/src/migrations/swift_package_manager_integration_migration.dart index b04eed06d9..d8b250c24d 100644 --- a/packages/flutter_tools/lib/src/migrations/swift_package_manager_integration_migration.dart +++ b/packages/flutter_tools/lib/src/migrations/swift_package_manager_integration_migration.dart @@ -311,18 +311,18 @@ class SwiftPackageManagerIntegrationMigration extends ProjectMigrator { $newContent '''; - final String? buildActionEntries = + String? buildAction = schemeLines.where((String line) => line.contains('')).firstOrNull; - if (buildActionEntries == null) { - throw Exception( - 'Failed to parse ${schemeFile.basename}: Could not find BuildActionEntries.', - ); - } else { - newScheme = schemeContent.replaceFirst( - buildActionEntries, - '$newContent$buildActionEntries', - ); + if (buildAction == null) { + // If there are no BuildActionEntries, append before end of BuildAction. + buildAction = + schemeLines.where((String line) => line.contains('')).firstOrNull; + + if (buildAction == null) { + throw Exception('Failed to parse ${schemeFile.basename}: Could not find BuildAction.'); + } } + newScheme = schemeContent.replaceFirst(buildAction, '$newContent$buildAction'); } schemeFile.writeAsStringSync(newScheme); diff --git a/packages/flutter_tools/test/general.shard/migrations/swift_package_manager_integration_migration_test.dart b/packages/flutter_tools/test/general.shard/migrations/swift_package_manager_integration_migration_test.dart index 98ada0d56c..0fcc50df98 100644 --- a/packages/flutter_tools/test/general.shard/migrations/swift_package_manager_integration_migration_test.dart +++ b/packages/flutter_tools/test/general.shard/migrations/swift_package_manager_integration_migration_test.dart @@ -464,7 +464,7 @@ void main() { }, ); - testWithoutContext('fails if cannot find BuildActionEntries in scheme', () async { + testWithoutContext('fails if cannot find BuildAction in scheme', () async { final MemoryFileSystem memoryFileSystem = MemoryFileSystem(); final BufferLogger testLogger = BufferLogger.test(); final FakeXcodeProject project = FakeXcodeProject( @@ -490,7 +490,7 @@ void main() { await expectLater( () => projectMigration.migrate(), throwsToolExit( - message: 'Failed to parse Runner.xcscheme: Could not find BuildActionEntries', + message: 'Failed to parse Runner.xcscheme: Could not find BuildAction', ), ); }); @@ -525,6 +525,42 @@ void main() { ); }); + testWithoutContext('successfully updates scheme with no BuildActionEntries', () async { + final MemoryFileSystem memoryFileSystem = MemoryFileSystem(); + final BufferLogger testLogger = BufferLogger.test(); + final FakeXcodeProject project = FakeXcodeProject( + platform: platform.name, + fileSystem: memoryFileSystem, + logger: testLogger, + ); + _createProjectFiles(project, platform); + project.xcodeProjectSchemeFile().writeAsStringSync( + _validBuildActions(platform, hasBuildEntries: false), + ); + + final FakePlistParser plistParser = FakePlistParser.multiple([ + _plutilOutput(_allSectionsMigratedAsJson(platform)), + _plutilOutput(_allSectionsMigratedAsJson(platform)), + ]); + final SwiftPackageManagerIntegrationMigration projectMigration = + SwiftPackageManagerIntegrationMigration( + project, + platform, + BuildInfo.debug, + xcodeProjectInterpreter: FakeXcodeProjectInterpreter(), + logger: testLogger, + fileSystem: memoryFileSystem, + plistParser: plistParser, + features: swiftPackageManagerFullyEnabledFlags, + ); + + await projectMigration.migrate(); + expect( + project.xcodeProjectSchemeFile().readAsStringSync(), + _validBuildActions(platform, hasFrameworkScript: true, hasBuildEntries: false), + ); + }); + testWithoutContext('successfully updates scheme with preexisting PreActions', () async { final MemoryFileSystem memoryFileSystem = MemoryFileSystem(); final BufferLogger testLogger = BufferLogger.test(); @@ -2621,6 +2657,7 @@ String _validBuildActions( SupportedPlatform platform, { bool hasPreActions = false, bool hasFrameworkScript = false, + bool hasBuildEntries = true, }) { final String scriptText; if (platform == SupportedPlatform.ios) { @@ -2656,11 +2693,11 @@ String _validBuildActions( \n '''; } - return ''' - $preActions - + + String buildEntries = ''; + if (hasBuildEntries) { + buildEntries = ''' +\n +'''; + } + return ''' + + $preActions$buildEntries + + +${_validBuildableReference(platform)} + + + '''; }