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 ]) }