From e0939cd1b1af7321eba2f172fa8b56640fbbe1bf Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Fri, 21 Nov 2025 00:03:52 +0100 Subject: [PATCH 01/10] Handle membership exceptions for synchronized root groups Adds logic to detect and register membership exceptions for PBXFileSystemSynchronizedRootGroup objects, specifically excluding Info.plist files from group membership when necessary. Also ensures resources build phase is added if synchronized root groups are present. --- Sources/XcodeGenKit/PBXProjGenerator.swift | 42 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 8dcad5af..ccecfdfb 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -1139,7 +1139,8 @@ public class PBXProjGenerator { func addResourcesBuildPhase() { let resourcesBuildPhaseFiles = getBuildFilesForPhase(.resources) + copyResourcesReferences - if !resourcesBuildPhaseFiles.isEmpty { + let hasSynchronizedRootGroups = sourceFiles.contains { $0.fileReference is PBXFileSystemSynchronizedRootGroup } + if !resourcesBuildPhaseFiles.isEmpty || hasSynchronizedRootGroups { let resourcesBuildPhase = addObject(PBXResourcesBuildPhase(files: resourcesBuildPhaseFiles)) buildPhases.append(resourcesBuildPhase) } @@ -1458,6 +1459,45 @@ public class PBXProjGenerator { // add fileSystemSynchronizedGroups let synchronizedRootGroups = sourceFiles.compactMap { $0.fileReference as? PBXFileSystemSynchronizedRootGroup } if !synchronizedRootGroups.isEmpty { + for syncedGroup in synchronizedRootGroups { + guard let syncedGroupPath = syncedGroup.path else { continue } + let syncedPath = (project.basePath + Path(syncedGroupPath)).normalize() + + if let targetSource = target.sources.first(where: { + let sourcePath = (project.basePath + $0.path).normalize() + return sourcePath == syncedPath + }) { + var membershipExceptions = targetSource.excludes + + for infoPlistPath in infoPlistFiles.values { + let infoPlistFullPath = (project.basePath + infoPlistPath).normalize() + if infoPlistFullPath.string.hasPrefix(syncedPath.string + "/") { + if let relativePath = try? infoPlistFullPath.relativePath(from: syncedPath) { + let relativePathString = relativePath.string + if !membershipExceptions.contains(relativePathString) { + membershipExceptions.append(relativePathString) + } + } + } + } + + if !membershipExceptions.isEmpty { + let exceptionSet = PBXFileSystemSynchronizedBuildFileExceptionSet( + target: targetObject, + membershipExceptions: membershipExceptions, + publicHeaders: nil, + privateHeaders: nil, + additionalCompilerFlagsByRelativePath: nil, + attributesByRelativePath: nil + ) + addObject(exceptionSet) + if syncedGroup.exceptions == nil { + syncedGroup.exceptions = [] + } + syncedGroup.exceptions?.append(exceptionSet) + } + } + } targetObject.fileSystemSynchronizedGroups = synchronizedRootGroups } } From f7239ae4c3b8909ed6084421a444f5f2f259162d Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Sat, 28 Feb 2026 05:22:43 +0100 Subject: [PATCH 02/10] Refactor synced folder membership exceptions with glob support Extract configureMembershipExceptions into its own method, use Set for dedup, resolve excludes via glob expansion, and add a no-op test case. Incorporates glob support and tests from macguru@baf1108. --- Sources/XcodeGenKit/PBXProjGenerator.swift | 51 +++++++++- Sources/XcodeGenKit/SourceGenerator.swift | 5 + .../Project.xcodeproj/project.pbxproj | 13 +++ .../SyncedFolder/ExcludedFile.swift | 1 + .../TestProject/SyncedFolder/Info.plist | 5 + Tests/Fixtures/TestProject/project.yml | 2 + .../SourceGeneratorTests.swift | 93 +++++++++++++++++++ 7 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 Tests/Fixtures/TestProject/SyncedFolder/ExcludedFile.swift create mode 100644 Tests/Fixtures/TestProject/SyncedFolder/Info.plist diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 8dcad5af..8c3551a4 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -1139,7 +1139,8 @@ public class PBXProjGenerator { func addResourcesBuildPhase() { let resourcesBuildPhaseFiles = getBuildFilesForPhase(.resources) + copyResourcesReferences - if !resourcesBuildPhaseFiles.isEmpty { + let hasSynchronizedRootGroups = sourceFiles.contains { $0.fileReference is PBXFileSystemSynchronizedRootGroup } + if !resourcesBuildPhaseFiles.isEmpty || hasSynchronizedRootGroups { let resourcesBuildPhase = addObject(PBXResourcesBuildPhase(files: resourcesBuildPhaseFiles)) buildPhases.append(resourcesBuildPhase) } @@ -1458,9 +1459,57 @@ public class PBXProjGenerator { // add fileSystemSynchronizedGroups let synchronizedRootGroups = sourceFiles.compactMap { $0.fileReference as? PBXFileSystemSynchronizedRootGroup } if !synchronizedRootGroups.isEmpty { + for syncedGroup in synchronizedRootGroups { + configureMembershipExceptions( + for: syncedGroup, + target: target, + targetObject: targetObject, + infoPlistFiles: infoPlistFiles + ) + } targetObject.fileSystemSynchronizedGroups = synchronizedRootGroups } } + + private func configureMembershipExceptions( + for syncedGroup: PBXFileSystemSynchronizedRootGroup, + target: Target, + targetObject: PBXTarget, + infoPlistFiles: [Config: String] + ) { + guard let syncedGroupPath = syncedGroup.path else { return } + let syncedPath = (project.basePath + Path(syncedGroupPath)).normalize() + + guard let targetSource = target.sources.first(where: { + (project.basePath + $0.path).normalize() == syncedPath + }) else { return } + + var exceptions: Set = Set( + sourceGenerator.expandedExcludes(for: targetSource) + .compactMap { try? $0.relativePath(from: syncedPath).string } + ) + + for infoPlistPath in Set(infoPlistFiles.values) { + let relative = try? (project.basePath + infoPlistPath).normalize() + .relativePath(from: syncedPath) + if let rel = relative?.string, !rel.hasPrefix("..") { + exceptions.insert(rel) + } + } + + guard !exceptions.isEmpty else { return } + + let exceptionSet = PBXFileSystemSynchronizedBuildFileExceptionSet( + target: targetObject, + membershipExceptions: exceptions.sorted(), + publicHeaders: nil, + privateHeaders: nil, + additionalCompilerFlagsByRelativePath: nil, + attributesByRelativePath: nil + ) + addObject(exceptionSet) + syncedGroup.exceptions = (syncedGroup.exceptions ?? []) + [exceptionSet] + } private func makePlatformFilter(for filter: Dependency.PlatformFilter) -> String? { switch filter { diff --git a/Sources/XcodeGenKit/SourceGenerator.swift b/Sources/XcodeGenKit/SourceGenerator.swift index e6c9948f..8ac6c5d7 100644 --- a/Sources/XcodeGenKit/SourceGenerator.swift +++ b/Sources/XcodeGenKit/SourceGenerator.swift @@ -372,6 +372,11 @@ class SourceGenerator { return variantGroup } + /// Returns the expanded set of excluded paths for a target source by resolving its exclude glob patterns. + func expandedExcludes(for targetSource: TargetSource) -> Set { + getSourceMatches(targetSource: targetSource, patterns: targetSource.excludes) + } + /// Collects all the excluded paths within the targetSource private func getSourceMatches(targetSource: TargetSource, patterns: [String]) -> Set { let rootSourcePath = project.basePath + targetSource.path diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 6aa8bed9..734e0e31 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -830,9 +830,22 @@ FED40A89162E446494DDE7C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + "TEMP_D9D2D57B-9809-477D-A1C8-703CA41F3962" /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + ExcludedFile.swift, + ); + target = 0867B0DACEF28C11442DE8F7 /* App_iOS */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ AE2AB2772F70DFFF402AA02B /* SyncedFolder */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + "TEMP_D9D2D57B-9809-477D-A1C8-703CA41F3962" /* PBXFileSystemSynchronizedBuildFileExceptionSet */, + ); explicitFileTypes = { }; explicitFolders = ( diff --git a/Tests/Fixtures/TestProject/SyncedFolder/ExcludedFile.swift b/Tests/Fixtures/TestProject/SyncedFolder/ExcludedFile.swift new file mode 100644 index 00000000..d1c13a1f --- /dev/null +++ b/Tests/Fixtures/TestProject/SyncedFolder/ExcludedFile.swift @@ -0,0 +1 @@ +// excluded diff --git a/Tests/Fixtures/TestProject/SyncedFolder/Info.plist b/Tests/Fixtures/TestProject/SyncedFolder/Info.plist new file mode 100644 index 00000000..0c67376e --- /dev/null +++ b/Tests/Fixtures/TestProject/SyncedFolder/Info.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/Tests/Fixtures/TestProject/project.yml b/Tests/Fixtures/TestProject/project.yml index 801d4275..5c36f07e 100644 --- a/Tests/Fixtures/TestProject/project.yml +++ b/Tests/Fixtures/TestProject/project.yml @@ -166,6 +166,8 @@ targets: - String Catalogs/LocalizableStrings.xcstrings - path: SyncedFolder type: syncedFolder + excludes: + - ExcludedFile.swift settings: INFOPLIST_FILE: App_iOS/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.project.app diff --git a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift index 4e109ab2..e6076a9f 100644 --- a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift @@ -120,6 +120,99 @@ class SourceGeneratorTests: XCTestCase { try expect([syncedFolder]) == pbxProj.nativeTargets.first?.fileSystemSynchronizedGroups } + $0.it("adds excludes as membership exceptions for synced folder") { + let directories = """ + Sources: + - a.swift + - b.swift + - Generated: + - c.generated.swift + - d.generated.swift + """ + try createDirectories(directories) + + let source = TargetSource(path: "Sources", excludes: ["b.swift", "Generated/*.generated.swift"], type: .syncedFolder) + let target = Target(name: "Test", type: .application, platform: .iOS, sources: [source]) + let project = Project(basePath: directoryPath, name: "Test", targets: [target]) + + let pbxProj = try project.generatePbxProj() + let syncedFolders = try pbxProj.getMainGroup().children.compactMap { $0 as? PBXFileSystemSynchronizedRootGroup } + let syncedFolder = try unwrap(syncedFolders.first) + + let exceptionSets = syncedFolder.exceptions?.compactMap { $0 as? PBXFileSystemSynchronizedBuildFileExceptionSet } + let exceptionSet = try unwrap(exceptionSets?.first) + let exceptions = try unwrap(exceptionSet.membershipExceptions) + + try expect(exceptions.contains("b.swift")) == true + try expect(exceptions.contains("Generated/c.generated.swift")) == true + try expect(exceptions.contains("Generated/d.generated.swift")) == true + try expect(exceptions.contains("a.swift")) == false + } + + $0.it("auto-excludes Info.plist from synced folder membership") { + let directories = """ + Sources: + - a.swift + - Info.plist + """ + try createDirectories(directories) + + let source = TargetSource(path: "Sources", type: .syncedFolder) + let target = Target( + name: "Test", + type: .application, + platform: .iOS, + settings: Settings(dictionary: ["INFOPLIST_FILE": "Sources/Info.plist"]), + sources: [source] + ) + let project = Project(basePath: directoryPath, name: "Test", targets: [target]) + + let pbxProj = try project.generatePbxProj() + let syncedFolders = try pbxProj.getMainGroup().children.compactMap { $0 as? PBXFileSystemSynchronizedRootGroup } + let syncedFolder = try unwrap(syncedFolders.first) + + let exceptionSets = syncedFolder.exceptions?.compactMap { $0 as? PBXFileSystemSynchronizedBuildFileExceptionSet } + let exceptionSet = try unwrap(exceptionSets?.first) + let exceptions = try unwrap(exceptionSet.membershipExceptions) + + try expect(exceptions.contains("Info.plist")) == true + } + + $0.it("creates no exception set for synced folder without excludes") { + let directories = """ + Sources: + - a.swift + """ + try createDirectories(directories) + + let source = TargetSource(path: "Sources", type: .syncedFolder) + let target = Target(name: "Test", type: .application, platform: .iOS, sources: [source]) + let project = Project(basePath: directoryPath, name: "Test", targets: [target]) + + let pbxProj = try project.generatePbxProj() + let syncedFolders = try pbxProj.getMainGroup().children.compactMap { $0 as? PBXFileSystemSynchronizedRootGroup } + let syncedFolder = try unwrap(syncedFolders.first) + + try expect(syncedFolder.exceptions?.isEmpty ?? true) == true + } + + $0.it("adds empty resources build phase for synced folder") { + let directories = """ + Sources: + - a.swift + """ + try createDirectories(directories) + + let source = TargetSource(path: "Sources", type: .syncedFolder) + let target = Target(name: "Test", type: .application, platform: .iOS, sources: [source]) + let project = Project(basePath: directoryPath, name: "Test", targets: [target]) + + let pbxProj = try project.generatePbxProj() + let nativeTarget = try unwrap(pbxProj.nativeTargets.first) + let hasResourcesPhase = nativeTarget.buildPhases.contains { $0 is PBXResourcesBuildPhase } + try expect(hasResourcesPhase) == true + } + $0.it("supports frameworks in sources") { let directories = """ Sources: From 06b562cb5e6e0769069a7c586a81bc7247d58d04 Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Sat, 28 Feb 2026 05:43:00 +0100 Subject: [PATCH 03/10] Update UUID --- Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 734e0e31..9c0e8c5f 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -831,7 +831,7 @@ /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - "TEMP_D9D2D57B-9809-477D-A1C8-703CA41F3962" /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + "TEMP_90113424-25CF-4C28-B9BF-3F69DB13C114" /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( ExcludedFile.swift, @@ -844,7 +844,7 @@ AE2AB2772F70DFFF402AA02B /* SyncedFolder */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( - "TEMP_D9D2D57B-9809-477D-A1C8-703CA41F3962" /* PBXFileSystemSynchronizedBuildFileExceptionSet */, + "TEMP_90113424-25CF-4C28-B9BF-3F69DB13C114" /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = { }; From f173632379d000775d2dbf758b24ba33b92a551e Mon Sep 17 00:00:00 2001 From: mirkokg Date: Mon, 2 Mar 2026 12:28:15 +0100 Subject: [PATCH 04/10] Comment out excludes in project.yml Comment out excludes for ExcludedFile.swift due to CI issue. --- Tests/Fixtures/TestProject/project.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Tests/Fixtures/TestProject/project.yml b/Tests/Fixtures/TestProject/project.yml index 5c36f07e..0f9b4bb9 100644 --- a/Tests/Fixtures/TestProject/project.yml +++ b/Tests/Fixtures/TestProject/project.yml @@ -166,8 +166,9 @@ targets: - String Catalogs/LocalizableStrings.xcstrings - path: SyncedFolder type: syncedFolder - excludes: - - ExcludedFile.swift +# Commented out until we update xcodeproj (TEMP id issue causes non-deterministic generation on CI) +# excludes: +# - ExcludedFile.swift settings: INFOPLIST_FILE: App_iOS/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.project.app From b5e6bd39d5c691afacbbd9626df2e33389eef38c Mon Sep 17 00:00:00 2001 From: mirkokg Date: Mon, 2 Mar 2026 12:34:04 +0100 Subject: [PATCH 05/10] Clean up project.pbxproj by removing exception set Removed PBXFileSystemSynchronizedBuildFileExceptionSet section and its references. --- .../TestProject/Project.xcodeproj/project.pbxproj | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 9c0e8c5f..6aa8bed9 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -830,22 +830,9 @@ FED40A89162E446494DDE7C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - "TEMP_90113424-25CF-4C28-B9BF-3F69DB13C114" /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - ExcludedFile.swift, - ); - target = 0867B0DACEF28C11442DE8F7 /* App_iOS */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - /* Begin PBXFileSystemSynchronizedRootGroup section */ AE2AB2772F70DFFF402AA02B /* SyncedFolder */ = { isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - "TEMP_90113424-25CF-4C28-B9BF-3F69DB13C114" /* PBXFileSystemSynchronizedBuildFileExceptionSet */, - ); explicitFileTypes = { }; explicitFolders = ( From 4cec4e072b0e2f24d8aa5cdb7c05bdab55bbc7d8 Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Tue, 3 Mar 2026 16:52:23 +0100 Subject: [PATCH 06/10] Remove comment --- Tests/Fixtures/TestProject/project.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Tests/Fixtures/TestProject/project.yml b/Tests/Fixtures/TestProject/project.yml index 0f9b4bb9..5c36f07e 100644 --- a/Tests/Fixtures/TestProject/project.yml +++ b/Tests/Fixtures/TestProject/project.yml @@ -166,9 +166,8 @@ targets: - String Catalogs/LocalizableStrings.xcstrings - path: SyncedFolder type: syncedFolder -# Commented out until we update xcodeproj (TEMP id issue causes non-deterministic generation on CI) -# excludes: -# - ExcludedFile.swift + excludes: + - ExcludedFile.swift settings: INFOPLIST_FILE: App_iOS/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.project.app From 6de62be270263d24a637980a0767f4d702e36cae Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Tue, 3 Mar 2026 17:13:24 +0100 Subject: [PATCH 07/10] Update SourceGeneratorTests.swift --- Tests/XcodeGenKitTests/SourceGeneratorTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift index 479701d9..55f896b5 100644 --- a/Tests/XcodeGenKitTests/SourceGeneratorTests.swift +++ b/Tests/XcodeGenKitTests/SourceGeneratorTests.swift @@ -162,7 +162,7 @@ class SourceGeneratorTests: XCTestCase { name: "Test", type: .application, platform: .iOS, - settings: Settings(dictionary: ["INFOPLIST_FILE": "Sources/Info.plist"]), + settings: try Settings(jsonDictionary: ["INFOPLIST_FILE": "Sources/Info.plist"]), sources: [source] ) let project = Project(basePath: directoryPath, name: "Test", targets: [target]) From 108089edc1c97a982d71d94e709a3462ada873e6 Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Tue, 3 Mar 2026 17:18:57 +0100 Subject: [PATCH 08/10] Update project.pbxproj --- .../TestProject/Project.xcodeproj/project.pbxproj | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index 10ff1c3a..b47d6c20 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -830,9 +830,22 @@ FED40A89162E446494DDE7C7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 9A259ACEBCE19CC5F22B6DD4 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + ExcludedFile.swift, + ); + target = 0867B0DACEF28C11442DE8F7 /* App_iOS */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ AE2AB2772F70DFFF402AA02B /* SyncedFolder */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 9A259ACEBCE19CC5F22B6DD4 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, + ); explicitFileTypes = { }; explicitFolders = ( From 475b56e27e3d9484cc80a76e78a5d0939f1ba583 Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Tue, 3 Mar 2026 17:30:57 +0100 Subject: [PATCH 09/10] Retrigger CI From 03ff4780e46ed1ba23abebf5aefb85c4baa7fb7f Mon Sep 17 00:00:00 2001 From: Mirko Tomic Date: Tue, 3 Mar 2026 17:37:14 +0100 Subject: [PATCH 10/10] Add info.plist exclusion --- Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj | 1 + Tests/Fixtures/TestProject/project.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index b47d6c20..eabdb4b1 100644 --- a/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Tests/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -835,6 +835,7 @@ isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( ExcludedFile.swift, + Info.plist, ); target = 0867B0DACEF28C11442DE8F7 /* App_iOS */; }; diff --git a/Tests/Fixtures/TestProject/project.yml b/Tests/Fixtures/TestProject/project.yml index 5c36f07e..599da8e2 100644 --- a/Tests/Fixtures/TestProject/project.yml +++ b/Tests/Fixtures/TestProject/project.yml @@ -168,6 +168,7 @@ targets: type: syncedFolder excludes: - ExcludedFile.swift + - Info.plist settings: INFOPLIST_FILE: App_iOS/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.project.app