mirror of
https://github.com/XcodesOrg/XcodesApp.git
synced 2026-03-25 08:55:46 +00:00
Don't replace existing install state when updating
This commit is contained in:
parent
4a33d010a8
commit
fecb40893f
3 changed files with 52 additions and 8 deletions
|
|
@ -9,6 +9,7 @@
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
63EAA4EB259944450046AB8F /* ProgressButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EAA4EA259944450046AB8F /* ProgressButton.swift */; };
|
63EAA4EB259944450046AB8F /* ProgressButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EAA4EA259944450046AB8F /* ProgressButton.swift */; };
|
||||||
CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */; };
|
CA11E7BA2598476C00D2EE1C /* XcodeCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */; };
|
||||||
|
CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */; };
|
||||||
CA378F992466567600A58CE0 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA378F982466567600A58CE0 /* AppState.swift */; };
|
CA378F992466567600A58CE0 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA378F982466567600A58CE0 /* AppState.swift */; };
|
||||||
CA39711924495F0E00AFFB77 /* AppStoreButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */; };
|
CA39711924495F0E00AFFB77 /* AppStoreButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */; };
|
||||||
CA44901F2463AD34003D8213 /* Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA44901E2463AD34003D8213 /* Tag.swift */; };
|
CA44901F2463AD34003D8213 /* Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA44901E2463AD34003D8213 /* Tag.swift */; };
|
||||||
|
|
@ -132,6 +133,7 @@
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
63EAA4EA259944450046AB8F /* ProgressButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressButton.swift; sourceTree = "<group>"; };
|
63EAA4EA259944450046AB8F /* ProgressButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressButton.swift; sourceTree = "<group>"; };
|
||||||
CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeCommands.swift; sourceTree = "<group>"; };
|
CA11E7B92598476C00D2EE1C /* XcodeCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodeCommands.swift; sourceTree = "<group>"; };
|
||||||
|
CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateUpdateTests.swift; sourceTree = "<group>"; };
|
||||||
CA378F982466567600A58CE0 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
|
CA378F982466567600A58CE0 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
|
||||||
CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreButtonStyle.swift; sourceTree = "<group>"; };
|
CA39711824495F0E00AFFB77 /* AppStoreButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreButtonStyle.swift; sourceTree = "<group>"; };
|
||||||
CA44901E2463AD34003D8213 /* Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tag.swift; sourceTree = "<group>"; };
|
CA44901E2463AD34003D8213 /* Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tag.swift; sourceTree = "<group>"; };
|
||||||
|
|
@ -485,6 +487,7 @@
|
||||||
CAC281E1259FA44600B8AB0B /* Bundle+XcodesTests.swift */,
|
CAC281E1259FA44600B8AB0B /* Bundle+XcodesTests.swift */,
|
||||||
CAC281E6259FA45A00B8AB0B /* Environment+Mock.swift */,
|
CAC281E6259FA45A00B8AB0B /* Environment+Mock.swift */,
|
||||||
CAD2E7B72449575100113D76 /* AppStateTests.swift */,
|
CAD2E7B72449575100113D76 /* AppStateTests.swift */,
|
||||||
|
CA2518EB25A7FF2B00F08414 /* AppStateUpdateTests.swift */,
|
||||||
CAD2E7B92449575100113D76 /* Info.plist */,
|
CAD2E7B92449575100113D76 /* Info.plist */,
|
||||||
);
|
);
|
||||||
path = XcodesTests;
|
path = XcodesTests;
|
||||||
|
|
@ -743,6 +746,7 @@
|
||||||
files = (
|
files = (
|
||||||
CAC281E7259FA45A00B8AB0B /* Environment+Mock.swift in Sources */,
|
CAC281E7259FA45A00B8AB0B /* Environment+Mock.swift in Sources */,
|
||||||
CAC281E2259FA44600B8AB0B /* Bundle+XcodesTests.swift in Sources */,
|
CAC281E2259FA44600B8AB0B /* Bundle+XcodesTests.swift in Sources */,
|
||||||
|
CA2518EC25A7FF2B00F08414 /* AppStateUpdateTests.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,21 @@ class AppState: ObservableObject {
|
||||||
@Published var authenticationState: AuthenticationState = .unauthenticated
|
@Published var authenticationState: AuthenticationState = .unauthenticated
|
||||||
@Published var availableXcodes: [AvailableXcode] = [] {
|
@Published var availableXcodes: [AvailableXcode] = [] {
|
||||||
willSet {
|
willSet {
|
||||||
updateAllXcodes(availableXcodes: newValue, selectedXcodePath: selectedXcodePath)
|
updateAllXcodes(
|
||||||
|
availableXcodes: newValue,
|
||||||
|
installedXcodes: Current.files.installedXcodes(Path.root/"Applications"),
|
||||||
|
selectedXcodePath: selectedXcodePath
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Published var allXcodes: [Xcode] = []
|
@Published var allXcodes: [Xcode] = []
|
||||||
@Published var selectedXcodePath: String? {
|
@Published var selectedXcodePath: String? {
|
||||||
willSet {
|
willSet {
|
||||||
updateAllXcodes(availableXcodes: availableXcodes, selectedXcodePath: newValue)
|
updateAllXcodes(
|
||||||
|
availableXcodes: availableXcodes,
|
||||||
|
installedXcodes: Current.files.installedXcodes(Path.root/"Applications"),
|
||||||
|
selectedXcodePath: newValue
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Published var updatePublisher: AnyCancellable?
|
@Published var updatePublisher: AnyCancellable?
|
||||||
|
|
@ -335,11 +343,8 @@ class AppState: ObservableObject {
|
||||||
NSPasteboard.general.writeObjects([installedXcode.path.url as NSURL])
|
NSPasteboard.general.writeObjects([installedXcode.path.url as NSURL])
|
||||||
NSPasteboard.general.setString(installedXcode.path.string, forType: .string)
|
NSPasteboard.general.setString(installedXcode.path.string, forType: .string)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
func updateAllXcodes(availableXcodes: [AvailableXcode], installedXcodes: [InstalledXcode], selectedXcodePath: String?) {
|
||||||
|
|
||||||
private func updateAllXcodes(availableXcodes: [AvailableXcode], selectedXcodePath: String?) {
|
|
||||||
let installedXcodes = Current.files.installedXcodes(Path.root/"Applications")
|
|
||||||
var allXcodeVersions = availableXcodes.map { $0.version }
|
var allXcodeVersions = availableXcodes.map { $0.version }
|
||||||
for installedXcode in installedXcodes {
|
for installedXcode in installedXcodes {
|
||||||
// If an installed version isn't listed online, add the installed version
|
// If an installed version isn't listed online, add the installed version
|
||||||
|
|
@ -362,9 +367,13 @@ class AppState: ObservableObject {
|
||||||
.map { xcodeVersion in
|
.map { xcodeVersion in
|
||||||
let installedXcode = installedXcodes.first(where: { xcodeVersion.isEquivalentForDeterminingIfInstalled(toInstalled: $0.version) })
|
let installedXcode = installedXcodes.first(where: { xcodeVersion.isEquivalentForDeterminingIfInstalled(toInstalled: $0.version) })
|
||||||
let availableXcode = availableXcodes.first { $0.version == xcodeVersion }
|
let availableXcode = availableXcodes.first { $0.version == xcodeVersion }
|
||||||
|
let existingXcode = allXcodes.first { $0.version == xcodeVersion }
|
||||||
|
|
||||||
|
let defaultInstallState: XcodeInstallState = installedXcode != nil ? .installed : .notInstalled
|
||||||
|
|
||||||
return Xcode(
|
return Xcode(
|
||||||
version: xcodeVersion,
|
version: xcodeVersion,
|
||||||
installState: installedXcode != nil ? .installed : .notInstalled,
|
installState: existingXcode?.installState ?? defaultInstallState,
|
||||||
selected: installedXcode != nil && selectedXcodePath?.hasPrefix(installedXcode!.path.string) == true,
|
selected: installedXcode != nil && selectedXcodePath?.hasPrefix(installedXcode!.path.string) == true,
|
||||||
path: installedXcode?.path.string,
|
path: installedXcode?.path.string,
|
||||||
icon: (installedXcode?.path.string).map(NSWorkspace.shared.icon(forFile:)),
|
icon: (installedXcode?.path.string).map(NSWorkspace.shared.icon(forFile:)),
|
||||||
|
|
@ -376,6 +385,7 @@ class AppState: ObservableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Private
|
||||||
|
|
||||||
private func uninstallXcode(path: Path) -> AnyPublisher<Void, Error> {
|
private func uninstallXcode(path: Path) -> AnyPublisher<Void, Error> {
|
||||||
return Deferred {
|
return Deferred {
|
||||||
|
|
|
||||||
30
XcodesTests/AppStateUpdateTests.swift
Normal file
30
XcodesTests/AppStateUpdateTests.swift
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
import Path
|
||||||
|
import Version
|
||||||
|
@testable import Xcodes
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
class AppStateUpdateTests: XCTestCase {
|
||||||
|
var subject: AppState!
|
||||||
|
|
||||||
|
override func setUpWithError() throws {
|
||||||
|
Current = .mock
|
||||||
|
subject = AppState()
|
||||||
|
}
|
||||||
|
|
||||||
|
func testDoesNotReplaceInstallState() throws {
|
||||||
|
subject.allXcodes = [
|
||||||
|
Xcode(version: Version("0.0.0")!, installState: .installing(.unarchiving), selected: false, path: nil, icon: nil)
|
||||||
|
]
|
||||||
|
|
||||||
|
subject.updateAllXcodes(
|
||||||
|
availableXcodes: [
|
||||||
|
AvailableXcode(version: Version("0.0.0")!, url: URL(string: "https://apple.com/xcode.xip")!, filename: "mock.xip", releaseDate: nil)
|
||||||
|
],
|
||||||
|
installedXcodes: [
|
||||||
|
],
|
||||||
|
selectedXcodePath: nil
|
||||||
|
)
|
||||||
|
|
||||||
|
XCTAssertEqual(subject.allXcodes[0].installState, .installing(.unarchiving))
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue