From 65223f348b9ca94753727917a41f8a3083714552 Mon Sep 17 00:00:00 2001 From: Nico Verbruggen Date: Thu, 16 Oct 2025 18:58:10 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Update=20ContainerAccess?= =?UTF-8?q?=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PHP Monitor.xcodeproj/project.pbxproj | 12 +++++-- .../xcschemes/PHP Monitor EAP.xcscheme | 4 +-- packages/container-macro/README.md | 9 ++--- .../Sources/ContainerMacro/Macros.swift | 7 ++-- .../ContainerAccessMacro.swift | 13 +------ phpmon/Common/Command/RealCommand.swift | 2 -- phpmon/Common/Core/Actions.swift | 12 ++++--- phpmon/Common/Core/Homebrew.swift | 4 +-- phpmon/Common/Helpers/Application.swift | 6 ++-- phpmon/Common/PHP/ActivePhpInstallation.swift | 14 ++++++-- phpmon/Common/PHP/Extensions/Xdebug.swift | 4 +-- .../PHP/PHP Version/PhpEnvironments.swift | 2 +- phpmon/Common/PHP/PhpInstallation.swift | 10 +++--- .../PHP/Switcher/InternalSwitcher.swift | 4 +-- phpmon/{ => Container}/Container+Fake.swift | 0 phpmon/{ => Container}/Container.swift | 5 ++- .../Domain/App/Services/ServicesManager.swift | 2 +- .../Composer/ComposerWindow.swift | 6 ++-- .../Behaviors/BrewPermissionFixer.swift | 2 +- .../Domain/Integrations/Homebrew/Brew.swift | 4 +-- .../Homebrew/BrewDiagnostics.swift | 22 +++++++----- .../Homebrew/BrewPhpFormulaeHandler.swift | 4 +-- .../InstallPhpExtensionCommand.swift | 2 +- .../RemovePhpExtensionCommand.swift | 8 ++--- .../ModifyPhpVersionCommand.swift | 16 ++++----- .../RemovePhpVersionCommand.swift | 4 +-- .../Packagist/ValetUpgrader.swift | 2 +- .../Valet/Domains/ValetInteractor.swift | 24 ++++++------- .../Valet/Scanners/ValetDomainScanner.swift | 10 +++--- .../Valet/Scanners/ValetScanners.swift | 2 +- .../Integrations/Valet/Sites/ValetSite.swift | 17 +++++---- phpmon/Domain/Integrations/Valet/Valet.swift | 21 ++++++----- phpmon/Domain/Menu/MainMenu+Actions.swift | 36 +++++++++---------- phpmon/Domain/Menu/MainMenu+FixMyValet.swift | 2 +- phpmon/Domain/Menu/MainMenu+Switcher.swift | 4 +-- phpmon/Domain/Menu/MainMenu.swift | 4 +++ phpmon/Domain/Menu/StatusMenu+Items.swift | 2 +- phpmon/Domain/Presets/Preset.swift | 4 +-- phpmon/Domain/Provision/InstallHomebrew.swift | 2 +- phpmon/Domain/Provision/ZshRunCommand.swift | 2 +- .../Domain List/UI/DomainListVC+Actions.swift | 2 +- .../PHP Doctor/Data/PhpConfigChecker.swift | 2 +- .../Data/WarningManager+Evaluations.swift | 4 +-- .../PhpVersionManagerWindowController.swift | 2 +- 44 files changed, 171 insertions(+), 149 deletions(-) rename phpmon/{ => Container}/Container+Fake.swift (100%) rename phpmon/{ => Container}/Container.swift (93%) diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index 04c5a05e..70614d4b 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -1422,6 +1422,15 @@ path = Provision; sourceTree = ""; }; + 03C099422EA156C100B76D43 /* Container */ = { + isa = PBXGroup; + children = ( + 0329A9A02E92A2A800A62A12 /* Container.swift */, + 031F247F2EA1071700CFB8D9 /* Container+Fake.swift */, + ); + path = Container; + sourceTree = ""; + }; 03D53E902E8AE089001B1671 /* Testables */ = { isa = PBXGroup; children = ( @@ -1615,8 +1624,7 @@ C41C1B3522B0097F00E7CF16 /* phpmon */ = { isa = PBXGroup; children = ( - 031F247F2EA1071700CFB8D9 /* Container+Fake.swift */, - 0329A9A02E92A2A800A62A12 /* Container.swift */, + 03C099422EA156C100B76D43 /* Container */, C4B5853A2770FE2500DA4FBE /* Common */, C41E181722CB61EB0072CF09 /* Domain */, 54D9E0BE27E4F5C0003B9AD9 /* Vendor */, diff --git a/PHP Monitor.xcodeproj/xcshareddata/xcschemes/PHP Monitor EAP.xcscheme b/PHP Monitor.xcodeproj/xcshareddata/xcschemes/PHP Monitor EAP.xcscheme index ab0bc594..480184db 100644 --- a/PHP Monitor.xcodeproj/xcshareddata/xcschemes/PHP Monitor EAP.xcscheme +++ b/PHP Monitor.xcodeproj/xcshareddata/xcschemes/PHP Monitor EAP.xcscheme @@ -30,7 +30,7 @@ codeCoverageEnabled = "YES"> URL { - try! filesystem.writeAtomicallyToFile("/tmp/phpmon_phpinfo.php", content: " /tmp/phpmon_phpinfo.html") + await container.shell.quiet("\(paths.binPath)/php-cgi -q /tmp/phpmon_phpinfo.php > /tmp/phpmon_phpinfo.html") return URL(string: "file:///private/tmp/phpmon_phpinfo.html")! } @@ -133,7 +137,7 @@ class Actions { extensions and/or run `composer global update`. */ public func fixMyValet() async { - await InternalSwitcher().performSwitch(to: PhpEnvironments.brewPhpAlias) + await InternalSwitcher(container).performSwitch(to: PhpEnvironments.brewPhpAlias) await brew(container, "services restart \(formulae.dnsmasq)", sudo: formulae.dnsmasq.elevated) await brew(container, "services restart \(formulae.php)", sudo: formulae.php.elevated) await brew(container, "services restart \(formulae.nginx)", sudo: formulae.nginx.elevated) diff --git a/phpmon/Common/Core/Homebrew.swift b/phpmon/Common/Core/Homebrew.swift index 4919eb81..bd41f805 100644 --- a/phpmon/Common/Core/Homebrew.swift +++ b/phpmon/Common/Core/Homebrew.swift @@ -12,11 +12,11 @@ import ContainerMacro @ContainerAccess struct HomebrewFormulae { var php: HomebrewFormula { - if phpEnvs.homebrewPackage == nil { + if container.phpEnvs.homebrewPackage == nil { return HomebrewFormula("php", elevated: true) } - guard let install = phpEnvs.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { return HomebrewFormula("php", elevated: true) } diff --git a/phpmon/Common/Helpers/Application.swift b/phpmon/Common/Helpers/Application.swift index a7685922..87df8ef4 100644 --- a/phpmon/Common/Helpers/Application.swift +++ b/phpmon/Common/Helpers/Application.swift @@ -36,19 +36,19 @@ class Application { (This will open the app if it isn't open yet.) */ @objc public func openDirectory(file: String) { - Task { await shell.quiet("/usr/bin/open -a \"\(name)\" \"\(file)\"") } + Task { await container.shell.quiet("/usr/bin/open -a \"\(name)\" \"\(file)\"") } } /** Checks if the app is installed. */ func isInstalled() async -> Bool { - let (process, output) = try! await shell.attach( + let (process, output) = try! await container.shell.attach( "/usr/bin/open -Ra \"\(name)\"", didReceiveOutput: { _, _ in }, withTimeout: 2.0 ) - if shell is TestableShell { + if container.shell is TestableShell { // When testing, check the error output (must not be empty) return !output.hasError } else { diff --git a/phpmon/Common/PHP/ActivePhpInstallation.swift b/phpmon/Common/PHP/ActivePhpInstallation.swift index 00795ecb..146baf07 100644 --- a/phpmon/Common/PHP/ActivePhpInstallation.swift +++ b/phpmon/Common/PHP/ActivePhpInstallation.swift @@ -74,7 +74,7 @@ class ActivePhpInstallation { post_max_size: getByteCount(key: "post_max_size") ) - let paths = shell + let paths = container.shell .sync("\(container.paths.php) --ini | grep -E -o '(/[^ ]+\\.ini)'").out .split(separator: "\n") .map { String($0) } @@ -92,7 +92,11 @@ class ActivePhpInstallation { _or_ if the output contains the word "Warning" or "Error". In normal situations this should not be the case. */ private func determineVersion() throws { - let output = command.execute(path: container.paths.phpConfig, arguments: ["--version"], trimNewlines: true) + let output = container.command.execute( + path: container.paths.phpConfig, + arguments: ["--version"], + trimNewlines: true + ) self.hasErrorState = (output == "" || output.contains("Warning") || output.contains("Error")) @@ -115,7 +119,11 @@ class ActivePhpInstallation { - Parameter key: The key of the `ini` value that needs to be retrieved. For example, you can use `memory_limit`. */ private func getByteCount(key: String) -> String { - let value = command.execute(path: container.paths.php, arguments: ["-r", "echo ini_get('\(key)');"], trimNewlines: false) + let value = container.command.execute( + path: container.paths.php, + arguments: ["-r", "echo ini_get('\(key)');"], + trimNewlines: false + ) // Check if the value is unlimited if value == "-1" { diff --git a/phpmon/Common/PHP/Extensions/Xdebug.swift b/phpmon/Common/PHP/Extensions/Xdebug.swift index 676c8a7b..ae77d919 100644 --- a/phpmon/Common/PHP/Extensions/Xdebug.swift +++ b/phpmon/Common/PHP/Extensions/Xdebug.swift @@ -13,11 +13,11 @@ import ContainerMacro @ContainerAccess class Xdebug { public var enabled: Bool { - return phpEnvs.getConfigFile(forKey: "xdebug.mode") != nil + return container.phpEnvs.getConfigFile(forKey: "xdebug.mode") != nil } public var activeModes: [String] { - guard let file = phpEnvs.getConfigFile(forKey: "xdebug.mode") else { + guard let file = container.phpEnvs.getConfigFile(forKey: "xdebug.mode") else { return [] } diff --git a/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift b/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift index 189194c7..ba328314 100644 --- a/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift +++ b/phpmon/Common/PHP/PHP Version/PhpEnvironments.swift @@ -134,7 +134,7 @@ class PhpEnvironments { but currently this is no longer needed. */ public static var switcher: PhpSwitcher { - return InternalSwitcher() + return InternalSwitcher(App.shared.container) } public func reloadPhpVersions() async { diff --git a/phpmon/Common/PHP/PhpInstallation.swift b/phpmon/Common/PHP/PhpInstallation.swift index 9fa7a203..e5723080 100644 --- a/phpmon/Common/PHP/PhpInstallation.swift +++ b/phpmon/Common/PHP/PhpInstallation.swift @@ -57,8 +57,8 @@ class PhpInstallation { } private func determineVersion(_ phpConfigExecutablePath: String, _ phpExecutablePath: String) { - if filesystem.fileExists(phpConfigExecutablePath) { - let longVersionString = command.execute( + if container.filesystem.fileExists(phpConfigExecutablePath) { + let longVersionString = container.command.execute( path: phpConfigExecutablePath, arguments: ["--version"], trimNewlines: false @@ -79,8 +79,8 @@ class PhpInstallation { } private func determineHealth(_ phpExecutablePath: String) { - if filesystem.fileExists(phpExecutablePath) { - let testCommand = command.execute( + if container.filesystem.fileExists(phpExecutablePath) { + let testCommand = container.command.execute( path: phpExecutablePath, arguments: ["-v"], trimNewlines: false, @@ -97,7 +97,7 @@ class PhpInstallation { } private func determineIniFiles(_ phpExecutablePath: String) { - let paths = shell + let paths = container.shell .sync("\(phpExecutablePath) --ini | grep -E -o '(/[^ ]+\\.ini)'").out .split(separator: "\n") .map { String($0) } diff --git a/phpmon/Common/PHP/Switcher/InternalSwitcher.swift b/phpmon/Common/PHP/Switcher/InternalSwitcher.swift index 2daf4896..b863c9b3 100644 --- a/phpmon/Common/PHP/Switcher/InternalSwitcher.swift +++ b/phpmon/Common/PHP/Switcher/InternalSwitcher.swift @@ -26,7 +26,7 @@ class InternalSwitcher: PhpSwitcher { let versions = getVersionsToBeHandled(version) await withTaskGroup(of: String.self, body: { group in - for available in phpEnvs.availablePhpVersions { + for available in container.phpEnvs.availablePhpVersions { group.addTask { await self.unlinkAndStopPhpVersion(available) return available @@ -103,7 +103,7 @@ class InternalSwitcher: PhpSwitcher { if Valet.enabled(feature: .isolatedSites) && primary { let socketVersion = version.replacingOccurrences(of: ".", with: "") - await shell.quiet("ln -sF ~/.config/valet/valet\(socketVersion).sock ~/.config/valet/valet.sock") + await container.shell.quiet("ln -sF ~/.config/valet/valet\(socketVersion).sock ~/.config/valet/valet.sock") Log.info("Symlinked new socket version (valet\(socketVersion).sock → valet.sock).") } } diff --git a/phpmon/Container+Fake.swift b/phpmon/Container/Container+Fake.swift similarity index 100% rename from phpmon/Container+Fake.swift rename to phpmon/Container/Container+Fake.swift diff --git a/phpmon/Container.swift b/phpmon/Container/Container.swift similarity index 93% rename from phpmon/Container.swift rename to phpmon/Container/Container.swift index 71cf4d72..5cfefdba 100644 --- a/phpmon/Container.swift +++ b/phpmon/Container/Container.swift @@ -7,14 +7,17 @@ // class Container { + // Core abstractions var shell: ShellProtocol! var filesystem: FileSystemProtocol! var command: CommandProtocol! + // Additional abstractions var paths: Paths! var phpEnvs: PhpEnvironments! - var favorites: Favorites! + + // TODO: Pending a rename var warningManager: WarningManager! init() {} diff --git a/phpmon/Domain/App/Services/ServicesManager.swift b/phpmon/Domain/App/Services/ServicesManager.swift index 67290c58..a3c722a6 100644 --- a/phpmon/Domain/App/Services/ServicesManager.swift +++ b/phpmon/Domain/App/Services/ServicesManager.swift @@ -36,7 +36,7 @@ class ServicesManager: ObservableObject { } var formulae: [HomebrewFormula] { - let f = HomebrewFormulae() + let f = HomebrewFormulae(container) var formulae = [ f.php, diff --git a/phpmon/Domain/Integrations/Composer/ComposerWindow.swift b/phpmon/Domain/Integrations/Composer/ComposerWindow.swift index 4b64b467..f92ddf24 100644 --- a/phpmon/Domain/Integrations/Composer/ComposerWindow.swift +++ b/phpmon/Domain/Integrations/Composer/ComposerWindow.swift @@ -30,7 +30,7 @@ import ContainerMacro return } - phpEnvs.isBusy = true + container.phpEnvs.isBusy = true window = TerminalProgressWindowController.display( title: "alert.composer_progress.title".localized, @@ -57,7 +57,7 @@ import ContainerMacro self.window?.addToConsole("\(command)\n") - let (process, _) = try await shell.attach( + let (process, _) = try await container.shell.attach( command, didReceiveOutput: { [weak self] (incoming, _) in guard let window = self?.window else { return } @@ -113,7 +113,7 @@ import ContainerMacro // MARK: Main Menu Update private func removeBusyStatus() { - phpEnvs.isBusy = false + container.phpEnvs.isBusy = false } // MARK: Alert diff --git a/phpmon/Domain/Integrations/Homebrew/Behaviors/BrewPermissionFixer.swift b/phpmon/Domain/Integrations/Homebrew/Behaviors/BrewPermissionFixer.swift index 15c3ebd3..d7080e3d 100644 --- a/phpmon/Domain/Integrations/Homebrew/Behaviors/BrewPermissionFixer.swift +++ b/phpmon/Domain/Integrations/Homebrew/Behaviors/BrewPermissionFixer.swift @@ -55,7 +55,7 @@ class BrewPermissionFixer { whether the Homebrew binary directory for the given PHP version is owned by root. */ private func determineBrokenFormulae() async { - let formulae = phpEnvs.cachedPhpInstallations.keys + let formulae = container.phpEnvs.cachedPhpInstallations.keys for formula in formulae { let realFormula = formula == PhpEnvironments.brewPhpAlias diff --git a/phpmon/Domain/Integrations/Homebrew/Brew.swift b/phpmon/Domain/Integrations/Homebrew/Brew.swift index ebe83f86..a60a6002 100644 --- a/phpmon/Domain/Integrations/Homebrew/Brew.swift +++ b/phpmon/Domain/Integrations/Homebrew/Brew.swift @@ -11,7 +11,7 @@ import ContainerMacro @ContainerAccess class Brew { - static let shared = Brew() + static let shared = Brew(App.shared.container) /// Formulae that can be observed. var formulae = BrewFormulaeObservable() @@ -21,7 +21,7 @@ class Brew { /// Determine which version of Homebrew is installed. public func determineVersion() async { - let output = await shell.pipe("\(container.paths.brew) --version") + let output = await container.shell.pipe("\(container.paths.brew) --version") self.version = try? VersionNumber.parse(output.out) if let version = version { diff --git a/phpmon/Domain/Integrations/Homebrew/BrewDiagnostics.swift b/phpmon/Domain/Integrations/Homebrew/BrewDiagnostics.swift index 45079a1c..786ae098 100644 --- a/phpmon/Domain/Integrations/Homebrew/BrewDiagnostics.swift +++ b/phpmon/Domain/Integrations/Homebrew/BrewDiagnostics.swift @@ -12,7 +12,11 @@ import ContainerMacro @ContainerAccess class BrewDiagnostics { - public static let shared = BrewDiagnostics() + public static let shared = BrewDiagnostics(App.shared.container) + + var filesystem: FileSystemProtocol { + return container.filesystem + } /** Determines the Homebrew taps the user has installed. @@ -23,7 +27,7 @@ class BrewDiagnostics { Load which taps are installed. */ public func loadInstalledTaps() async { - installedTaps = await shell + installedTaps = await container.shell .pipe("\(container.paths.brew) tap") .out .split(separator: "\n") @@ -123,7 +127,7 @@ class BrewDiagnostics { public func checkForValetMisconfiguration() async { Log.info("Checking for PHP-FPM issues with Valet...") - guard let install = phpEnvs.phpInstall else { + guard let install = container.phpEnvs.phpInstall else { Log.info("Will skip check for issues if no PHP version is linked.") return } @@ -132,7 +136,7 @@ class BrewDiagnostics { let primary = install.version.short // Versions to be handled - let switcher = InternalSwitcher() + let switcher = InternalSwitcher(container) for version in switcher.getVersionsToBeHandled(primary) where await switcher.ensureValetConfigurationIsValidForPhpVersion(version) { @@ -162,7 +166,7 @@ class BrewDiagnostics { Check if the alias conflict as documented in `checkForCaskConflict` actually occurred. */ private func hasAliasConflict() async -> Bool { - let tapAlias = await shell.pipe("brew info shivammathur/php/php --json").out + let tapAlias = await container.shell.pipe("brew info shivammathur/php/php --json").out if tapAlias.contains("brew tap shivammathur/php") || tapAlias.contains("Error") || tapAlias.isEmpty { Log.info("The user does not appear to have tapped: shivammathur/php") @@ -181,8 +185,10 @@ class BrewDiagnostics { + "This could be a problem!") Log.info("Determining whether both of these versions are installed...") - let bothInstalled = phpEnvs.availablePhpVersions.contains(tapPhp.version) - && phpEnvs.availablePhpVersions.contains(PhpEnvironments.brewPhpAlias) + let availablePhpVersions = container.phpEnvs.availablePhpVersions + + let bothInstalled = availablePhpVersions.contains(tapPhp.version) + && availablePhpVersions.contains(PhpEnvironments.brewPhpAlias) if bothInstalled { Log.warn("Both conflicting aliases seem to be installed, warning the user!") @@ -219,7 +225,7 @@ class BrewDiagnostics { If the JSON response cannot be parsed, Homebrew is probably out of date. */ public func cannotLoadService(_ name: String) async -> Bool { - let nginxJson = await shell + let nginxJson = await container.shell .pipe("sudo \(container.paths.brew) services info \(name) --json") .out diff --git a/phpmon/Domain/Integrations/Homebrew/BrewPhpFormulaeHandler.swift b/phpmon/Domain/Integrations/Homebrew/BrewPhpFormulaeHandler.swift index 3f8eb1c1..f6291d79 100644 --- a/phpmon/Domain/Integrations/Homebrew/BrewPhpFormulaeHandler.swift +++ b/phpmon/Domain/Integrations/Homebrew/BrewPhpFormulaeHandler.swift @@ -35,7 +35,7 @@ class BrewPhpFormulaeHandler: HandlesBrewPhpFormulae { \(container.paths.brew) outdated --json --formulae """ - let rawJsonText = await shell.pipe(command).out + let rawJsonText = await container.shell.pipe(command).out .data(using: .utf8)! outdated = try? JSONDecoder().decode( OutdatedFormulae.self, @@ -50,7 +50,7 @@ class BrewPhpFormulaeHandler: HandlesBrewPhpFormulae { var upgradeVersion: String? var isPrerelease: Bool = Constants.ExperimentalPhpVersions.contains(version) - if let install = phpEnvs.cachedPhpInstallations[version] { + if let install = container.phpEnvs.cachedPhpInstallations[version] { fullVersion = install.versionNumber.text fullVersion = install.isPreRelease ? "\(fullVersion!)-dev" : fullVersion diff --git a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift index b2f14e20..df57fb67 100644 --- a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift +++ b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/InstallPhpExtensionCommand.swift @@ -68,7 +68,7 @@ class InstallPhpExtensionCommand: BrewCommand { // Restart PHP-FPM if let installed = self.installing.first { - await Actions().restartPhpFpm(version: installed.phpVersion) + await Actions(container).restartPhpFpm(version: installed.phpVersion) } // Check which version of PHP are now installed diff --git a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/RemovePhpExtensionCommand.swift b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/RemovePhpExtensionCommand.swift index 07ae992d..2d895800 100644 --- a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/RemovePhpExtensionCommand.swift +++ b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Extensions/RemovePhpExtensionCommand.swift @@ -31,7 +31,7 @@ class RemovePhpExtensionCommand: BrewCommand { )) // Keep track of the file that contains the information about the extension - let existing = phpEnvs + let existing = container.phpEnvs .cachedPhpInstallations[phpExtension.phpVersion]? .extensions.first(where: { ext in ext.name == phpExtension.name @@ -64,9 +64,9 @@ class RemovePhpExtensionCommand: BrewCommand { await performExtensionCleanup(for: ext) } - _ = await phpEnvs.detectPhpVersions() + _ = await container.phpEnvs.detectPhpVersions() - await Actions().restartPhpFpm(version: phpExtension.phpVersion) + await Actions(container).restartPhpFpm(version: phpExtension.phpVersion) await MainMenu.shared.refreshActiveInstallation() @@ -81,7 +81,7 @@ class RemovePhpExtensionCommand: BrewCommand { // The extension's default configuration file can be removed Log.info("The extension was found in a default extension .ini location. Purging that .ini file.") do { - try filesystem.remove(ext.file) + try container.filesystem.remove(ext.file) } catch { Log.err("The file `\(ext.file)` could not be removed.") } diff --git a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/ModifyPhpVersionCommand.swift b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/ModifyPhpVersionCommand.swift index 8379e394..84b0eff3 100644 --- a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/ModifyPhpVersionCommand.swift +++ b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/ModifyPhpVersionCommand.swift @@ -71,11 +71,11 @@ class ModifyPhpVersionCommand: BrewCommand { } else { // Simply upgrade `php` to the latest version try await self.upgradeMainPhpFormula(unavailable!, onProgress) - await phpEnvs.determinePhpAlias() + await container.phpEnvs.determinePhpAlias() } // Re-check the installed versions - _ = await phpEnvs.detectPhpVersions() + _ = await container.phpEnvs.detectPhpVersions() // After performing operations, attempt to run repairs if needed try await self.repairBrokenPackages(onProgress) @@ -103,7 +103,7 @@ class ModifyPhpVersionCommand: BrewCommand { """ // Run the upgrade command - try await run(shell: shell, command, onProgress) + try await run(shell: container.shell, command, onProgress) } private func upgradePackages(_ onProgress: @escaping (BrewCommandProgress) -> Void) async throws { @@ -119,7 +119,7 @@ class ModifyPhpVersionCommand: BrewCommand { \(container.paths.brew) upgrade \(self.upgrading.map { $0.name }.joined(separator: " ")) """ - try await run(shell: shell, command, onProgress) + try await run(shell: container.shell, command, onProgress) } private func installPackages(_ onProgress: @escaping (BrewCommandProgress) -> Void) async throws { @@ -134,13 +134,13 @@ class ModifyPhpVersionCommand: BrewCommand { \(container.paths.brew) install \(self.installing.map { $0.name }.joined(separator: " ")) --force """ - try await run(shell: shell, command, onProgress) + try await run(shell: container.shell, command, onProgress) } private func repairBrokenPackages(_ onProgress: @escaping (BrewCommandProgress) -> Void) async throws { // Determine which PHP installations are considered unhealthy // Build a list of formulae to reinstall - let requiringRepair = phpEnvs + let requiringRepair = container.phpEnvs .cachedPhpInstallations.values .filter({ !$0.isHealthy }) .map { installation in @@ -166,7 +166,7 @@ class ModifyPhpVersionCommand: BrewCommand { \(container.paths.brew) reinstall \(requiringRepair.joined(separator: " ")) --force """ - try await run(shell: shell, command, onProgress) + try await run(shell: container.shell, command, onProgress) } private func completedOperations(_ onProgress: @escaping (BrewCommandProgress) -> Void) async { @@ -177,7 +177,7 @@ class ModifyPhpVersionCommand: BrewCommand { await BrewDiagnostics.shared.checkForOutdatedPhpInstallationSymlinks() // Check which version of PHP are now installed - _ = await phpEnvs.detectPhpVersions() + _ = await container.phpEnvs.detectPhpVersions() // Keep track of the currently installed version await MainMenu.shared.refreshActiveInstallation() diff --git a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/RemovePhpVersionCommand.swift b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/RemovePhpVersionCommand.swift index 0dc44f06..a9ff6d69 100644 --- a/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/RemovePhpVersionCommand.swift +++ b/phpmon/Domain/Integrations/Homebrew/Commands/PHP Versions/RemovePhpVersionCommand.swift @@ -46,7 +46,7 @@ class RemovePhpVersionCommand: BrewCommand { """ do { - try await BrewPermissionFixer().fixPermissions() + try await BrewPermissionFixer(container).fixPermissions() } catch { return } @@ -67,7 +67,7 @@ class RemovePhpVersionCommand: BrewCommand { if process.terminationStatus <= 0 { onProgress(.create(value: 0.95, title: getCommandTitle(), description: "phpman.steps.reloading".localized)) - _ = await phpEnvs.detectPhpVersions() + _ = await container.phpEnvs.detectPhpVersions() await MainMenu.shared.refreshActiveInstallation() diff --git a/phpmon/Domain/Integrations/Packagist/ValetUpgrader.swift b/phpmon/Domain/Integrations/Packagist/ValetUpgrader.swift index 4850040c..ef6b3247 100644 --- a/phpmon/Domain/Integrations/Packagist/ValetUpgrader.swift +++ b/phpmon/Domain/Integrations/Packagist/ValetUpgrader.swift @@ -62,7 +62,7 @@ class ValetUpgrader { } @MainActor private static func upgradeValet() { - ComposerWindow().updateGlobalDependencies( + ComposerWindow(App.shared.container).updateGlobalDependencies( notify: true, completion: { success in if success { diff --git a/phpmon/Domain/Integrations/Valet/Domains/ValetInteractor.swift b/phpmon/Domain/Integrations/Valet/Domains/ValetInteractor.swift index 5a65c0d5..a402530c 100644 --- a/phpmon/Domain/Integrations/Valet/Domains/ValetInteractor.swift +++ b/phpmon/Domain/Integrations/Valet/Domains/ValetInteractor.swift @@ -16,20 +16,20 @@ struct ValetInteractionError: Error { @ContainerAccess class ValetInteractor { - static var shared = ValetInteractor() + static var shared = ValetInteractor(App.shared.container) public static func useFake() { - ValetInteractor.shared = FakeValetInteractor() + ValetInteractor.shared = FakeValetInteractor(App.shared.container) } // MARK: - Managing Domains public func link(path: String, domain: String) async throws { - await shell.quiet("cd '\(path)' && \(container.paths.valet) link '\(domain)' && valet links") + await container.shell.quiet("cd '\(path)' && \(container.paths.valet) link '\(domain)' && valet links") } public func unlink(site: ValetSite) async throws { - await shell.quiet("valet unlink '\(site.name)'") + await container.shell.quiet("valet unlink '\(site.name)'") } public func proxy(domain: String, proxy: String, secure: Bool) async throws { @@ -37,12 +37,12 @@ class ValetInteractor { ? "\(container.paths.valet) proxy \(domain) \(proxy) --secure" : "\(container.paths.valet) proxy \(domain) \(proxy)" - await shell.quiet(command) - await Actions().restartNginx() + await container.shell.quiet(command) + await Actions(container).restartNginx() } public func remove(proxy: ValetProxy) async throws { - await shell.quiet("valet unproxy '\(proxy.domain)'") + await container.shell.quiet("valet unproxy '\(proxy.domain)'") } // MARK: - Modifying Domains @@ -64,7 +64,7 @@ class ValetInteractor { } // Run the command - await shell.quiet(command) + await container.shell.quiet(command) // Check if the secured status has actually changed site.determineSecured() @@ -89,7 +89,7 @@ class ValetInteractor { // Run the commands for command in commands { - await shell.quiet(command) + await container.shell.quiet(command) } // Check if the secured status has actually changed @@ -101,14 +101,14 @@ class ValetInteractor { } // Restart nginx to load the new configuration - await Actions().restartNginx() + await Actions(container).restartNginx() } public func isolate(site: ValetSite, version: String) async throws { let command = "sudo \(container.paths.valet) isolate php@\(version) --site '\(site.name)'" // Run the command - await shell.quiet(command) + await container.shell.quiet(command) // Check if the secured status has actually changed site.determineIsolated() @@ -124,7 +124,7 @@ class ValetInteractor { let command = "sudo \(container.paths.valet) unisolate --site '\(site.name)'" // Run the command - await shell.quiet(command) + await container.shell.quiet(command) // Check if the secured status has actually changed site.determineIsolated() diff --git a/phpmon/Domain/Integrations/Valet/Scanners/ValetDomainScanner.swift b/phpmon/Domain/Integrations/Valet/Scanners/ValetDomainScanner.swift index f3948348..e2af6a83 100644 --- a/phpmon/Domain/Integrations/Valet/Scanners/ValetDomainScanner.swift +++ b/phpmon/Domain/Integrations/Valet/Scanners/ValetDomainScanner.swift @@ -17,7 +17,7 @@ class ValetDomainScanner: DomainScanner { func resolveSiteCount(paths: [String]) -> Int { return paths.map { path in do { - let entries = try filesystem + let entries = try container.filesystem .getShallowContentsOfDirectory(path) return entries @@ -37,7 +37,7 @@ class ValetDomainScanner: DomainScanner { paths.forEach { path in do { - let entries = try filesystem + let entries = try container.filesystem .getShallowContentsOfDirectory(path) return entries.forEach { @@ -61,7 +61,7 @@ class ValetDomainScanner: DomainScanner { // Get the TLD from the global Valet object let tld = Valet.shared.config.tld - if !filesystem.anyExists(path) { + if !container.filesystem.anyExists(path) { Log.warn("Could not parse the site: \(path), skipping!") } @@ -71,9 +71,9 @@ class ValetDomainScanner: DomainScanner { return nil } - if filesystem.isSymlink(path) { + if container.filesystem.isSymlink(path) { return ValetSite(container, aliasPath: path, tld: tld) - } else if filesystem.isDirectory(path) { + } else if container.filesystem.isDirectory(path) { return ValetSite(container, absolutePath: path, tld: tld) } diff --git a/phpmon/Domain/Integrations/Valet/Scanners/ValetScanners.swift b/phpmon/Domain/Integrations/Valet/Scanners/ValetScanners.swift index 501ce6c0..2f155d61 100644 --- a/phpmon/Domain/Integrations/Valet/Scanners/ValetScanners.swift +++ b/phpmon/Domain/Integrations/Valet/Scanners/ValetScanners.swift @@ -10,7 +10,7 @@ import Foundation class ValetScanner { - static var active: DomainScanner = ValetDomainScanner() + static var active: DomainScanner = ValetDomainScanner(App.shared.container) public static func useFake() { ValetScanner.active = FakeDomainScanner() diff --git a/phpmon/Domain/Integrations/Valet/Sites/ValetSite.swift b/phpmon/Domain/Integrations/Valet/Sites/ValetSite.swift index 2c2f3dfb..3cbc2e61 100644 --- a/phpmon/Domain/Integrations/Valet/Sites/ValetSite.swift +++ b/phpmon/Domain/Integrations/Valet/Sites/ValetSite.swift @@ -58,7 +58,7 @@ class ValetSite: ValetListable { /// Which version of PHP is actually used to serve this site. var servingPhpVersion: String { return self.isolatedPhpVersion?.versionNumber.short - ?? phpEnvs.phpInstall?.version.short + ?? container.phpEnvs.phpInstall?.version.short ?? "???" } @@ -107,12 +107,12 @@ class ValetSite: ValetListable { */ public func determineIsolated() { if let version = ValetSite.isolatedVersion(container, "~/.config/valet/Nginx/\(self.name).\(self.tld)") { - if !phpEnvs.cachedPhpInstallations.keys.contains(version) { + if !container.phpEnvs.cachedPhpInstallations.keys.contains(version) { Log.err("The PHP version \(version) is isolated for the site \(self.name) " + "but that PHP version is unavailable.") return } - self.isolatedPhpVersion = phpEnvs.cachedPhpInstallations[version] + self.isolatedPhpVersion = container.phpEnvs.cachedPhpInstallations[version] } else { self.isolatedPhpVersion = nil } @@ -123,7 +123,10 @@ class ValetSite: ValetListable { - Note: The file is not validated, only its presence is checked. */ public func determineSecured() { - secured = filesystem.fileExists("~/.config/valet/Certificates/\(self.name).\(self.tld).key") + secured = container.filesystem + .fileExists("~/.config/valet/Certificates/\(self.name).\(self.tld).key") + + // TODO: Also verify the certificate hasn't expired } /** @@ -185,7 +188,7 @@ class ValetSite: ValetListable { let path = "\(absolutePath)/composer.json" do { - if filesystem.fileExists(path) { + if container.filesystem.fileExists(path) { let decoded = try JSONDecoder().decode( ComposerJson.self, from: String( @@ -216,7 +219,7 @@ class ValetSite: ValetListable { for (suffix, source) in files { do { let path = "\(absolutePath)/\(suffix)" - if filesystem.fileExists(path) { + if container.filesystem.fileExists(path) { return try self.handleValetFile(path, source) } } catch { @@ -253,7 +256,7 @@ class ValetSite: ValetListable { return } - guard let linked = phpEnvs.phpInstall else { + guard let linked = container.phpEnvs.phpInstall else { self.isCompatibleWithPreferredPhpVersion = false return } diff --git a/phpmon/Domain/Integrations/Valet/Valet.swift b/phpmon/Domain/Integrations/Valet/Valet.swift index 189a27bb..05a23a2f 100644 --- a/phpmon/Domain/Integrations/Valet/Valet.swift +++ b/phpmon/Domain/Integrations/Valet/Valet.swift @@ -68,8 +68,8 @@ class Valet { } lazy var installed: Bool = { - return filesystem.fileExists(container.paths.binPath.appending("/valet")) - && filesystem.anyExists("~/.config/valet") + return container.filesystem.fileExists(container.paths.binPath.appending("/valet")) + && container.filesystem.anyExists("~/.config/valet") }() /** @@ -92,7 +92,7 @@ class Valet { and the app cannot start. */ public func updateVersionNumber() async { - let output = await shell.pipe("valet --version").out + let output = await container.shell.pipe("valet --version").out // Failure condition #1: does not contain Laravel Valet if !output.contains("Laravel Valet") { @@ -122,7 +122,9 @@ class Valet { do { config = try JSONDecoder().decode( Valet.Configuration.self, - from: filesystem.getStringFromFile("~/.config/valet/config.json").data(using: .utf8)! + from: container.filesystem + .getStringFromFile("~/.config/valet/config.json") + .data(using: .utf8)! ) } catch { Log.err(error) @@ -186,7 +188,7 @@ class Valet { return } - if phpEnvs.phpInstall == nil { + if container.phpEnvs.phpInstall == nil { Log.info("Cannot validate Valet version if no PHP version is linked.") return } @@ -209,7 +211,7 @@ class Valet { Determine if any platform issues are detected when running `valet --version`. */ public func hasPlatformIssues() async -> Bool { - return await shell.pipe("valet --version") + return await container.shell.pipe("valet --version") .out.contains("Composer detected issues in your platform") } @@ -243,7 +245,7 @@ class Valet { that means that Valet won't work properly. */ func phpFpmConfigurationValid() async -> Bool { - guard let version = phpEnvs.currentInstall?.version else { + guard let version = container.phpEnvs.currentInstall?.version else { Log.info("Cannot check PHP-FPM status: no version of PHP is active") return true } @@ -251,12 +253,13 @@ class Valet { if version.short == "5.6" { // The main PHP config file should contain `valet.sock` and then we're probably fine? let fileName = "\(container.paths.etcPath)/php/5.6/php-fpm.conf" - return await shell.pipe("cat \(fileName)").out + return await container.shell.pipe("cat \(fileName)").out .contains("valet.sock") } // Make sure to check if valet-fpm.conf exists. If it does, we should be fine :) - return filesystem.fileExists("\(container.paths.etcPath)/php/\(version.short)/php-fpm.d/valet-fpm.conf") + return container.filesystem + .fileExists("\(container.paths.etcPath)/php/\(version.short)/php-fpm.d/valet-fpm.conf") } /** diff --git a/phpmon/Domain/Menu/MainMenu+Actions.swift b/phpmon/Domain/Menu/MainMenu+Actions.swift index aabad67b..139bb6e4 100644 --- a/phpmon/Domain/Menu/MainMenu+Actions.swift +++ b/phpmon/Domain/Menu/MainMenu+Actions.swift @@ -14,7 +14,7 @@ extension MainMenu { @MainActor @objc func linkPhpBinary() { Task { - await Actions().linkPhp() + await actions.linkPhp() } } @@ -45,7 +45,7 @@ extension MainMenu { } asyncExecution { - try Actions().fixHomebrewPermissions() + try self.actions.fixHomebrewPermissions() } success: { NVAlert() .withInformation( @@ -62,27 +62,27 @@ extension MainMenu { @objc func restartPhpFpm() { Task { // Simple restart service - await Actions().restartPhpFpm() + await actions.restartPhpFpm() } } @objc func restartNginx() { Task { // Simple restart service - await Actions().restartNginx() + await actions.restartNginx() } } @objc func restartDnsMasq() { Task { // Simple restart service - await Actions().restartDnsMasq() + await actions.restartDnsMasq() } } @MainActor @objc func restartValetServices() { Task { // Restart services and show notification - await Actions().restartDnsMasq() - await Actions().restartPhpFpm() - await Actions().restartNginx() + await actions.restartDnsMasq() + await actions.restartPhpFpm() + await actions.restartNginx() LocalNotification.send( title: "notification.services_restarted".localized, @@ -94,7 +94,7 @@ extension MainMenu { @MainActor @objc func stopValetServices() { Task { // Stop services and show notification - await Actions().stopValetServices() + await actions.stopValetServices() LocalNotification.send( title: "notification.services_stopped".localized, @@ -129,7 +129,7 @@ extension MainMenu { } do { - var modes = Xdebug().activeModes + var modes = Xdebug(container).activeModes if let index = modes.firstIndex(of: sender.mode) { modes.remove(at: index) @@ -157,7 +157,7 @@ extension MainMenu { await sender.phpExtension?.toggle() if Preferences.isEnabled(.autoServiceRestartAfterExtensionToggle) { - await Actions().restartPhpFpm() + await actions.restartPhpFpm() } } } @@ -212,14 +212,14 @@ extension MainMenu { @objc func openPhpInfo() { asyncWithBusyUI { Task { // Create temporary file and open the URL - let url = await Actions().createTempPhpInfoFile() + let url = await self.actions.createTempPhpInfoFile() NSWorkspace.shared.open(url) } } } @MainActor @objc func updateGlobalComposerDependencies() { - ComposerWindow().updateGlobalDependencies( + ComposerWindow(container).updateGlobalDependencies( notify: true, completion: { _ in } ) @@ -232,23 +232,23 @@ extension MainMenu { } if install.hasErrorState { - Actions().openGenericPhpConfigFolder() + actions.openGenericPhpConfigFolder() return } - Actions().openPhpConfigFolder(version: install.version.short) + actions.openPhpConfigFolder(version: install.version.short) } @objc func openPhpMonitorConfigurationFile() { - Actions().openPhpMonitorConfigFile() + actions.openPhpMonitorConfigFile() } @objc func openGlobalComposerFolder() { - Actions().openGlobalComposerFolder() + actions.openGlobalComposerFolder() } @objc func openValetConfigFolder() { - Actions().openValetConfigFolder() + actions.openValetConfigFolder() } @objc func switchToPhpVersion(sender: PhpMenuItem) { diff --git a/phpmon/Domain/Menu/MainMenu+FixMyValet.swift b/phpmon/Domain/Menu/MainMenu+FixMyValet.swift index a61fb5a7..a445cda0 100644 --- a/phpmon/Domain/Menu/MainMenu+FixMyValet.swift +++ b/phpmon/Domain/Menu/MainMenu+FixMyValet.swift @@ -33,7 +33,7 @@ extension MainMenu { } Task { @MainActor in - await Actions().fixMyValet() + await Actions(container).fixMyValet() if previousVersion == PhpEnvironments.brewPhpAlias || previousVersion == nil { self.presentAlertForSameVersion() diff --git a/phpmon/Domain/Menu/MainMenu+Switcher.swift b/phpmon/Domain/Menu/MainMenu+Switcher.swift index 174216e4..1221964a 100644 --- a/phpmon/Domain/Menu/MainMenu+Switcher.swift +++ b/phpmon/Domain/Menu/MainMenu+Switcher.swift @@ -38,7 +38,7 @@ extension MainMenu { // Run composer updates if Preferences.isEnabled(.autoComposerGlobalUpdateAfterSwitch) { - ComposerWindow().updateGlobalDependencies( + ComposerWindow(App.shared.container).updateGlobalDependencies( notify: false, completion: { _ in self.notifyAboutVersionChange(to: version) @@ -99,7 +99,7 @@ extension MainMenu { .withPrimary(text: "alert.global_composer_platform_issues.buttons.update".localized, action: { alert in alert.close(with: .OK) Log.info("The user has chosen to update global dependencies.") - ComposerWindow().updateGlobalDependencies( + ComposerWindow(App.shared.container).updateGlobalDependencies( notify: true, completion: { success in Log.info("Dependencies updated successfully: \(success)") diff --git a/phpmon/Domain/Menu/MainMenu.swift b/phpmon/Domain/Menu/MainMenu.swift index baf3d9e6..284986c3 100644 --- a/phpmon/Domain/Menu/MainMenu.swift +++ b/phpmon/Domain/Menu/MainMenu.swift @@ -14,6 +14,10 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate return App.shared.container } + var actions: Actions { + return Actions(container) + } + static let shared = MainMenu() override init() { diff --git a/phpmon/Domain/Menu/StatusMenu+Items.swift b/phpmon/Domain/Menu/StatusMenu+Items.swift index 0b222838..4b7c3c82 100644 --- a/phpmon/Domain/Menu/StatusMenu+Items.swift +++ b/phpmon/Domain/Menu/StatusMenu+Items.swift @@ -275,7 +275,7 @@ extension StatusMenu { // MARK: - Xdebug @MainActor func addXdebugMenuItem() { - let xdebug = Xdebug() + let xdebug = Xdebug(container) if !xdebug.enabled { addItem(NSMenuItem.separator()) diff --git a/phpmon/Domain/Presets/Preset.swift b/phpmon/Domain/Presets/Preset.swift index 01655395..61f2fb3e 100644 --- a/phpmon/Domain/Presets/Preset.swift +++ b/phpmon/Domain/Presets/Preset.swift @@ -83,7 +83,7 @@ struct Preset: Codable, Equatable { if self.version != nil { if await !switchToPhpVersionIfValid() { PresetHelper.rollbackPreset = nil - await Actions().restartPhpFpm() + await Actions(container).restartPhpFpm() return } } @@ -111,7 +111,7 @@ struct Preset: Codable, Equatable { PresetHelper.loadRollbackPresetFromFile() // Restart PHP FPM process (also reloads menu, which will show the preset rollback) - await Actions().restartPhpFpm() + await Actions(container).restartPhpFpm() Task { @MainActor in // Show the correct notification diff --git a/phpmon/Domain/Provision/InstallHomebrew.swift b/phpmon/Domain/Provision/InstallHomebrew.swift index 52dd4dcb..7ca7c5d6 100644 --- a/phpmon/Domain/Provision/InstallHomebrew.swift +++ b/phpmon/Domain/Provision/InstallHomebrew.swift @@ -16,7 +16,7 @@ class InstallHomebrew { "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" """ - _ = try await shell.attach(script, didReceiveOutput: { (string: String, _: ShellStream) in + _ = try await container.shell.attach(script, didReceiveOutput: { (string: String, _: ShellStream) in print(string) }, withTimeout: 60 * 10) } diff --git a/phpmon/Domain/Provision/ZshRunCommand.swift b/phpmon/Domain/Provision/ZshRunCommand.swift index b2bcdc62..7b9dcc83 100644 --- a/phpmon/Domain/Provision/ZshRunCommand.swift +++ b/phpmon/Domain/Provision/ZshRunCommand.swift @@ -14,7 +14,7 @@ class ZshRunCommand { Adds a given line to .zshrc, which may be needed to adjust the PATH. */ private func add(_ text: String) async -> Bool { - let outcome = await shell.pipe(""" + let outcome = await container.shell.pipe(""" touch ~/.zshrc && \ grep -qxF '\(text)' ~/.zshrc \ || echo '\n\n\(text)\n' >> ~/.zshrc diff --git a/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift b/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift index 3ad10bad..46a7168d 100644 --- a/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift +++ b/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift @@ -141,7 +141,7 @@ extension DomainListVC { await sender.phpExtension?.toggle() if Preferences.isEnabled(.autoServiceRestartAfterExtensionToggle) { - await Actions().restartPhpFpm() + await Actions(container).restartPhpFpm() } reloadContextMenu() diff --git a/phpmon/Modules/PHP Doctor/Data/PhpConfigChecker.swift b/phpmon/Modules/PHP Doctor/Data/PhpConfigChecker.swift index 7f5875d6..3009d9ca 100644 --- a/phpmon/Modules/PHP Doctor/Data/PhpConfigChecker.swift +++ b/phpmon/Modules/PHP Doctor/Data/PhpConfigChecker.swift @@ -16,7 +16,7 @@ struct FileExistenceCheck { @ContainerAccess class PhpConfigChecker { - public static var shared = PhpConfigChecker() + public static var shared = PhpConfigChecker(App.shared.container) var missing: [String] = [] diff --git a/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift b/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift index 1c49f8f8..98ca3f71 100644 --- a/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift +++ b/phpmon/Modules/PHP Doctor/Data/WarningManager+Evaluations.swift @@ -36,7 +36,7 @@ extension WarningManager { url: "https://github.com/nicoverbruggen/phpmon/wiki/PHP-Monitor-helper-binaries", fix: self.container.paths.shell == "/bin/zsh" ? { // Add to PATH - await ZshRunCommand().addPhpMonitorPath() + await ZshRunCommand(self.container).addPhpMonitorPath() // Finally, perform environment checks again await self.checkEnvironment() } : nil @@ -44,7 +44,7 @@ extension WarningManager { Warning( command: { self.container.phpEnvs.currentInstall?.extensions.contains { $0.name == "xdebug" } ?? false - && !Xdebug().enabled + && !Xdebug(self.container).enabled }, name: "Missing configuration file for `xdebug.mode`", title: "warnings.xdebug_conf_missing.title", diff --git a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerWindowController.swift b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerWindowController.swift index 698b0d60..e0bf31fe 100644 --- a/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerWindowController.swift +++ b/phpmon/Modules/PHP Version Manager/UI/PhpVersionManagerWindowController.swift @@ -25,7 +25,7 @@ class PhpVersionManagerWindowController: PMWindowController { windowController.window = NSWindow() windowController.view = PhpVersionManagerView( formulae: Brew.shared.formulae, - handler: BrewPhpFormulaeHandler() + handler: BrewPhpFormulaeHandler(App.shared.container) ) guard let window = windowController.window else { return }