diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj index 6b019b0..e888b2c 100644 --- a/Xcodes.xcodeproj/project.pbxproj +++ b/Xcodes.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 36741BFD291E4FDB00A85AAE /* DownloadPreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */; }; + 36741BFF291E50F500A85AAE /* FileError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36741BFE291E50F500A85AAE /* FileError.swift */; }; 536CFDD2263C94DE00026CE0 /* SignedInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD1263C94DE00026CE0 /* SignedInView.swift */; }; 536CFDD4263C9A8000026CE0 /* XcodesSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */; }; 53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53CBAB2B263DCC9100410495 /* XcodesAlert.swift */; }; @@ -172,6 +173,7 @@ 15FAD1652811D15600B63259 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; }; 25E2FA26284769A00014A318 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; 36741BFC291E4FDB00A85AAE /* DownloadPreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadPreferencePane.swift; sourceTree = ""; }; + 36741BFE291E50F500A85AAE /* FileError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileError.swift; sourceTree = ""; }; 4A5AAA1D28118FAD00528958 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; 536CFDD1263C94DE00026CE0 /* SignedInView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignedInView.swift; sourceTree = ""; }; 536CFDD3263C9A8000026CE0 /* XcodesSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesSheet.swift; sourceTree = ""; }; @@ -458,6 +460,7 @@ CAA858C325A2BE4E00ACF8C0 /* Downloader.swift */, CABFA9B22592EEEA00380FEE /* Entry+.swift */, CABFA9A92592EEE900380FEE /* Environment.swift */, + 36741BFE291E50F500A85AAE /* FileError.swift */, CABFA9B82592EEEA00380FEE /* FileManager+.swift */, CAFBDB942598FE96003DCC5A /* FocusedValues.swift */, CABFA9AC2592EEE900380FEE /* Foundation.swift */, @@ -841,6 +844,7 @@ CAA1CB45255A5B60003FD669 /* SignIn2FAView.swift in Sources */, CABFA9C52592EEEA00380FEE /* FileManager+.swift in Sources */, CABFA9CD2592EEEA00380FEE /* Foundation.swift in Sources */, + 36741BFF291E50F500A85AAE /* FileError.swift in Sources */, CA9FF8872595607900E47BAF /* InstalledXcode.swift in Sources */, 53CBAB2C263DCC9100410495 /* XcodesAlert.swift in Sources */, CA42DD6E25AEA8B200BC0B0C /* Logger.swift in Sources */, diff --git a/Xcodes/Backend/FileError.swift b/Xcodes/Backend/FileError.swift new file mode 100644 index 0000000..c3965bb --- /dev/null +++ b/Xcodes/Backend/FileError.swift @@ -0,0 +1,23 @@ +// +// FileError.swift +// Xcodes +// +// Created by Leon Wolf on 06.10.22. +// Copyright © 2022 Robots and Pencils. All rights reserved. +// + +import Foundation +import LegibleError + +enum FileError: LocalizedError{ + case fileNotFound(_ fileName: String) +} + +extension FileError { + var errorDescription: String? { + switch self { + case .fileNotFound(let fileName): + return String(format: localizeString("Alert.Uninstall.Error.Message.FileNotFound"), fileName) + } + } +} diff --git a/Xcodes/Backend/FileManager+.swift b/Xcodes/Backend/FileManager+.swift index 12c96e1..72fd1ee 100644 --- a/Xcodes/Backend/FileManager+.swift +++ b/Xcodes/Backend/FileManager+.swift @@ -11,7 +11,11 @@ extension FileManager { @discardableResult func trashItem(at url: URL) throws -> URL { var resultingItemURL: NSURL! - try trashItem(at: url, resultingItemURL: &resultingItemURL) + if fileExists(atPath: url.path) { + try trashItem(at: url, resultingItemURL: &resultingItemURL) + } else { + throw FileError.fileNotFound(url.lastPathComponent) + } return resultingItemURL as URL } -} \ No newline at end of file +} diff --git a/Xcodes/Resources/de.lproj/Localizable.strings b/Xcodes/Resources/de.lproj/Localizable.strings index cbe483e..2c1ab08 100644 --- a/Xcodes/Resources/de.lproj/Localizable.strings +++ b/Xcodes/Resources/de.lproj/Localizable.strings @@ -159,6 +159,7 @@ "Alert.Uninstall.Title" = "Xcode %@ deinstallieren?"; "Alert.Uninstall.Message" = "Die Anwendung wird in den Papierkorb verschoben, dieser wird aber nicht geleert."; "Alert.Uninstall.Error.Title" = "Die Deinstallation von Xcode ist nicht möglich"; +"Alert.Uninstall.Error.Message.FileNotFound" = "Datei \"%@\" konnte nicht gefunden werden."; // Cancel Install "Alert.CancelInstall.Title" = "Bist du sicher, dass Du die installation von Xcode %@ anhalten möchtest?"; diff --git a/Xcodes/Resources/en.lproj/Localizable.strings b/Xcodes/Resources/en.lproj/Localizable.strings index 2087b8b..56d4534 100644 --- a/Xcodes/Resources/en.lproj/Localizable.strings +++ b/Xcodes/Resources/en.lproj/Localizable.strings @@ -159,6 +159,7 @@ "Alert.Uninstall.Title" = "Uninstall Xcode %@?"; "Alert.Uninstall.Message" = "It will be moved to the Trash, but won't be emptied."; "Alert.Uninstall.Error.Title" = "Unable to uninstall Xcode"; +"Alert.Uninstall.Error.Message.FileNotFound" = "Could not find file \"%@\"."; // Cancel Install "Alert.CancelInstall.Title" = "Are you sure you want to stop the installation of Xcode %@?";