diff --git a/PHP Monitor.xcodeproj/project.pbxproj b/PHP Monitor.xcodeproj/project.pbxproj index c89c547..def7010 100644 --- a/PHP Monitor.xcodeproj/project.pbxproj +++ b/PHP Monitor.xcodeproj/project.pbxproj @@ -159,6 +159,8 @@ C4D5CFCB27E0F9CD00035329 /* NginxConfigParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D5CFC927E0F9CD00035329 /* NginxConfigParser.swift */; }; C4D8016622B1584700C6DA1B /* Startup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D8016522B1584700C6DA1B /* Startup.swift */; }; C4D89BC62783C99400A02B68 /* ComposerJson.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D89BC52783C99400A02B68 /* ComposerJson.swift */; }; + C4D936C927E3EB6100BD69FE /* PhpHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D936C827E3EB6100BD69FE /* PhpHelper.swift */; }; + C4D936CA27E3EB6100BD69FE /* PhpHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D936C827E3EB6100BD69FE /* PhpHelper.swift */; }; C4D9ADBF277610E1007277F4 /* PhpSwitcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9ADBE277610E1007277F4 /* PhpSwitcher.swift */; }; C4D9ADC0277610E1007277F4 /* PhpSwitcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9ADBE277610E1007277F4 /* PhpSwitcher.swift */; }; C4D9ADC8277611A0007277F4 /* InternalSwitcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9ADC7277611A0007277F4 /* InternalSwitcher.swift */; }; @@ -324,6 +326,7 @@ C4D5CFC927E0F9CD00035329 /* NginxConfigParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NginxConfigParser.swift; sourceTree = ""; }; C4D8016522B1584700C6DA1B /* Startup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Startup.swift; sourceTree = ""; }; C4D89BC52783C99400A02B68 /* ComposerJson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerJson.swift; sourceTree = ""; }; + C4D936C827E3EB6100BD69FE /* PhpHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpHelper.swift; sourceTree = ""; }; C4D9ADBE277610E1007277F4 /* PhpSwitcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpSwitcher.swift; sourceTree = ""; }; C4D9ADC7277611A0007277F4 /* InternalSwitcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalSwitcher.swift; sourceTree = ""; }; C4DEB7D327A5D60B00834718 /* Stats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Stats.swift; sourceTree = ""; }; @@ -606,6 +609,7 @@ children = ( C40C7F1D2772136000DDDCDC /* PhpEnv.swift */, C48D6C6F279CD2AC00F26D7E /* PhpVersionNumber.swift */, + C4D936C827E3EB6100BD69FE /* PhpHelper.swift */, ); path = "PHP Version"; sourceTree = ""; @@ -993,6 +997,7 @@ C4D9ADC8277611A0007277F4 /* InternalSwitcher.swift in Sources */, C4080FFA27BD956700BF2C6B /* BetterAlertVC.swift in Sources */, C4B5635E276AB09000F12CCB /* VersionExtractor.swift in Sources */, + C4D936C927E3EB6100BD69FE /* PhpHelper.swift in Sources */, C47331A2247093B7009A0597 /* StatusMenu.swift in Sources */, C44067F927E2585E0045BD4E /* SiteListTypeCell.swift in Sources */, C4C3ED412783497000AB15D8 /* MainMenu+Startup.swift in Sources */, @@ -1065,6 +1070,7 @@ C4CE3BBB27B324230086CA49 /* MainMenu+Switcher.swift in Sources */, C4F7809C25D80344000DBC97 /* CommandTest.swift in Sources */, C44CCD4127AFE2FC00CE40E5 /* AlertableError.swift in Sources */, + C4D936CA27E3EB6100BD69FE /* PhpHelper.swift in Sources */, C4F780BA25D80B62000DBC97 /* AppDelegate.swift in Sources */, 54FCFD31276C8DA4004CE748 /* HotkeyPreferenceView.swift in Sources */, C4998F0B2617633900B2526E /* PrefsWC.swift in Sources */, diff --git a/phpmon/Common/PHP/PHP Version/PhpEnv.swift b/phpmon/Common/PHP/PHP Version/PhpEnv.swift index 942981f..f7c4a3f 100644 --- a/phpmon/Common/PHP/PHP Version/PhpEnv.swift +++ b/phpmon/Common/PHP/PHP Version/PhpEnv.swift @@ -153,42 +153,7 @@ class PhpEnv { private func writeHelpers(with versions: [String]) { for version in versions { - do { - let resolve = "\(Paths.optPath)/php@\(version)/bin" - let path = URL(fileURLWithPath: resolve).resolvingSymlinksInPath().path - let dotless = version.replacingOccurrences(of: ".", with: "") - try! FileManager.default.createDirectory( - at: URL(fileURLWithPath: "/Users/\(Paths.whoami)/.local/phpmon"), - withIntermediateDirectories: true - ) - let sourcePath = "/Users/\(Paths.whoami)/.local/phpmon/source_php\(dotless)" - let source = """ - export PATH=\(path):$PATH - """ - try source.write( - to: URL(fileURLWithPath: sourcePath), - atomically: true, - encoding: String.Encoding.utf8 - ) - let script = """ - #!/bin/zsh - [[ $ZSH_EVAL_CONTEXT =~ :file$ ]] \\ - && echo "PHP Monitor has enabled this terminal to use PHP \(version)." \\ - || echo "You must run '. pm\(dotless)' (or 'source pm\(dotless)') instead!"; - source ~/.local/phpmon/source_php\(dotless); - """ - let alias = "/usr/local/bin/pm\(dotless)" - try script.write( - to: URL(fileURLWithPath: alias), - atomically: true, - encoding: String.Encoding.utf8 - ) - Shell.run("chmod +x \(sourcePath)") - Shell.run("chmod +x \(path)") - } catch { - print(error) - Log.err("Could not write PHP Monitor helper for PHP \(version) to /usr/local/bin") - } + PhpHelper.generate(for: version) } } diff --git a/phpmon/Common/PHP/PHP Version/PhpHelper.swift b/phpmon/Common/PHP/PHP Version/PhpHelper.swift new file mode 100644 index 0000000..a60ac7d --- /dev/null +++ b/phpmon/Common/PHP/PHP Version/PhpHelper.swift @@ -0,0 +1,60 @@ +// +// PhpHelper.swift +// PHP Monitor +// +// Created by Nico Verbruggen on 17/03/2022. +// Copyright © 2022 Nico Verbruggen. All rights reserved. +// + +import Foundation + +class PhpHelper { + + static let keyPhrase = "This file was automatically generated by PHP Monitor." + + public static func generate(for version: String) { + // Take the PHP version (e.g. "7.2") and generate a dotless version + let dotless = version.replacingOccurrences(of: ".", with: "") + + do { + let destination = "/usr/local/bin/pm\(dotless)" + if FileManager.default.fileExists(atPath: destination) { + let contents = try String(contentsOfFile: destination) + if !contents.contains(keyPhrase) { + Log.info("The file at '\(destination)' already exists and was not generated by PHP Monitor (or is unreadable). Not updating this file.") + return + } + } + + // Let's follow the symlink to the PHP binary folder + let path = URL(fileURLWithPath: "\(Paths.optPath)/php@\(version)/bin") + .resolvingSymlinksInPath().path + + // The contents of the script! + let script = """ + #!/bin/zsh + # \(keyPhrase) + # It reflects the location of PHP \(version)'s binaries on your system. + # Usage: . pm\(dotless) + [[ $ZSH_EVAL_CONTEXT =~ :file$ ]] \\ + && echo "PHP Monitor has enabled this terminal to use PHP \(version)." \\ + || echo "You must run '. pm\(dotless)' (or 'source pm\(dotless)') instead!"; + export PATH=\(path):$PATH + """ + + // Write to the destination + try script.write( + to: URL(fileURLWithPath: destination), + atomically: true, + encoding: String.Encoding.utf8 + ) + + // Make sure the file is executable + Shell.run("chmod +x \(destination)") + } catch { + print(error) + Log.err("Could not write PHP Monitor helper for PHP \(version) to /usr/local/bin/pm\(dotless)") + } + } + +}