diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index da38798..ff163a8 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -450,6 +450,9 @@ class AppState: ObservableObject { // Map all of the available versions into Xcode values that join available and installed Xcode data for display. var newAllXcodes = adjustedAvailableXcodes .filter { availableXcode in + // If we don't have the build identifier, don't attempt to filter prerelease versions with identical build identifiers + guard !availableXcode.version.buildMetadataIdentifiers.isEmpty else { return true } + let availableXcodesWithIdenticalBuildIdentifiers = availableXcodes .filter({ $0.version.buildMetadataIdentifiers == availableXcode.version.buildMetadataIdentifiers }) @@ -466,7 +469,10 @@ class AppState: ObservableObject { let identicalBuilds: [Version] let prereleaseAvailableXcodesWithIdenticalBuildIdentifiers = availableXcodes .filter { - $0.version.buildMetadataIdentifiers == availableXcode.version.buildMetadataIdentifiers && !$0.version.prereleaseIdentifiers.isEmpty + return $0.version.buildMetadataIdentifiers == availableXcode.version.buildMetadataIdentifiers && + !$0.version.prereleaseIdentifiers.isEmpty && + // If we don't have the build identifier, don't consider this as a potential identical build + !$0.version.buildMetadataIdentifiers.isEmpty } // If this is the release version, add the identical builds to it if !prereleaseAvailableXcodesWithIdenticalBuildIdentifiers.isEmpty, availableXcode.version.prereleaseIdentifiers.isEmpty { diff --git a/XcodesTests/AppStateUpdateTests.swift b/XcodesTests/AppStateUpdateTests.swift index 616e460..39d0d21 100644 --- a/XcodesTests/AppStateUpdateTests.swift +++ b/XcodesTests/AppStateUpdateTests.swift @@ -232,4 +232,30 @@ class AppStateUpdateTests: XCTestCase { XCTAssertEqual(subject.allXcodes.map(\.version), [Version("12.4.0+12D4e")!]) XCTAssertEqual(subject.allXcodes.map(\.identicalBuilds), [[Version("12.4.0+12D4e")!, Version("12.4.0-RC+12D4e")!]]) } + + func testIdenticalBuilds_AppleDataSource_DoNotMergeVersionsWithoutBuildIdentifiers() { + Current.defaults.string = { key in + if key == "dataSource" { + return "apple" + } else { + return nil + } + } + + subject.allXcodes = [ + ] + + subject.updateAllXcodes( + availableXcodes: [ + AvailableXcode(version: Version("12.4.0")!, url: URL(string: "https://apple.com/xcode.xip")!, filename: "mock.xip", releaseDate: nil), + AvailableXcode(version: Version("12.3.0-RC")!, url: URL(string: "https://apple.com/xcode.xip")!, filename: "mock.xip", releaseDate: nil), + ], + installedXcodes: [ + ], + selectedXcodePath: nil + ) + + XCTAssertEqual(subject.allXcodes.map(\.version), [Version("12.4.0")!, Version("12.3.0-RC")!]) + XCTAssertEqual(subject.allXcodes.map(\.identicalBuilds), [[], []]) + } }