From 3973a2af7a186a0865b51df1e9206f51ab4d649a Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 3 Mar 2025 11:26:02 +0100 Subject: [PATCH 1/2] fix: mapping fails when bundle product name differs from target name --- Package.resolved | 10 ++-- .../Mappers/Graph/XcodeGraphMapper.swift | 4 +- .../Graph/XcodeGraphMapperTests.swift | 51 +++++++++++++++++++ .../TestData/PBXNativeTarget+TestData.swift | 3 +- 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Package.resolved b/Package.resolved index 8e4b2f20..eb90ff03 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "fc72c66a6cff23618311dcc542ac7e97cc291d309abdc7587911390ff07d6146", + "originHash" : "903b6688321bae457eebe89dd170b8e84c2b492ea8715d843afaaaa1a64c58b5", "pins" : [ { "identity" : "aexml", @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/p-x9/MachOKit", "state" : { - "revision" : "30b56f12a448137123c17b4f9b67ee867baecc86", - "version" : "0.29.0" + "revision" : "7ea55264554310709a4669091be21e5b5423aa44", + "version" : "0.29.1" } }, { @@ -168,8 +168,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tuist/XcodeProj", "state" : { - "revision" : "7cb7fbe091b3feb087bb179c445fb96b4fa10982", - "version" : "8.27.2" + "revision" : "02bc2dd6224aa59147941d85fdc45a7677af62f6", + "version" : "8.27.3" } }, { diff --git a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift index 46122f82..c6fd2872 100644 --- a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift @@ -207,8 +207,8 @@ public struct XcodeGraphMapper: XcodeGraphMapping { try XcodeProj(pathString: $0.pathString) } let projectNativeTargets: [String: ProjectNativeTarget] = xcodeProjects.reduce(into: [:]) { acc, xcodeProject in - for nativeTarget in xcodeProject.pbxproj.nativeTargets { - let name = Target.sanitizedProductNameFrom( + for nativeTarget in xcodeProject.pbxproj.nativeTargets.sorted(by: { $0.name > $1.name }) { + let name = nativeTarget.productName ?? Target.sanitizedProductNameFrom( targetName: nativeTarget.name ) acc[name] = ProjectNativeTarget( diff --git a/Tests/XcodeGraphMapperTests/MapperTests/Graph/XcodeGraphMapperTests.swift b/Tests/XcodeGraphMapperTests/MapperTests/Graph/XcodeGraphMapperTests.swift index 1d356f7a..a04bf081 100644 --- a/Tests/XcodeGraphMapperTests/MapperTests/Graph/XcodeGraphMapperTests.swift +++ b/Tests/XcodeGraphMapperTests/MapperTests/Graph/XcodeGraphMapperTests.swift @@ -112,6 +112,57 @@ struct XcodeGraphMapperTests { .called(1) } + @Test("Maps a project with custom target product names") + func testProjectWithCustomTargetProductNames() async throws { + // Given + let pbxProj = PBXProj() + + let xcodeProj = try await XcodeProj.test( + projectName: "SingleProject", + pbxProj: pbxProj + ) + + let projectMapper = MockPBXProjectMapping() + given(projectMapper) + .map( + xcodeProj: .any, + projectNativeTargets: .any + ) + .willReturn( + .test() + ) + + // Add a single target to the project + try PBXNativeTarget.test( + name: "Alamofire-tvOS", + productName: "Alamofire", + productType: .application + ) + .add(to: pbxProj) + .add(to: pbxProj.rootObject) + + try xcodeProj.write(path: xcodeProj.path!) + let mapper = XcodeGraphMapper( + projectMapper: projectMapper + ) + // When + _ = try await mapper.buildGraph(from: .project(xcodeProj)) + + // Then + verify(projectMapper) + .map( + xcodeProj: .any, + projectNativeTargets: .matching( + { + $0.keys.map { $0 } == [ + "Alamofire", + ] + } + ) + ) + .called(1) + } + @Test("Maps a workspace with multiple projects into a single graph") func testWorkspaceGraphMultipleProjects() async throws { // Given diff --git a/Tests/XcodeGraphMapperTests/TestData/PBXNativeTarget+TestData.swift b/Tests/XcodeGraphMapperTests/TestData/PBXNativeTarget+TestData.swift index 9bf7b033..57a6ec14 100644 --- a/Tests/XcodeGraphMapperTests/TestData/PBXNativeTarget+TestData.swift +++ b/Tests/XcodeGraphMapperTests/TestData/PBXNativeTarget+TestData.swift @@ -12,6 +12,7 @@ extension PBXNativeTarget { ], dependencies: [PBXTargetDependency] = [], productInstallPath: String? = nil, + productName: String? = nil, productType: PBXProductType = .application, product: PBXFileReference? = PBXFileReference.test( sourceTree: .buildProductsDir, @@ -28,7 +29,7 @@ extension PBXNativeTarget { buildRules: buildRules, dependencies: dependencies, productInstallPath: productInstallPath, - productName: name, + productName: productName ?? name, product: product, productType: productType ) From 8055bfd85bd07a6244c708d10ab10d8124beb4a8 Mon Sep 17 00:00:00 2001 From: fortmarek Date: Mon, 3 Mar 2025 12:02:47 +0100 Subject: [PATCH 2/2] Fix tests --- Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift index c6fd2872..4609b8d2 100644 --- a/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift +++ b/Sources/XcodeGraphMapper/Mappers/Graph/XcodeGraphMapper.swift @@ -208,8 +208,8 @@ public struct XcodeGraphMapper: XcodeGraphMapping { } let projectNativeTargets: [String: ProjectNativeTarget] = xcodeProjects.reduce(into: [:]) { acc, xcodeProject in for nativeTarget in xcodeProject.pbxproj.nativeTargets.sorted(by: { $0.name > $1.name }) { - let name = nativeTarget.productName ?? Target.sanitizedProductNameFrom( - targetName: nativeTarget.name + let name = Target.sanitizedProductNameFrom( + targetName: nativeTarget.productName ?? nativeTarget.name ) acc[name] = ProjectNativeTarget( nativeTarget: nativeTarget,