From 9cd934e1eb127049958ab85a34f2ca3764f978bb Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 24 Feb 2025 16:13:33 +0100 Subject: [PATCH] fix: skip mapping aggregate targets --- Package.resolved | 10 +- .../Mappers/Project/PBXProjectMapper.swift | 7 +- .../Mappers/Targets/PBXTargetMapper.swift | 8 +- .../Target/PBXTargetMapperTests.swift | 105 ++++++++++++------ 4 files changed, 86 insertions(+), 44 deletions(-) diff --git a/Package.resolved b/Package.resolved index 64056eaf..8e4b2f20 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "e00b9b258083e5d180326ee4f3fedbcfea7db4ae854a2bf6745abd5db9a73971", + "originHash" : "fc72c66a6cff23618311dcc542ac7e97cc291d309abdc7587911390ff07d6146", "pins" : [ { "identity" : "aexml", @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit", "state" : { - "revision" : "518e8e1aca7ee64b87b08ecec5f7cad2a63b8efd", - "version" : "0.28.0" + "revision" : "30b56f12a448137123c17b4f9b67ee867baecc86", + "version" : "0.29.0" } }, { @@ -168,8 +168,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeProj", "state" : { - "revision" : "cbd622399d845f7686ac96c5110cea5a784758a3", - "version" : "8.27.1" + "revision" : "7cb7fbe091b3feb087bb179c445fb96b4fa10982", + "version" : "8.27.2" } }, { diff --git a/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift b/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift index 42ad8b6f..37effd54 100644 --- a/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Project/PBXProjectMapper.swift @@ -66,7 +66,8 @@ struct PBXProjectMapper: PBXProjectMapping { let localPackagePaths = try await collectAllPackages(from: pbxProject.mainGroup, xcodeProj: xcodeProj) // Map PBXTargets to domain Targets - let targets = try await withThrowingTaskGroup(of: Target.self, returning: [Target].self) { taskGroup in + let targets = try await withThrowingTaskGroup(of: Target?.self, returning: [Target].self) { taskGroup in + let projectNativeTargets = projectNativeTargets for pbxTarget in pbxProject.targets { taskGroup.addTask { try await targetMapper.map( @@ -80,7 +81,9 @@ struct PBXProjectMapper: PBXProjectMapping { var targets: [Target] = [] for try await target in taskGroup { - targets.append(target) + if let target { + targets.append(target) + } } return targets diff --git a/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift b/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift index 929bbb6b..c2630a27 100644 --- a/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Targets/PBXTargetMapper.swift @@ -49,7 +49,7 @@ protocol PBXTargetMapping { xcodeProj: XcodeProj, projectNativeTargets: [String: ProjectNativeTarget], packages: [AbsolutePath] - ) async throws -> Target + ) async throws -> Target? } // swiftlint:disable function_body_length @@ -102,7 +102,11 @@ struct PBXTargetMapper: PBXTargetMapping { xcodeProj: XcodeProj, projectNativeTargets: [String: ProjectNativeTarget], packages: [AbsolutePath] - ) async throws -> Target { + ) async throws -> Target? { + // `XcodeGraph` currently doesn't support representing aggregate targets + if pbxTarget is PBXAggregateTarget { + return nil + } let platform = try pbxTarget.platform() let deploymentTargets = pbxTarget.deploymentTargets() let productType = pbxTarget.productType?.mapProductType() diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift index c03abfc8..30181b1f 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Target/PBXTargetMapperTests.swift @@ -26,11 +26,13 @@ struct PBXTargetMapperTests: Sendable { // When let mapper = PBXTargetMapper() - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) ) // Then @@ -54,11 +56,13 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) ) // Then @@ -81,11 +85,13 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) ) // Then @@ -110,11 +116,13 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) ) // Then @@ -151,11 +159,13 @@ struct PBXTargetMapperTests: Sendable { let mapper = PBXTargetMapper() // When - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) ) // Then @@ -243,13 +253,15 @@ struct PBXTargetMapperTests: Sendable { ) // When - let mapped = try await mapper.map( - pbxTarget: target, - xcodeProj: xcodeProj, - projectNativeTargets: [:], - packages: [ - packagePath, - ] + let mapped = try #require( + try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [ + packagePath, + ] + ) ) // Then @@ -331,7 +343,7 @@ struct PBXTargetMapperTests: Sendable { ) // Then - #expect(mapped.metadata.tags == Set(["tag1", "tag2", "tag3"])) + #expect(mapped?.metadata.tags == Set(["tag1", "tag2", "tag3"])) } @Test("Maps entitlements when CODE_SIGN_ENTITLEMENTS is set") @@ -389,7 +401,7 @@ struct PBXTargetMapperTests: Sendable { ) // Then - #expect(mapped.entitlements == .file( + #expect(mapped?.entitlements == .file( path: entitlementsPath, configuration: BuildConfiguration(name: "Debug", variant: .debug) )) @@ -462,7 +474,7 @@ struct PBXTargetMapperTests: Sendable { // Then #expect({ - switch mapped.infoPlist { + switch mapped?.infoPlist { case let .file(path, _): return path == plistPath default: @@ -471,6 +483,29 @@ struct PBXTargetMapperTests: Sendable { }() == true) } + @Test + func testMapAggregateTarget() async throws { + // Given + let xcodeProj = try await XcodeProj.test() + let target = PBXAggregateTarget( + name: "App" + ) + + try xcodeProj.write(path: xcodeProj.path!) + let mapper = PBXTargetMapper() + + // When + let mapped = try await mapper.map( + pbxTarget: target, + xcodeProj: xcodeProj, + projectNativeTargets: [:], + packages: [] + ) + + // Then + #expect(mapped == nil) + } + // MARK: - Helper Methods private func createTarget(