diff --git a/phpmon/Common/Core/Actions.swift b/phpmon/Common/Core/Actions.swift index ffcd44a8..84e93dfc 100644 --- a/phpmon/Common/Core/Actions.swift +++ b/phpmon/Common/Core/Actions.swift @@ -11,6 +11,10 @@ import ContainerMacro @ContainerAccess class Actions { + var formulae: HomebrewFormulae { + return HomebrewFormulae() + } + // MARK: - Services public func linkPhp() async { @@ -18,40 +22,40 @@ class Actions { } public func restartPhpFpm() async { - await brew("services restart \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated) + await brew("services restart \(formulae.php)", sudo: formulae.php.elevated) } public func restartPhpFpm(version: String) async { let formula = (version == PhpEnvironments.brewPhpAlias) ? "php" : "php@\(version)" - await brew("services restart \(formula)", sudo: HomebrewFormulae.php.elevated) + await brew("services restart \(formula)", sudo: formulae.php.elevated) } public func restartNginx() async { - await brew("services restart \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated) + await brew("services restart \(formulae.nginx)", sudo: formulae.nginx.elevated) } public func restartDnsMasq() async { - await brew("services restart \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated) + await brew("services restart \(formulae.dnsmasq)", sudo: formulae.dnsmasq.elevated) } public func stopValetServices() async { - await brew("services stop \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated) - await brew("services stop \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated) - await brew("services stop \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated) + await brew("services stop \(formulae.php)", sudo: formulae.php.elevated) + await brew("services stop \(formulae.nginx)", sudo: formulae.nginx.elevated) + await brew("services stop \(formulae.dnsmasq)", sudo: formulae.dnsmasq.elevated) } public func fixHomebrewPermissions() throws { var servicesCommands = [ - "\(paths.brew) services stop \(HomebrewFormulae.nginx)", - "\(paths.brew) services stop \(HomebrewFormulae.dnsmasq)" + "\(paths.brew) services stop \(formulae.nginx)", + "\(paths.brew) services stop \(formulae.dnsmasq)" ] var cellarCommands = [ - "chown -R \(paths.whoami):admin \(paths.cellarPath)/\(HomebrewFormulae.nginx)", - "chown -R \(paths.whoami):admin \(paths.cellarPath)/\(HomebrewFormulae.dnsmasq)" + "chown -R \(paths.whoami):admin \(paths.cellarPath)/\(formulae.nginx)", + "chown -R \(paths.whoami):admin \(paths.cellarPath)/\(formulae.dnsmasq)" ] - PhpEnvironments.shared.availablePhpVersions.forEach { version in + App.shared.container.phpEnvs.availablePhpVersions.forEach { version in let formula = version == PhpEnvironments.brewPhpAlias ? "php" : "php@\(version)" @@ -130,8 +134,8 @@ class Actions { */ public func fixMyValet() async { await InternalSwitcher().performSwitch(to: PhpEnvironments.brewPhpAlias) - await brew("services restart \(HomebrewFormulae.dnsmasq)", sudo: HomebrewFormulae.dnsmasq.elevated) - await brew("services restart \(HomebrewFormulae.php)", sudo: HomebrewFormulae.php.elevated) - await brew("services restart \(HomebrewFormulae.nginx)", sudo: HomebrewFormulae.nginx.elevated) + await brew("services restart \(formulae.dnsmasq)", sudo: formulae.dnsmasq.elevated) + await brew("services restart \(formulae.php)", sudo: formulae.php.elevated) + await brew("services restart \(formulae.nginx)", sudo: formulae.nginx.elevated) } } diff --git a/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift b/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift index 84776ec4..9de988e3 100644 --- a/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift +++ b/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift @@ -137,6 +137,10 @@ class PhpEnvironments { return InternalSwitcher() } + public func reloadPhpVersions() async { + _ = await self.detectPhpVersions() + } + /** Detects which versions of PHP are installed. This step also detects which versions of PHP are incompatible with the current version of Valet. diff --git a/phpmon/Domain/App/AppDelegate.swift b/phpmon/Domain/App/AppDelegate.swift index 2f147c29..728b7b18 100644 --- a/phpmon/Domain/App/AppDelegate.swift +++ b/phpmon/Domain/App/AppDelegate.swift @@ -93,7 +93,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele } func initializeSwitcher() { - self.phpEnvironments = PhpEnvironments.shared + self.phpEnvironments = App.shared.container.phpEnvs } static func initializeTestingProfile(_ path: String) { diff --git a/phpmon/Domain/App/Services/ServicesManager.swift b/phpmon/Domain/App/Services/ServicesManager.swift index cddfe75b..a6c938ab 100644 --- a/phpmon/Domain/App/Services/ServicesManager.swift +++ b/phpmon/Domain/App/Services/ServicesManager.swift @@ -108,10 +108,12 @@ class ServicesManager: ObservableObject { } var formulae: [HomebrewFormula] { + let f = HomebrewFormulae() + var formulae = [ - HomebrewFormulae.php, - HomebrewFormulae.nginx, - HomebrewFormulae.dnsmasq + f.php, + f.nginx, + f.dnsmasq ] let additionalFormulae = (Preferences.custom.services ?? []).map({ item in diff --git a/phpmon/Domain/Integrations/Homebrew/BrewPhpExtension.swift b/phpmon/Domain/Integrations/Homebrew/BrewPhpExtension.swift index 8c29254e..54aa568f 100644 --- a/phpmon/Domain/Integrations/Homebrew/BrewPhpExtension.swift +++ b/phpmon/Domain/Integrations/Homebrew/BrewPhpExtension.swift @@ -43,7 +43,7 @@ struct BrewPhpExtension: Hashable, Comparable { } var hasAlternativeInstall: Bool { - guard let php = PhpEnvironments.shared.cachedPhpInstallations[self.phpVersion] else { + guard let php = App.shared.container.phpEnvs.cachedPhpInstallations[self.phpVersion] else { return false } diff --git a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift index bbe461fa..b937b03b 100644 --- a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift +++ b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift @@ -72,7 +72,7 @@ class InstallPhpExtensionCommand: BrewCommand { } // Check which version of PHP are now installed - await PhpEnvironments.detectPhpVersions() + await container.phpEnvs.reloadPhpVersions() // Keep track of the currently installed version await MainMenu.shared.refreshActiveInstallation() diff --git a/phpmon/Domain/Integrations/Valet/Domains/FakeValetInteractor.swift b/phpmon/Domain/Integrations/Valet/Domains/FakeValetInteractor.swift index b3124496..9c0b7088 100644 --- a/phpmon/Domain/Integrations/Valet/Domains/FakeValetInteractor.swift +++ b/phpmon/Domain/Integrations/Valet/Domains/FakeValetInteractor.swift @@ -75,7 +75,7 @@ class FakeValetInteractor: ValetInteractor { override func isolate(site: ValetSite, version: String) async throws { await delay(seconds: delayTime) - site.isolatedPhpVersion = PhpEnvironments.shared.cachedPhpInstallations[version] + site.isolatedPhpVersion = App.shared.container.phpEnvs.cachedPhpInstallations[version] site.evaluateCompatibility() } diff --git a/phpmon/Domain/Menu/MainMenu+Actions.swift b/phpmon/Domain/Menu/MainMenu+Actions.swift index a825fb2c..7b96c7ca 100644 --- a/phpmon/Domain/Menu/MainMenu+Actions.swift +++ b/phpmon/Domain/Menu/MainMenu+Actions.swift @@ -106,7 +106,7 @@ extension MainMenu { } @objc func disableAllXdebugModes() { - guard let file = PhpEnvironments.shared.getConfigFile(forKey: "xdebug.mode") else { + guard let file = App.shared.container.phpEnvs.getConfigFile(forKey: "xdebug.mode") else { Log.info("xdebug.mode could not be found in any .ini file, aborting.") return } @@ -125,12 +125,12 @@ extension MainMenu { @objc func toggleXdebugMode(sender: XdebugMenuItem) { Log.info("Switching Xdebug to mode: \(sender.mode)") - guard let file = PhpEnvironments.shared.getConfigFile(forKey: "xdebug.mode") else { + guard let file = App.shared.container.phpEnvs.getConfigFile(forKey: "xdebug.mode") else { return Log.info("xdebug.mode could not be found in any .ini file, aborting.") } do { - var modes = Xdebug.activeModes + var modes = Xdebug().activeModes if let index = modes.firstIndex(of: sender.mode) { modes.remove(at: index) @@ -227,7 +227,7 @@ extension MainMenu { } @objc func openActiveConfigFolder() { - guard let install = PhpEnvironments.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { // TODO: Can't open the config if no PHP version is active return } @@ -260,7 +260,7 @@ extension MainMenu { if silently { MainMenu.shared.shouldSwitchSilently = true } - if PhpEnvironments.shared.availablePhpVersions.contains(version) { + if App.shared.container.phpEnvs.availablePhpVersions.contains(version) { Task { MainMenu.shared.switchToPhpVersion(version) } } else { Task { @@ -279,37 +279,37 @@ extension MainMenu { MainMenu.shared.shouldSwitchSilently = true } - if !PhpEnvironments.shared.availablePhpVersions.contains(version) { + if !App.shared.container.phpEnvs.availablePhpVersions.contains(version) { Log.warn("This PHP version is currently unavailable, not switching!") return } - PhpEnvironments.shared.isBusy = true - PhpEnvironments.shared.delegate = self - PhpEnvironments.shared.delegate?.switcherDidStartSwitching(to: version) + App.shared.container.phpEnvs.isBusy = true + App.shared.container.phpEnvs.delegate = self + App.shared.container.phpEnvs.delegate?.switcherDidStartSwitching(to: version) refreshIcon() rebuild() await PhpEnvironments.switcher.performSwitch(to: version) - PhpEnvironments.shared.currentInstall = ActivePhpInstallation() + App.shared.container.phpEnvs.currentInstall = ActivePhpInstallation() App.shared.handlePhpConfigWatcher() - PhpEnvironments.shared.delegate?.switcherDidCompleteSwitch(to: version) + App.shared.container.phpEnvs.delegate?.switcherDidCompleteSwitch(to: version) } @objc func switchToPhpVersion(_ version: String) { - PhpEnvironments.shared.isBusy = true - PhpEnvironments.shared.delegate = self - PhpEnvironments.shared.delegate?.switcherDidStartSwitching(to: version) + App.shared.container.phpEnvs.isBusy = true + App.shared.container.phpEnvs.delegate = self + App.shared.container.phpEnvs.delegate?.switcherDidStartSwitching(to: version) Task(priority: .userInitiated) { [unowned self] in refreshIcon() rebuild() await PhpEnvironments.switcher.performSwitch(to: version) - PhpEnvironments.shared.currentInstall = ActivePhpInstallation() + App.shared.container.phpEnvs.currentInstall = ActivePhpInstallation() App.shared.handlePhpConfigWatcher() - PhpEnvironments.shared.delegate?.switcherDidCompleteSwitch(to: version) + App.shared.container.phpEnvs.delegate?.switcherDidCompleteSwitch(to: version) } } @@ -324,18 +324,18 @@ extension MainMenu { */ func switchToPhp(_ version: String) async { Task { @MainActor [self] in - PhpEnvironments.shared.isBusy = true - PhpEnvironments.shared.delegate = self - PhpEnvironments.shared.delegate?.switcherDidStartSwitching(to: version) + App.shared.container.phpEnvs.isBusy = true + App.shared.container.phpEnvs.delegate = self + App.shared.container.phpEnvs.delegate?.switcherDidStartSwitching(to: version) } refreshIcon() rebuild() await PhpEnvironments.switcher.performSwitch(to: version) - PhpEnvironments.shared.currentInstall = ActivePhpInstallation() + App.shared.container.phpEnvs.currentInstall = ActivePhpInstallation() App.shared.handlePhpConfigWatcher() - PhpEnvironments.shared.delegate?.switcherDidCompleteSwitch(to: version) + App.shared.container.phpEnvs.delegate?.switcherDidCompleteSwitch(to: version) } } diff --git a/phpmon/Domain/Menu/MainMenu+Async.swift b/phpmon/Domain/Menu/MainMenu+Async.swift index 0301089f..4c95e064 100644 --- a/phpmon/Domain/Menu/MainMenu+Async.swift +++ b/phpmon/Domain/Menu/MainMenu+Async.swift @@ -46,7 +46,7 @@ extension MainMenu { ] ) { if behaviours.contains(.reloadsPhpInstallation) || behaviours.contains(.setsBusyUI) { - PhpEnvironments.shared.isBusy = true + App.shared.container.phpEnvs.isBusy = true } Task(priority: .userInitiated) { [unowned self] in @@ -59,7 +59,7 @@ extension MainMenu { Task { @MainActor [self, error] in if behaviours.contains(.reloadsPhpInstallation) { - PhpEnvironments.shared.currentInstall = ActivePhpInstallation() + App.shared.container.phpEnvs.currentInstall = ActivePhpInstallation() } if behaviours.contains(.updatesMenuBarContents) { @@ -72,7 +72,7 @@ extension MainMenu { } if behaviours.contains(.setsBusyUI) { - PhpEnvironments.shared.isBusy = false + App.shared.container.phpEnvs.isBusy = false } if error != nil { diff --git a/phpmon/Domain/Menu/MainMenu+FixMyValet.swift b/phpmon/Domain/Menu/MainMenu+FixMyValet.swift index e1ffab4d..a61fb5a7 100644 --- a/phpmon/Domain/Menu/MainMenu+FixMyValet.swift +++ b/phpmon/Domain/Menu/MainMenu+FixMyValet.swift @@ -13,9 +13,9 @@ import NVAlert extension MainMenu { @MainActor @objc func fixMyValet() { - let previousVersion = PhpEnvironments.phpInstall?.version.short + let previousVersion = container.phpEnvs.phpInstall?.version.short - if !PhpEnvironments.shared.availablePhpVersions.contains(PhpEnvironments.brewPhpAlias) { + if !App.shared.container.phpEnvs.availablePhpVersions.contains(PhpEnvironments.brewPhpAlias) { presentAlertForMissingFormula() return } diff --git a/phpmon/Domain/Menu/MainMenu+Startup.swift b/phpmon/Domain/Menu/MainMenu+Startup.swift index f2f567ff..062331e2 100644 --- a/phpmon/Domain/Menu/MainMenu+Startup.swift +++ b/phpmon/Domain/Menu/MainMenu+Startup.swift @@ -31,7 +31,7 @@ extension MainMenu { */ private func onEnvironmentPass() async { // Determine what the `php` formula is aliased to - await PhpEnvironments.shared.determinePhpAlias() + await App.shared.container.phpEnvs.determinePhpAlias() // Make sure that broken symlinks are removed ASAP await BrewDiagnostics.shared.checkForOutdatedPhpInstallationSymlinks() @@ -54,7 +54,7 @@ extension MainMenu { await Brew.shared.determineVersion() // Actually detect the PHP versions - await PhpEnvironments.detectPhpVersions() + await container.phpEnvs.reloadPhpVersions() // Verify third party taps // The missing tap(s) will be actionable later @@ -63,9 +63,6 @@ extension MainMenu { // Check for an alias conflict await BrewDiagnostics.shared.checkForCaskConflict() - // Attempt to find out if PHP-FPM is broken - PhpEnvironments.prepare() - // Set up the filesystem watcher for the Homebrew binaries App.shared.prepareHomebrewWatchers() @@ -108,7 +105,7 @@ extension MainMenu { Log.info("The services manager knows about \(ServicesManager.shared.services.count) services.") // We are ready! - PhpEnvironments.shared.isBusy = false + App.shared.container.phpEnvs.isBusy = false // Finally! Log.info("PHP Monitor is ready to serve!") diff --git a/phpmon/Domain/Menu/MainMenu+Switcher.swift b/phpmon/Domain/Menu/MainMenu+Switcher.swift index aa3fc867..174216e4 100644 --- a/phpmon/Domain/Menu/MainMenu+Switcher.swift +++ b/phpmon/Domain/Menu/MainMenu+Switcher.swift @@ -18,7 +18,7 @@ extension MainMenu { nonisolated func switcherDidCompleteSwitch(to version: String) { // Mark as no longer busy Task { @MainActor in - PhpEnvironments.shared.isBusy = false + container.phpEnvs.isBusy = false } Task { // Things to do after reloading domain list data @@ -31,7 +31,7 @@ extension MainMenu { refreshIcon() rebuild() - if Valet.installed && !PhpEnvironments.shared.validate(version) { + if Valet.installed && !container.phpEnvs.validate(version) { self.suggestFixMyValet(failed: version) return } @@ -135,7 +135,7 @@ extension MainMenu { preference: .notifyAboutVersionChange ) - guard PhpEnvironments.phpInstall != nil else { + guard container.phpEnvs.phpInstall != nil else { Log.err("Cannot notify about version change if PHP is unlinked") return } diff --git a/phpmon/Domain/Menu/MainMenu.swift b/phpmon/Domain/Menu/MainMenu.swift index a915c40b..571854cb 100644 --- a/phpmon/Domain/Menu/MainMenu.swift +++ b/phpmon/Domain/Menu/MainMenu.swift @@ -8,8 +8,11 @@ import Cocoa import NVAlert -@MainActor +@MainActor class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate { + var container: Container { + return App.shared.container + } static let shared = MainMenu() @@ -78,8 +81,8 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate /** Reloads which PHP versions is currently active. */ @objc func refreshActiveInstallation() { - if !PhpEnvironments.shared.isBusy { - PhpEnvironments.shared.currentInstall = ActivePhpInstallation.load() + if !container.phpEnvs.isBusy { + container.phpEnvs.currentInstall = ActivePhpInstallation.load() refreshIcon() rebuild() } else { @@ -124,7 +127,7 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate NVAlert().withInformation( title: "startup.unsupported_versions_explanation.title".localized, subtitle: "startup.unsupported_versions_explanation.subtitle".localized( - PhpEnvironments.shared.incompatiblePhpVersions + container.phpEnvs.incompatiblePhpVersions .map({ version in return "• PHP \(version)" }) @@ -156,9 +159,8 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate /** Refreshes the icon with the PHP version. */ @objc func refreshIcon() { - Task { @MainActor [self] in - if PhpEnvironments.shared.isBusy { + if container.phpEnvs.isBusy { Log.perf("Refreshing icon: currently busy") setStatusBar(image: NSImage.statusBarIcon) } else { @@ -170,7 +172,7 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate // The dynamic icon has been requested let long = Preferences.preferences[.fullPhpVersionDynamicIcon] as! Bool - guard let install = PhpEnvironments.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { setStatusBarImage(version: "???") return } diff --git a/phpmon/Domain/Menu/StatusMenu+Items.swift b/phpmon/Domain/Menu/StatusMenu+Items.swift index 64785268..7992cc2e 100644 --- a/phpmon/Domain/Menu/StatusMenu+Items.swift +++ b/phpmon/Domain/Menu/StatusMenu+Items.swift @@ -13,7 +13,7 @@ import Cocoa extension StatusMenu { @MainActor func addPhpVersionMenuItems() { - if PhpEnvironments.phpInstall == nil { + if container.phpEnvs.phpInstall == nil { addItem(HeaderView.asMenuItem(text: "⚠️ " + "mi_no_php_linked".localized, minimumWidth: 280)) addItems([ NSMenuItem.separator(), @@ -23,29 +23,29 @@ extension StatusMenu { return } - if PhpEnvironments.phpInstall!.hasErrorState { + if container.phpEnvs.phpInstall!.hasErrorState { let brokenMenuItems = ["mi_php_broken_1", "mi_php_broken_2", "mi_php_broken_3", "mi_php_broken_4"] return addItems(brokenMenuItems.map { NSMenuItem(title: $0.localized) }) } addItem(HeaderView.asMenuItem( - text: "\("mi_php_version".localized) \(PhpEnvironments.phpInstall!.version.long)", + text: "\("mi_php_version".localized) \(container.phpEnvs.phpInstall!.version.long)", minimumWidth: 280 // this ensures the menu is at least wide enough not to cause clipping )) } @MainActor func addPhpActionMenuItems() { - if PhpEnvironments.shared.isBusy { + if App.shared.container.phpEnvs.isBusy { addItem(NSMenuItem(title: "mi_busy".localized)) return } - if PhpEnvironments.shared.availablePhpVersions.isEmpty - && PhpEnvironments.shared.incompatiblePhpVersions.isEmpty { + if App.shared.container.phpEnvs.availablePhpVersions.isEmpty + && App.shared.container.phpEnvs.incompatiblePhpVersions.isEmpty { return } - if PhpEnvironments.shared.currentInstall == nil { + if App.shared.container.phpEnvs.currentInstall == nil { return } @@ -55,7 +55,7 @@ extension StatusMenu { } @MainActor func addServicesManagerMenuItem() { - if PhpEnvironments.shared.isBusy { + if App.shared.container.phpEnvs.isBusy { return } @@ -67,10 +67,10 @@ extension StatusMenu { @MainActor func addSwitchToPhpMenuItems() { var shortcutKey = 1 - for index in (0.. Bool { - if PhpEnvironments.shared.currentInstall?.version.short == self.version! { + if App.shared.container.phpEnvs.currentInstall?.version.short == self.version! { Log.info("The version we are supposed to switch to is already active.") return true } - if PhpEnvironments.shared.availablePhpVersions.first(where: { $0 == self.version }) != nil { + if App.shared.container.phpEnvs.availablePhpVersions.first(where: { $0 == self.version }) != nil { await MainMenu.shared.switchToPhp(self.version!) return true } else { @@ -145,7 +149,7 @@ struct Preset: Codable, Equatable { subtitle: "alert.php_switch_unavailable.subtitle".localized(version!), description: "alert.php_switch_unavailable.info".localized( version!, - PhpEnvironments.shared.availablePhpVersions.joined(separator: ", ") + App.shared.container.phpEnvs.availablePhpVersions.joined(separator: ", ") ) ).withPrimary( text: "alert.php_switch_unavailable.ok".localized @@ -156,7 +160,7 @@ struct Preset: Codable, Equatable { } private func applyConfigurationValue(key: String, value: String) { - guard let file = PhpEnvironments.shared.getConfigFile(forKey: key) else { + guard let file = App.shared.container.phpEnvs.getConfigFile(forKey: key) else { return } @@ -217,7 +221,7 @@ struct Preset: Codable, Equatable { return nil } - guard let install = PhpEnvironments.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { return nil } @@ -234,7 +238,7 @@ struct Preset: Codable, Equatable { private func diffExtensions() -> [String: Bool] { var items: [String: Bool] = [:] - guard let install = PhpEnvironments.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { fatalError("If no PHP version is linked, diffing extensions is not possible.") } @@ -256,7 +260,7 @@ struct Preset: Codable, Equatable { var items: [String: String?] = [:] for (key, _) in self.configuration { - guard let file = PhpEnvironments.shared.getConfigFile(forKey: key) else { + guard let file = App.shared.container.phpEnvs.getConfigFile(forKey: key) else { break } diff --git a/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift b/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift index 726a7c40..0be35d8e 100644 --- a/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift +++ b/phpmon/Domain/SwiftUI/Domains/VersionPopoverView.swift @@ -9,6 +9,9 @@ import SwiftUI struct VersionPopoverView: View { + var container: Container { + return App.shared.container + } @State var site: ValetSite @@ -120,7 +123,7 @@ struct VersionPopoverView: View { if site.isolatedPhpVersion != nil { information += "alert.composer_php_isolated.desc".localized( site.isolatedPhpVersion!.versionNumber.short, - PhpEnvironments.phpInstall?.version.short ?? "???" + container.phpEnvs.phpInstall?.version.short ?? "???" ) information += "\n\n" } diff --git a/phpmon/Domain/Watcher/App+BrewWatch.swift b/phpmon/Domain/Watcher/App+BrewWatch.swift index 5dfa0eac..692477fb 100644 --- a/phpmon/Domain/Watcher/App+BrewWatch.swift +++ b/phpmon/Domain/Watcher/App+BrewWatch.swift @@ -27,9 +27,9 @@ extension App { } public func onHomebrewPhpModification() async { - // let previous = PhpEnvironments.shared.currentInstall?.version.text + // let previous = App.shared.container.phpEnvs.currentInstall?.version.text Log.info("Something changed in the Homebrew binary directory...") - await PhpEnvironments.detectPhpVersions() + await container.phpEnvs.reloadPhpVersions() await MainMenu.shared.refreshActiveInstallation() // @@ -37,7 +37,7 @@ extension App { // Check if the new and previous version of PHP are different // if so, we can show a notification if needed or alert the user // - // let new = PhpEnvironments.shared.currentInstall?.version.text + // let new = App.shared.container.phpEnvs.currentInstall?.version.text // } } diff --git a/phpmon/Modules/Domain List/UI/Cells/DomainListPhpCell.swift b/phpmon/Modules/Domain List/UI/Cells/DomainListPhpCell.swift index 30d267c5..0b48ebd2 100644 --- a/phpmon/Modules/Domain List/UI/Cells/DomainListPhpCell.swift +++ b/phpmon/Modules/Domain List/UI/Cells/DomainListPhpCell.swift @@ -11,6 +11,10 @@ import AppKit import SwiftUI class DomainListPhpCell: NSTableCellView, DomainListCellProtocol { + var container: Container { + return App.shared.container + } + var site: ValetSite? @IBOutlet weak var buttonPhpVersion: NSButton! @@ -60,11 +64,12 @@ class DomainListPhpCell: NSTableCellView, DomainListCellProtocol { return [] } - guard let install = PhpEnvironments.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { return [] } - return PhpEnvironments.shared.validVersions(for: site.preferredPhpVersion).filter({ version in + return container.phpEnvs.validVersions(for: site.preferredPhpVersion) + .filter({ version in version.short != install.version.short }) } diff --git a/phpmon/Modules/Domain List/UI/DomainListVC.swift b/phpmon/Modules/Domain List/UI/DomainListVC.swift index 69f90ecb..97077c3d 100644 --- a/phpmon/Modules/Domain List/UI/DomainListVC.swift +++ b/phpmon/Modules/Domain List/UI/DomainListVC.swift @@ -9,10 +9,11 @@ import Cocoa import Carbon import SwiftUI -import ContainerMacro -@ContainerAccess class DomainListVC: NSViewController, NSTableViewDelegate, NSTableViewDataSource { + var container: Container { + return App.shared.container + } // MARK: - Outlets diff --git a/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift b/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift index b512854f..de89c7c7 100644 --- a/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift +++ b/phpmon/Modules/PHP Config Editor/Data/PhpPreference.swift @@ -20,7 +20,7 @@ class PhpPreference { } internal static func persistToIniFile(key: String, value: String) throws { - if let file = PhpEnvironments.shared.getConfigFile(forKey: key) { + if let file = App.shared.container.phpEnvs.getConfigFile(forKey: key) { return try file.replace(key: key, value: value) } diff --git a/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift b/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift index afa87b38..6f087a7e 100644 --- a/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift +++ b/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift @@ -43,8 +43,8 @@ extension WarningManager { ), Warning( command: { - PhpEnvironments.shared.currentInstall?.extensions.contains { $0.name == "xdebug" } ?? false - && !Xdebug.enabled + App.shared.container.phpEnvs.currentInstall?.extensions.contains { $0.name == "xdebug" } ?? false + && !Xdebug().enabled }, name: "Missing configuration file for `xdebug.mode`", title: "warnings.xdebug_conf_missing.title", @@ -53,7 +53,7 @@ extension WarningManager { ] }, url: "https://xdebug.org/docs/install#mode", fix: { - if let php = PhpEnvironments.shared.currentInstall { + if let php = App.shared.container.phpEnvs.currentInstall { if let xdebug = php.extensions.first(where: { $0.name == "xdebug" }), let original = try? App.shared.container.filesystem.getStringFromFile(xdebug.file) { // Append xdebug.mode = off to the file @@ -63,7 +63,7 @@ extension WarningManager { ) // Reload extension configuration by updating PHP installation info (reload) - PhpEnvironments.shared.currentInstall = ActivePhpInstallation() + App.shared.container.phpEnvs.currentInstall = ActivePhpInstallation() // Finally, reload warnings await self.checkEnvironment() diff --git a/phpmon/Modules/PHP Extension Manager/UI/PhpExtensionManagerView.swift b/phpmon/Modules/PHP Extension Manager/UI/PhpExtensionManagerView.swift index 328ff061..a084c19e 100644 --- a/phpmon/Modules/PHP Extension Manager/UI/PhpExtensionManagerView.swift +++ b/phpmon/Modules/PHP Extension Manager/UI/PhpExtensionManagerView.swift @@ -19,7 +19,7 @@ struct PhpExtensionManagerView: View { init() { self.searchText = "" self.status = BusyStatus.busy() - let version = PhpEnvironments.shared.currentInstall!.version.short + let version = App.shared.container.phpEnvs.currentInstall!.version.short self.manager = BrewExtensionsObservable(phpVersion: version) self.status.busy = false } @@ -29,7 +29,7 @@ struct PhpExtensionManagerView: View { return [manager.phpVersion] } - return PhpEnvironments.shared.availablePhpVersions + return App.shared.container.phpEnvs.availablePhpVersions } var filteredExtensions: [BrewPhpExtension] { diff --git a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView+Actions.swift b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView+Actions.swift index b893647a..fa2d2f73 100644 --- a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView+Actions.swift +++ b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView+Actions.swift @@ -11,7 +11,7 @@ import SwiftUI extension PhpVersionManagerView { public func runCommand(_ command: ModifyPhpVersionCommand) async { - if PhpEnvironments.shared.isBusy { + if App.shared.container.phpEnvs.isBusy { self.presentErrorAlert( title: "phpman.action_prevented_busy.title".localized, description: "phpman.action_prevented_busy.desc".localized, @@ -79,7 +79,7 @@ extension PhpVersionManagerView { public func confirmUninstall(_ formula: BrewPhpFormula) async { // Disallow removal of the currently active versipn - if formula.installedVersion == PhpEnvironments.shared.currentInstall?.version.text { + if formula.installedVersion == App.shared.container.phpEnvs.currentInstall?.version.text { self.presentErrorAlert( title: "phpman.uninstall_prevented.title".localized, description: "phpman.uninstall_prevented.desc".localized, @@ -133,7 +133,7 @@ extension PhpVersionManagerView { public func setBusyStatus(_ busy: Bool) { Task { @MainActor in - PhpEnvironments.shared.isBusy = busy + App.shared.container.phpEnvs.isBusy = busy self.status.busy = busy } } diff --git a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView.swift b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView.swift index 0d2379b8..f54af0c0 100644 --- a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView.swift +++ b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerView.swift @@ -13,6 +13,9 @@ struct PhpVersionManagerView: View { @ObservedObject var formulae: BrewFormulaeObservable @ObservedObject var status: BusyStatus var handler: HandlesBrewPhpFormulae + var container: Container { + return App.shared.container + } init( formulae: BrewFormulaeObservable, @@ -71,7 +74,7 @@ struct PhpVersionManagerView: View { } // Finally, load PHP information - await PhpEnvironments.detectPhpVersions() + await container.phpEnvs.reloadPhpVersions() await self.handler.refreshPhpVersions(loadOutdated: false) await self.handler.refreshPhpVersions(loadOutdated: true) self.status.busy = false diff --git a/tests/unit/SwiftTestMigrated/Parsers/HomebrewUpgradableTest.swift b/tests/unit/SwiftTestMigrated/Parsers/HomebrewUpgradableTest.swift index 14132604..bebffabd 100644 --- a/tests/unit/SwiftTestMigrated/Parsers/HomebrewUpgradableTest.swift +++ b/tests/unit/SwiftTestMigrated/Parsers/HomebrewUpgradableTest.swift @@ -38,7 +38,7 @@ struct HomebrewUpgradableTest { // This config file assumes our PHP alias (`php`) is v8.2 PhpEnvironments.brewPhpAlias = "8.2" - let env = PhpEnvironments.shared + let env = App.shared.container.phpEnvs env.cachedPhpInstallations = [ "8.1": PhpInstallation("8.1.16"), "8.2": PhpInstallation("8.2.3"), diff --git a/tests/unit/Versions/PhpVersionDetectionTest.swift b/tests/unit/Versions/PhpVersionDetectionTest.swift index ddc1d63e..c2fe45e7 100644 --- a/tests/unit/Versions/PhpVersionDetectionTest.swift +++ b/tests/unit/Versions/PhpVersionDetectionTest.swift @@ -11,7 +11,7 @@ import XCTest class PhpVersionDetectionTest: XCTestCase { func test_can_detect_valid_php_versions() async throws { - let outcome = await PhpEnvironments.shared.extractPhpVersions( + let outcome = await App.shared.container.phpEnvs.extractPhpVersions( from: [ "", // empty lines should be omitted "php@8.0",