diff --git a/phpmon-tests/Versions/AppUpdaterCheckTest.swift b/phpmon-tests/Versions/AppUpdaterCheckTest.swift index 64a2854..a108ac5 100644 --- a/phpmon-tests/Versions/AppUpdaterCheckTest.swift +++ b/phpmon-tests/Versions/AppUpdaterCheckTest.swift @@ -18,4 +18,30 @@ class AppUpdaterCheckTest: XCTestCase { XCTAssertNotNil(version) } + func testTaggedReleaseOmitsZeroPatch() { + let version = AppVersion.from("3.5.0_333")! + + XCTAssertEqual(version.tagged, "3.5") + XCTAssertEqual(version.version, "3.5.0") + } + + func testTaggedReleaseDoesntOmitNonZeroPatch() { + let version = AppVersion.from("3.5.1_333")! + + XCTAssertEqual(version.tagged, "3.5.1") + XCTAssertEqual(version.version, "3.5.1") + } + + func testTagTruncationDoesntAffectMajorVersions() { + var version = AppVersion.from("5.0_333")! + + XCTAssertEqual(version.tagged, "5.0") + XCTAssertEqual(version.version, "5.0") + + version = AppVersion.from("5.0.0_333")! + + XCTAssertEqual(version.tagged, "5.0") + XCTAssertEqual(version.version, "5.0.0") + } + } diff --git a/phpmon/Common/Pending Removal/Shell+PATH.swift b/phpmon/Common/Pending Removal/Shell+PATH.swift index cd29071..7f78c98 100644 --- a/phpmon/Common/Pending Removal/Shell+PATH.swift +++ b/phpmon/Common/Pending Removal/Shell+PATH.swift @@ -14,12 +14,18 @@ extension Shell { let task = Process() task.launchPath = "/bin/zsh" - // We need an interactive shell so the user's PATH is loaded in correctly - task.arguments = ["--login", "-ilc", "echo $PATH"] + let command = Filesystem.fileExists("~/.zshrc") + // source the user's .zshrc file if it exists to complete $PATH + ? ". ~/.zshrc && echo $PATH" + // otherwise, non-interactive mode is sufficient + : "echo $PATH" + + task.arguments = ["--login", "-lc", command] let pipe = Pipe() task.standardOutput = pipe task.launch() + let data = pipe.fileHandleForReading.readDataToEndOfFile() return String(data: data, encoding: String.Encoding.utf8) ?? "" diff --git a/phpmon/Domain/App/AppUpdateChecker.swift b/phpmon/Domain/App/AppUpdateChecker.swift index 7ac48da..9914e15 100644 --- a/phpmon/Domain/App/AppUpdateChecker.swift +++ b/phpmon/Domain/App/AppUpdateChecker.swift @@ -146,8 +146,9 @@ class AppUpdateChecker { text: "updater.alerts.buttons.release_notes".localized, action: { vc in vc.close(with: .OK) + NSWorkspace.shared.open( - Constants.Urls.GitHubReleases.appendingPathComponent("/tag/v\(version.version)\(devSuffix)") + Constants.Urls.GitHubReleases.appendingPathComponent("/tag/v\(version.tagged)\(devSuffix)") ) } ) diff --git a/phpmon/Domain/App/AppVersion.swift b/phpmon/Domain/App/AppVersion.swift index c554b2c..928858a 100644 --- a/phpmon/Domain/App/AppVersion.swift +++ b/phpmon/Domain/App/AppVersion.swift @@ -66,6 +66,14 @@ class AppVersion { return AppVersion.from("\(App.shortVersion)_\(App.bundleVersion)")! } + var tagged: String { + if version.suffix(2) == ".0" && version.count > 3 { + return String(version.dropLast(2)) + } + + return version + } + var computerReadable: String { return "\(version)_\(build ?? "0")" } diff --git a/phpmon/Domain/Menu/MainMenu+Startup.swift b/phpmon/Domain/Menu/MainMenu+Startup.swift index 1b90d57..728622d 100644 --- a/phpmon/Domain/Menu/MainMenu+Startup.swift +++ b/phpmon/Domain/Menu/MainMenu+Startup.swift @@ -162,11 +162,11 @@ extension MainMenu { App.shared.detectedApplications = Application.detectPresetApplications() - let customApps = Preferences.custom.scanApps.map { appName in + let customApps = Preferences.custom.scanApps?.map { appName in return Application(appName, .user_supplied) }.filter { app in return app.isInstalled() - } + } ?? [] App.shared.detectedApplications.append(contentsOf: customApps) diff --git a/phpmon/Domain/Menu/StatusMenu+Items.swift b/phpmon/Domain/Menu/StatusMenu+Items.swift index 34408b5..c022bdd 100644 --- a/phpmon/Domain/Menu/StatusMenu+Items.swift +++ b/phpmon/Domain/Menu/StatusMenu+Items.swift @@ -216,14 +216,14 @@ extension StatusMenu { } addItems([ - NSMenuItem.separator(), NSMenuItem(title: "mi_xdebug_mode".localized, submenu: [ HeaderView.asMenuItem(text: "mi_xdebug_available_modes".localized) ] + Xdebug.asMenuItems() + [ HeaderView.asMenuItem(text: "mi_xdebug_actions".localized), NSMenuItem(title: "mi_xdebug_disable_all".localized, action: #selector(MainMenu.disableAllXdebugModes)) - ], target: MainMenu.shared) + ], target: MainMenu.shared), + NSMenuItem.separator() ], target: MainMenu.shared) } diff --git a/phpmon/Domain/Menu/StatusMenu.swift b/phpmon/Domain/Menu/StatusMenu.swift index 70d5d18..2dd9da9 100644 --- a/phpmon/Domain/Menu/StatusMenu.swift +++ b/phpmon/Domain/Menu/StatusMenu.swift @@ -48,8 +48,9 @@ class StatusMenu: NSMenu { if Preferences.isEnabled(.displayExtensions) { addExtensionsMenuItems() - addXdebugMenuItem() NSMenuItem.separator() + + addXdebugMenuItem() } addPhpDoctorMenuItem() diff --git a/phpmon/Domain/Preferences/CustomPrefs.swift b/phpmon/Domain/Preferences/CustomPrefs.swift index 56b091b..731ada5 100644 --- a/phpmon/Domain/Preferences/CustomPrefs.swift +++ b/phpmon/Domain/Preferences/CustomPrefs.swift @@ -9,7 +9,7 @@ import Foundation struct CustomPrefs: Decodable { - let scanApps: [String] + let scanApps: [String]? let presets: [Preset]? let services: [String]? let environmentVariables: [String: String]? diff --git a/phpmon/Domain/SwiftUI/Common/SwiftUIHelper.swift b/phpmon/Domain/SwiftUI/Common/SwiftUIHelper.swift index 332cc83..3598836 100644 --- a/phpmon/Domain/SwiftUI/Common/SwiftUIHelper.swift +++ b/phpmon/Domain/SwiftUI/Common/SwiftUIHelper.swift @@ -10,8 +10,13 @@ import Foundation import SwiftUI var isRunningSwiftUIPreview: Bool { - return ProcessInfo.processInfo - .environment["XCODE_RUNNING_FOR_PREVIEWS"] != nil + #if DEBUG + // If running SwiftUI *and* when debugging + return ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] != nil + #else + // Release builds should always return false here + return false + #endif } extension Color {