From 2618187e29396187318a2162f892b6b93037bec5 Mon Sep 17 00:00:00 2001 From: Matt Kiazyk Date: Mon, 25 May 2026 13:15:01 -0500 Subject: [PATCH] fix missing xcode duplicate versions --- .../Services/XcodeListPresentationService.swift | 16 +++++++++++++++- .../XcodesKit/Services/XcodeListService.swift | 7 +------ Tests/XcodesKitTests/XcodesKitTests.swift | 5 +++-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Sources/XcodesKit/Services/XcodeListPresentationService.swift b/Sources/XcodesKit/Services/XcodeListPresentationService.swift index 7cbaa56..b510400 100644 --- a/Sources/XcodesKit/Services/XcodeListPresentationService.swift +++ b/Sources/XcodesKit/Services/XcodeListPresentationService.swift @@ -45,7 +45,7 @@ public struct XcodeListPresentationService: Sendable { ) : availableXcodes) .matchingArchitectureFilters(architectures) - let visibleAvailableXcodes = XcodeListService.filteringPrereleasesWithDuplicateBuildMetadata(adjustedAvailableXcodes) + let visibleAvailableXcodes = Self.filteringPrereleasesWithReleaseMatchingBuildAndArchitecture(adjustedAvailableXcodes) let adjustedInstalledXcodes = architectures.isEmpty ? installedXcodes @@ -149,4 +149,18 @@ public struct XcodeListPresentationService: Sendable { guard let selectedXcodePath else { return nil } return installedXcodes.first { selectedXcodePath.hasPrefix($0.path.string) } } + + static func filteringPrereleasesWithReleaseMatchingBuildAndArchitecture(_ xcodes: [AvailableXcode]) -> [AvailableXcode] { + xcodes.filter { availableXcode in + let releaseWithSameBuildAndArchitecture = xcodes.contains { + $0.version.buildMetadataIdentifiers == availableXcode.version.buildMetadataIdentifiers && + $0.version.prereleaseIdentifiers.isEmpty && + $0.architectures == availableXcode.architectures + } + + return availableXcode.version.prereleaseIdentifiers.isEmpty || + availableXcode.version.buildMetadataIdentifiers.isEmpty || + !releaseWithSameBuildAndArchitecture + } + } } diff --git a/Sources/XcodesKit/Services/XcodeListService.swift b/Sources/XcodesKit/Services/XcodeListService.swift index 697a829..9b4dc9e 100644 --- a/Sources/XcodesKit/Services/XcodeListService.swift +++ b/Sources/XcodesKit/Services/XcodeListService.swift @@ -220,14 +220,9 @@ public struct XcodeListService: Sendable { $0.version.buildMetadataIdentifiers == availableXcode.version.buildMetadataIdentifiers } - let releaseWithSameBuildAndArchitecture = availableXcodesWithIdenticalBuildIdentifiers.contains { - $0.version.prereleaseIdentifiers.isEmpty && - $0.architectures == availableXcode.architectures - } - return availableXcodesWithIdenticalBuildIdentifiers.count == 1 || availableXcodesWithIdenticalBuildIdentifiers.count > 1 && - (availableXcode.version.prereleaseIdentifiers.isEmpty || !releaseWithSameBuildAndArchitecture) + (availableXcode.version.prereleaseIdentifiers.isEmpty || availableXcode.architectures?.isEmpty == false) } } diff --git a/Tests/XcodesKitTests/XcodesKitTests.swift b/Tests/XcodesKitTests/XcodesKitTests.swift index da9e87a..8ef13e5 100644 --- a/Tests/XcodesKitTests/XcodesKitTests.swift +++ b/Tests/XcodesKitTests/XcodesKitTests.swift @@ -1102,7 +1102,7 @@ final class XcodesKitTests: XCTestCase { ]) } - func testXcodeListServiceFiltersArchitectureSpecificPrereleaseWhenReleaseHasSameArchitecture() throws { + func testXcodeListServiceKeepsArchitectureSpecificPrereleaseWhenReleaseHasSameArchitecture() throws { let release = AvailableXcode( version: try XCTUnwrap(Version("26.5.0+17F42")), url: try XCTUnwrap(URL(string: "https://apple.com/xcode-arm64.xip")), @@ -1124,7 +1124,8 @@ final class XcodesKitTests: XCTestCase { ]) XCTAssertEqual(filtered.map(\.xcodeID), [ - release.xcodeID + release.xcodeID, + prerelease.xcodeID ]) }