From 67e85898344f469dc463aec2778a04c4f44ea719 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Thu, 5 Jan 2023 17:45:23 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Alter=20how=20PHP=20versio?= =?UTF-8?q?n=20support=20is=20handled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP Monitor.xcodeproj/project.pbxproj | 20 ++++---- phpmon/Common/Core/Constants.swift | 40 +++++++-------- phpmon/Common/PHP/ActivePhpInstallation.swift | 4 +- phpmon/Common/PHP/PHP Version/PhpEnv.swift | 9 ++-- ...ersionNumber.swift => VersionNumber.swift} | 50 ++++++++++--------- phpmon/Common/PHP/PhpInstallation.swift | 6 +-- phpmon/Domain/App/EnvironmentManager.swift | 2 +- phpmon/Domain/App/Startup.swift | 2 +- .../DomainList/Cells/DomainListPhpCell.swift | 2 +- phpmon/Domain/Integrations/Valet/Valet.swift | 36 ++++++++----- phpmon/Domain/Menu/MainMenu+Startup.swift | 2 +- phpmon/Domain/Menu/StatusMenu+Items.swift | 2 +- .../SwiftUI/Domains/VersionPopoverView.swift | 6 +-- phpmon/Localizable.strings | 6 +-- 14 files changed, 98 insertions(+), 89 deletions(-) rename phpmon/Common/PHP/PHP Version/{PhpVersionNumber.swift => VersionNumber.swift} (81%) diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index d8a78e6..c4d5736 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -229,10 +229,10 @@ C471E7EE28F9BAC30021E251 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4EE188322D3386B00E126E5 /* Constants.swift */; }; C471E7EF28F9BAC30021E251 /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415D3B62770F294005EF286 /* Actions.swift */; }; C471E7F028F9BAC30021E251 /* Paths.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B5853B2770FE3900DA4FBE /* Paths.swift */; }; - C471E7F128F9BAC70021E251 /* PhpVersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */; }; + C471E7F128F9BAC70021E251 /* VersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */; }; C471E7F228F9BAC70021E251 /* PhpEnv.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F1D2772136000DDDCDC /* PhpEnv.swift */; }; C471E7F328F9BAC70021E251 /* PhpHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D936C827E3EB6100BD69FE /* PhpHelper.swift */; }; - C471E7F428F9BAC80021E251 /* PhpVersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */; }; + C471E7F428F9BAC80021E251 /* VersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */; }; C471E7F528F9BAC80021E251 /* PhpEnv.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F1D2772136000DDDCDC /* PhpEnv.swift */; }; C471E7F628F9BAC80021E251 /* PhpHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D936C827E3EB6100BD69FE /* PhpHelper.swift */; }; C471E7F728F9BACB0021E251 /* PhpSwitcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9ADBE277610E1007277F4 /* PhpSwitcher.swift */; }; @@ -497,8 +497,8 @@ C485707C28BF459500539B36 /* NoWarningsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41C708C28AA7F7900E8D498 /* NoWarningsView.swift */; }; C485707D28BF45A200539B36 /* WarningView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4297F7928970D59004C4630 /* WarningView.swift */; }; C48D0C9325CC804200CC7490 /* XibLoadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D0C9225CC804200CC7490 /* XibLoadable.swift */; }; - C48D6C70279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */; }; - C48D6C71279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */; }; + C48D6C70279CD2AC00F26D7E /* VersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */; }; + C48D6C71279CD2AC00F26D7E /* VersionNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */; }; C48D6C75279CD3E400F26D7E /* PhpVersionNumberTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48D6C73279CD3E400F26D7E /* PhpVersionNumberTest.swift */; }; C4927F0B27B2DFC200C55AFD /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4927F0A27B2DFC200C55AFD /* Errors.swift */; }; C4927F0C27B2DFC200C55AFD /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4927F0A27B2DFC200C55AFD /* Errors.swift */; }; @@ -832,7 +832,7 @@ C4811D2322D70A4700B5F6B3 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenu.swift; sourceTree = ""; }; C48D0C9225CC804200CC7490 /* XibLoadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XibLoadable.swift; sourceTree = ""; }; - C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpVersionNumber.swift; sourceTree = ""; }; + C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionNumber.swift; sourceTree = ""; }; C48D6C73279CD3E400F26D7E /* PhpVersionNumberTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhpVersionNumberTest.swift; sourceTree = ""; }; C4927F0A27B2DFC200C55AFD /* Errors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; C4930849279F331F009C240B /* AddSiteVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSiteVC.swift; sourceTree = ""; }; @@ -1401,7 +1401,7 @@ isa = PBXGroup; children = ( C40C7F1D2772136000DDDCDC /* PhpEnv.swift */, - C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */, + C48D6C6F279CD2AC00F26D7E /* VersionNumber.swift */, C4D936C827E3EB6100BD69FE /* PhpHelper.swift */, ); path = "PHP Version"; @@ -1963,7 +1963,7 @@ C4C8900728F0E3EF00CE5E97 /* ActiveFileSystem.swift in Sources */, C4D8016622B1584700C6DA1B /* Startup.swift in Sources */, C42C49DB27C2806F0074ABAC /* MainMenu+FixMyValet.swift in Sources */, - C48D6C70279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */, + C48D6C70279CD2AC00F26D7E /* VersionNumber.swift in Sources */, C4998F0A2617633900B2526E /* PreferencesWindowController.swift in Sources */, C46FA9882822EFDC00D78807 /* PhpConfigurationFile.swift in Sources */, C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */, @@ -2271,7 +2271,7 @@ C471E81728F9BAE80021E251 /* NSMenuExtension.swift in Sources */, C471E81328F9BAE80021E251 /* XibLoadable.swift in Sources */, C4D3661C291173EA006BD146 /* DictionaryExtension.swift in Sources */, - C471E7F128F9BAC70021E251 /* PhpVersionNumber.swift in Sources */, + C471E7F128F9BAC70021E251 /* VersionNumber.swift in Sources */, C471E7DC28F9BA8F0021E251 /* ShellProtocol.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2436,7 +2436,7 @@ C469E706294CFDF700A82AB2 /* DomainsListTest.swift in Sources */, C471E80F28F9BAE80021E251 /* NSMenuExtension.swift in Sources */, C471E80B28F9BAE80021E251 /* XibLoadable.swift in Sources */, - C471E7F428F9BAC80021E251 /* PhpVersionNumber.swift in Sources */, + C471E7F428F9BAC80021E251 /* VersionNumber.swift in Sources */, C471E7CB28F9BA5B0021E251 /* TestableCommand.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2595,7 +2595,7 @@ C4E4404727C56F4700D225E1 /* ValetSite.swift in Sources */, C44CCD4A27AFF3BC00CE40E5 /* MainMenu+Async.swift in Sources */, C449B4F327EE7FC600C47E8A /* DomainListTypeCell.swift in Sources */, - C48D6C71279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */, + C48D6C71279CD2AC00F26D7E /* VersionNumber.swift in Sources */, C485706F28BF452300539B36 /* WarningsWindowController.swift in Sources */, C46FA9892822EFDC00D78807 /* PhpConfigurationFile.swift in Sources */, C41C02AB27E61CB3009F26CB /* FakeValetSite.swift in Sources */, diff --git a/phpmon/Common/Core/Constants.swift b/phpmon/Common/Core/Constants.swift index 64d13fa..1c595ba 100644 --- a/phpmon/Common/Core/Constants.swift +++ b/phpmon/Common/Core/Constants.swift @@ -20,29 +20,25 @@ struct Constants { /** * The PHP versions supported by this application. - * Versions that do not appear in this array are omitted from the list. + * Depends on what version of Valet is installed. */ - static let SupportedPhpVersions = [ - // ==================== - // STABLE RELEASES - // ==================== - // Versions of PHP that are stable and are supported. - "5.6", // only supported when Valet 2.x is active - "7.0", - "7.1", - "7.2", - "7.3", - "7.4", - "8.0", - "8.1", - "8.2", - - // ==================== - // EXPERIMENTAL SUPPORT - // ==================== - // Every release that supports the next release will always support the next - // dev release. In this case, that means that the version below is detected. - "8.3" + static let ValetSupportedPhpVersionMatrix = [ + 2: // Valet v2 has the broadest legacy support + [ + "5.6", + "7.0", "7.1", "7.2", "7.3", "7.4", + "8.0", "8.1", "8.2" + ], + 3: // Valet v3 dropped support for v5.6 + [ + "7.0", "7.1", "7.2", "7.3", "7.4", + "8.0", "8.1", "8.2", "8.3" + ], + 4: // Valet v4 dropped support for [String] { var output: [String] = [] - var supported = Constants.SupportedPhpVersions + let valetMajor = Valet.shared.version.major + let supported = Constants.ValetSupportedPhpVersionMatrix[valetMajor] ?? [] - if !Valet.enabled(feature: .supportForPhp56) { - supported.removeAll { $0 == "5.6" } - } + print(supported) versions.filter { (version) -> Bool in // Omit everything that doesn't start with php@ @@ -161,7 +160,7 @@ class PhpEnv { return output } - public func validVersions(for constraint: String) -> [PhpVersionNumber] { + public func validVersions(for constraint: String) -> [VersionNumber] { constraint.split(separator: "|").flatMap { return PhpVersionNumberCollection .make(from: self.availablePhpVersions) diff --git a/phpmon/Common/PHP/PHP Version/PhpVersionNumber.swift b/phpmon/Common/PHP/PHP Version/VersionNumber.swift similarity index 81% rename from phpmon/Common/PHP/PHP Version/PhpVersionNumber.swift rename to phpmon/Common/PHP/PHP Version/VersionNumber.swift index c262b2c..b3c4cc3 100644 --- a/phpmon/Common/PHP/PHP Version/PhpVersionNumber.swift +++ b/phpmon/Common/PHP/PHP Version/VersionNumber.swift @@ -9,19 +9,19 @@ import Foundation public struct PhpVersionNumberCollection: Equatable { - let versions: [PhpVersionNumber] + let versions: [VersionNumber] public static func make(from versions: [String]) -> Self { return PhpVersionNumberCollection( - versions: versions.map { try! PhpVersionNumber.parse($0) } + versions: versions.map { try! VersionNumber.parse($0) } ) } - public var first: PhpVersionNumber? { + public var first: VersionNumber? { return self.versions.first } - public var all: [PhpVersionNumber] { + public var all: [VersionNumber] { return self.versions } @@ -56,19 +56,19 @@ public struct PhpVersionNumberCollection: Equatable { If checking compatibility with general Homebrew versions of PHP, do NOT use strict mode, since the patch version there is not used. (The formula php@8.0 suffices for ^8.0.1.) */ - public func matching(constraint: String, strict: Bool = false) -> [PhpVersionNumber] { - if let version = PhpVersionNumber.make(from: constraint, type: .versionOnly) { + public func matching(constraint: String, strict: Bool = false) -> [VersionNumber] { + if let version = VersionNumber.make(from: constraint, type: .versionOnly) { // Strict constraint (e.g. "7.0") -> returns specific version return self.versions.filter { $0.isSameAs(version, strict) } } - if let version = PhpVersionNumber.make(from: constraint, type: .caretVersionRange) { + if let version = VersionNumber.make(from: constraint, type: .caretVersionRange) { // Caret range means that the major version is never higher but minor version can be higher // ^7.2 will be compatible with all versions between 7.2 and 8.0 return self.versions.filter { $0.hasNewerMinorVersionOrPatch(version, strict) } } - if let version = PhpVersionNumber.make(from: constraint, type: .tildeVersionRange) { + if let version = VersionNumber.make(from: constraint, type: .tildeVersionRange) { // Tilde range means that most specific digit is used as the basis. return self.versions.filter { version.patch != nil @@ -79,19 +79,19 @@ public struct PhpVersionNumberCollection: Equatable { } } - if let version = PhpVersionNumber.make(from: constraint, type: .greaterThanOrEqual) { + if let version = VersionNumber.make(from: constraint, type: .greaterThanOrEqual) { return self.versions.filter { $0.isSameAs(version, strict) || $0.isNewerThan(version, strict) } } - if let version = PhpVersionNumber.make(from: constraint, type: .greaterThan) { + if let version = VersionNumber.make(from: constraint, type: .greaterThan) { return self.versions.filter { $0.isNewerThan(version, strict) } } - if let version = PhpVersionNumber.make(from: constraint, type: .smallerThanOrEqual) { + if let version = VersionNumber.make(from: constraint, type: .smallerThanOrEqual) { return self.versions.filter { $0.isSameAs(version, strict) || $0.isOlderThan(version, strict)} } - if let version = PhpVersionNumber.make(from: constraint, type: .smallerThan) { + if let version = VersionNumber.make(from: constraint, type: .smallerThan) { return self.versions.filter { $0.isOlderThan(version, strict)} } @@ -99,18 +99,18 @@ public struct PhpVersionNumberCollection: Equatable { } } -public struct PhpVersionNumber: Equatable, Hashable { +public struct VersionNumber: Equatable, Hashable { let major: Int let minor: Int let patch: Int? - public func toString() -> String { + var text: String { return self.patch == nil - ? "\(major).\(minor)" - : "\(major).\(minor).\(patch!)" + ? "\(major).\(minor)" + : "\(major).\(minor).\(patch!)" } - public func patch(_ strictFallback: Bool = true, _ constraint: PhpVersionNumber? = nil) -> Int { + public func patch(_ strictFallback: Bool = true, _ constraint: VersionNumber? = nil) -> Int { return patch ?? (strictFallback ? 0 : constraint?.patch ?? 999) } @@ -168,13 +168,17 @@ public struct PhpVersionNumber: Equatable, Hashable { // MARK: Comparison Logic - internal func isSameAs(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func isSameMajorVersionAs(_ version: VersionNumber) -> Bool { + return self.major == version.major + } + + internal func isSameAs(_ version: VersionNumber, _ strict: Bool) -> Bool { return self.major == version.major && self.minor == version.minor && (strict ? self.patch(strict, version) == version.patch(strict) : true) } - internal func isNewerThan(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func isNewerThan(_ version: VersionNumber, _ strict: Bool) -> Bool { return ( self.major > version.major || self.major == version.major && self.minor > version.minor || @@ -183,7 +187,7 @@ public struct PhpVersionNumber: Equatable, Hashable { ) } - internal func isOlderThan(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func isOlderThan(_ version: VersionNumber, _ strict: Bool) -> Bool { return ( self.major < version.major || self.major == version.major && self.minor < version.minor || @@ -192,7 +196,7 @@ public struct PhpVersionNumber: Equatable, Hashable { ) } - internal func hasNewerMinorVersionOrPatch(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func hasNewerMinorVersionOrPatch(_ version: VersionNumber, _ strict: Bool) -> Bool { return self.major == version.major && ( (self.minor == version.minor && self.patch(strict) >= version.patch(strict, self)) @@ -200,12 +204,12 @@ public struct PhpVersionNumber: Equatable, Hashable { ) } - internal func hasSameMajorAndMinorButNewerOrSamePatch(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func hasSameMajorAndMinorButNewerOrSamePatch(_ version: VersionNumber, _ strict: Bool) -> Bool { return self.major == version.major && self.minor == version.minor && self.patch(strict, version) >= version.patch(strict) } - internal func hasSameMajorButNewerOrSameMinor(_ version: PhpVersionNumber, _ strict: Bool) -> Bool { + internal func hasSameMajorButNewerOrSameMinor(_ version: VersionNumber, _ strict: Bool) -> Bool { return self.major == version.major && self.minor >= version.minor } diff --git a/phpmon/Common/PHP/PhpInstallation.swift b/phpmon/Common/PHP/PhpInstallation.swift index c8abf99..f044be9 100644 --- a/phpmon/Common/PHP/PhpInstallation.swift +++ b/phpmon/Common/PHP/PhpInstallation.swift @@ -10,7 +10,7 @@ import Foundation class PhpInstallation { - var versionNumber: PhpVersionNumber + var versionNumber: VersionNumber /** In order to determine details about a PHP installation, we’ll simply run `php-config --version` @@ -19,7 +19,7 @@ class PhpInstallation { init(_ version: String) { let phpConfigExecutablePath = "\(Paths.optPath)/php@\(version)/bin/php-config" - self.versionNumber = PhpVersionNumber.make(from: version)! + self.versionNumber = VersionNumber.make(from: version)! if FileSystem.fileExists(phpConfigExecutablePath) { let longVersionString = Command.execute( @@ -30,7 +30,7 @@ class PhpInstallation { // The parser should always work, or the string has to be very unusual. // If so, the app SHOULD crash, so that the users report what's up. - self.versionNumber = try! PhpVersionNumber.parse(longVersionString) + self.versionNumber = try! VersionNumber.parse(longVersionString) } } diff --git a/phpmon/Domain/App/EnvironmentManager.swift b/phpmon/Domain/App/EnvironmentManager.swift index effcc9d..52f3ca7 100644 --- a/phpmon/Domain/App/EnvironmentManager.swift +++ b/phpmon/Domain/App/EnvironmentManager.swift @@ -21,7 +21,7 @@ public class EnvironmentManager { } // Extract the version number - Valet.shared.version = VersionExtractor.from(output) + Valet.shared.version = try! VersionNumber.parse(VersionExtractor.from(output)!) // Get the actual version return Valet.shared.version == nil diff --git a/phpmon/Domain/App/Startup.swift b/phpmon/Domain/App/Startup.swift index 5d53b78..7bfbe0e 100644 --- a/phpmon/Domain/App/Startup.swift +++ b/phpmon/Domain/App/Startup.swift @@ -242,7 +242,7 @@ class Startup { .components(separatedBy: "Laravel Valet")[1] .trimmingCharacters(in: .whitespaces) // Extract the version number - Valet.shared.version = VersionExtractor.from(output) + Valet.shared.version = try! VersionNumber.parse(VersionExtractor.from(output)!) // Get the actual version return Valet.shared.version == nil }, diff --git a/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift b/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift index a39d54b..bc0d039 100644 --- a/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift +++ b/phpmon/Domain/DomainList/Cells/DomainListPhpCell.swift @@ -53,7 +53,7 @@ class DomainListPhpCell: NSTableCellView, DomainListCellProtocol { @IBAction func pressedPhpVersion(_ sender: Any) { guard let site = self.site else { return } - var validPhpSuggestions: [PhpVersionNumber] { + var validPhpSuggestions: [VersionNumber] { if site.isolatedPhpVersion != nil { return [] } diff --git a/phpmon/Domain/Integrations/Valet/Valet.swift b/phpmon/Domain/Integrations/Valet/Valet.swift index e6f422b..50c8ca7 100644 --- a/phpmon/Domain/Integrations/Valet/Valet.swift +++ b/phpmon/Domain/Integrations/Valet/Valet.swift @@ -11,14 +11,13 @@ import Foundation class Valet { enum FeatureFlag { - case isolatedSites, - supportForPhp56 + case isolatedSites } static let shared = Valet() /// The version of Valet that was detected. - var version: String! = nil + var version: VersionNumber! = nil /// The Valet configuration file. var config: Valet.Configuration! @@ -138,13 +137,18 @@ class Valet { in use. This allows PHP Monitor to do different things when Valet 3.0 is enabled. */ public func evaluateFeatureSupport() { - let isOlderThanVersionThree = version.versionCompare("3.0") == .orderedAscending + let isVersion2 = version.isSameMajorVersionAs(try! VersionNumber.parse("2.0")) + let isVersion3 = version.isSameMajorVersionAs(try! VersionNumber.parse("3.0")) + let isVersion4 = version.isSameMajorVersionAs(try! VersionNumber.parse("4.0")) - if isOlderThanVersionThree { - self.features.append(.supportForPhp56) - } else { - Log.info("This version of Valet supports isolation.") + if isVersion2 { + Log.info("You are running Valet v2. Support for site isolation is disabled.") + } else if isVersion3 || isVersion4 { + Log.info("You are running Valet v3 or v4. Support for site isolation is available.") self.features.append(.isolatedSites) + } else { + // TODO: Show an alert and notify that some features might not work + Log.err("This version of Valet is not supported.") } } @@ -158,15 +162,16 @@ class Valet { Valet.shared.evaluateFeatureSupport() // 2. Notify user if the version is too old - if version.versionCompare(Constants.MinimumRecommendedValetVersion) == .orderedAscending { - let version = version - Log.warn("Valet version \(version!) is too old! (recommended: \(Constants.MinimumRecommendedValetVersion))") + if version.text.versionCompare(Constants.MinimumRecommendedValetVersion) == .orderedAscending { + let version = version! + let recommended = Constants.MinimumRecommendedValetVersion + Log.warn("Valet version \(version.text) is too old! (recommended: \(recommended))") Task { @MainActor in BetterAlert() .withInformation( title: "alert.min_valet_version.title".localized, subtitle: "alert.min_valet_version.info".localized( - version!, + version.text, Constants.MinimumRecommendedValetVersion ) ) @@ -174,9 +179,14 @@ class Valet { .show() } } else { - Log.info("Valet version \(version!) is recent enough, OK " + + Log.info("Valet version \(version.text) is recent enough, OK " + "(recommended: \(Constants.MinimumRecommendedValetVersion))") } + + // 3. Notify user if the version is too high + if version.major > 4 { + // TODO: + } } public func hasPlatformIssues() async -> Bool { diff --git a/phpmon/Domain/Menu/MainMenu+Startup.swift b/phpmon/Domain/Menu/MainMenu+Startup.swift index c5a9571..4f54592 100644 --- a/phpmon/Domain/Menu/MainMenu+Startup.swift +++ b/phpmon/Domain/Menu/MainMenu+Startup.swift @@ -50,7 +50,7 @@ extension MainMenu { // Attempt to find out more info about Valet if Valet.shared.version != nil { - Log.info("PHP Monitor has extracted the version number of Valet: \(Valet.shared.version!)") + Log.info("PHP Monitor has extracted the version number of Valet: \(Valet.shared.version!.text)") } // Validate the version (this will enforce which versions of PHP are supported) diff --git a/phpmon/Domain/Menu/StatusMenu+Items.swift b/phpmon/Domain/Menu/StatusMenu+Items.swift index 561a4e3..0d4c189 100644 --- a/phpmon/Domain/Menu/StatusMenu+Items.swift +++ b/phpmon/Domain/Menu/StatusMenu+Items.swift @@ -56,7 +56,7 @@ extension StatusMenu { let longVersion = PhpEnv.shared.cachedPhpInstallations[shortVersion]!.versionNumber let long = Preferences.preferences[.fullPhpVersionDynamicIcon] as! Bool - let versionString = long ? longVersion.toString() : shortVersion + let versionString = long ? longVersion.text : shortVersion let action = #selector(MainMenu.switchToPhpVersion(sender:)) let brew = (shortVersion == PhpEnv.brewPhpAlias) ? "php" : "php@\(shortVersion)" diff --git a/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift b/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift index 9ce4f11..25be569 100644 --- a/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift +++ b/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift @@ -12,7 +12,7 @@ struct VersionPopoverView: View { @State var site: ValetSite - @State var validPhpVersions: [PhpVersionNumber] + @State var validPhpVersions: [VersionNumber] @State var parent: NSPopover! @@ -185,8 +185,8 @@ struct VersionPopoverView_Previews: PreviewProvider { constraint: "^8.0" ), validPhpVersions: [ - PhpVersionNumber(major: 8, minor: 0, patch: 0), - PhpVersionNumber(major: 8, minor: 1, patch: 0) + VersionNumber(major: 8, minor: 0, patch: 0), + VersionNumber(major: 8, minor: 1, patch: 0) ], parent: nil ) diff --git a/phpmon/Localizable.strings b/phpmon/Localizable.strings index fadeff1..0f86088 100644 --- a/phpmon/Localizable.strings +++ b/phpmon/Localizable.strings @@ -427,12 +427,12 @@ problem manually, using your own Terminal app (this just shows you the output)." "alert.php_alias_conflict.title" = "Homebrew `php` formula alias conflict detected"; "alert.php_alias_conflict.info" = "PHP Monitor has detected conflicting `php` aliases in your Homebrew setup, both of which have been detected as installed.\n\nThis will likely result in failed linking when switching PHP versions, and will break PHP Monitor functionality.\n\nFor more information, please visit: https://github.com/nicoverbruggen/phpmon/issues/54"; -"alert.min_valet_version.title" = "Your version of Valet is outdated, please upgrade!"; +"alert.min_valet_version.title" = "The installed version of Valet does not meet the minimum version requirement. PHP Monitor may not function as expected!"; "alert.min_valet_version.info" = "You are currently running Valet %@. -For optimal support of the latest versions of PHP and proper version switching, it is recommended that you update to version %@. +For optimal support of the latest versions of PHP and proper version switching, it is recommended that you update to version %@, which is the minimum requirement for this version of PHP Monitor. -You can do this by running `composer global update` in your terminal. After that, run `valet install` again. For best results, restart PHP Monitor after that."; +You can do this by running `composer global update` in your terminal. After that, run `valet install` again. For best results, restart PHP Monitor after that. Until this is resolved, PHP Monitor may not behave as expected."; // Preset text description "alert.preset_description.switcher_version" = "Switches to PHP %@.\n\n";