From b8bae4f32ca7d7ef257422aee2f6524051ec79d7 Mon Sep 17 00:00:00 2001 From: Brandon Evans Date: Sat, 6 Feb 2021 14:56:14 -0700 Subject: [PATCH] Don't consider versions without build identifiers for identical builds --- Xcodes/Backend/AppState.swift | 8 +++++++- XcodesTests/AppStateUpdateTests.swift | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) 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), [[], []]) + } }