1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2025-08-07 20:10:08 +02:00

👌 Determine "driver" by reading composer file

This is much faster than checking the actual driver, which might take
a while if you have many sites. If we're just checking the actual
composer file (which is already parsed) this should be much faster.
This commit is contained in:
2022-01-26 19:06:57 +01:00
parent b59a5d31a5
commit c4772db808
6 changed files with 102 additions and 9 deletions

View File

@ -39,6 +39,8 @@
C40C7F3127722E8D00DDDCDC /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F2F27722E8D00DDDCDC /* Logger.swift */; };
C40C7F3227722E8D00DDDCDC /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40C7F2F27722E8D00DDDCDC /* Logger.swift */; };
C412E5FC25700D5300A1FB67 /* HomebrewPackage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C412E5FB25700D5300A1FB67 /* HomebrewPackage.swift */; };
C415937F27A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */; };
C415938027A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */; };
C415D3B72770F294005EF286 /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415D3B62770F294005EF286 /* Actions.swift */; };
C415D3B82770F294005EF286 /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415D3B62770F294005EF286 /* Actions.swift */; };
C415D3E12770F34D005EF286 /* AllowedArguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = C415D3DE2770F34D005EF286 /* AllowedArguments.swift */; };
@ -228,6 +230,7 @@
C40C7F2727721FF600DDDCDC /* ActivePhpInstallation+Checks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActivePhpInstallation+Checks.swift"; sourceTree = "<group>"; };
C40C7F2F27722E8D00DDDCDC /* Logger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
C412E5FB25700D5300A1FB67 /* HomebrewPackage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomebrewPackage.swift; sourceTree = "<group>"; };
C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhpFrameworks.swift; sourceTree = "<group>"; };
C415D3B62770F294005EF286 /* Actions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Actions.swift; sourceTree = "<group>"; };
C415D3D62770F341005EF286 /* phpmon-cli */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "phpmon-cli"; sourceTree = BUILT_PRODUCTS_DIR; };
C415D3DE2770F34D005EF286 /* AllowedArguments.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllowedArguments.swift; sourceTree = "<group>"; };
@ -627,6 +630,7 @@
isa = PBXGroup;
children = (
C4D89BC52783C99400A02B68 /* ComposerJson.swift */,
C415937E27A1B54F00D2E1B7 /* PhpFrameworks.swift */,
);
path = Composer;
sourceTree = "<group>";
@ -897,6 +901,7 @@
C4C3ED4327834C5200AB15D8 /* CustomPrefs.swift in Sources */,
54B48B5F275F66AE006D90C5 /* Application.swift in Sources */,
C4B97B78275CF1B5003F3378 /* App+ActivationPolicy.swift in Sources */,
C415937F27A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */,
C4811D2422D70A4700B5F6B3 /* App.swift in Sources */,
C41C1B4922B00A9800E7CF16 /* MenuBarImageGenerator.swift in Sources */,
C4F30B03278E16BA00755FCE /* HomebrewService.swift in Sources */,
@ -995,6 +1000,7 @@
C4F780BD25D80B65000DBC97 /* Constants.swift in Sources */,
C4F780C325D80B75000DBC97 /* HeaderView.swift in Sources */,
C44C198E276E3A1C0072762D /* ProgressWindow.swift in Sources */,
C415938027A1B54F00D2E1B7 /* PhpFrameworks.swift in Sources */,
C4D9ADC9277611A0007277F4 /* InternalSwitcher.swift in Sources */,
C4F30B0B278E203C00755FCE /* MainMenu+Startup.swift in Sources */,
C4F30B0A278E1A1A00755FCE /* ComposerJson.swift in Sources */,
@ -1194,7 +1200,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 500;
CURRENT_PROJECT_VERSION = 520;
DEVELOPMENT_TEAM = 8M54J5J787;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = phpmon/Info.plist;
@ -1203,7 +1209,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = "5.0-b1";
MARKETING_VERSION = "5.0-b2";
PRODUCT_BUNDLE_IDENTIFIER = com.nicoverbruggen.phpmon.beta;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -1219,7 +1225,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 500;
CURRENT_PROJECT_VERSION = 520;
DEVELOPMENT_TEAM = 8M54J5J787;
ENABLE_HARDENED_RUNTIME = YES;
INFOPLIST_FILE = phpmon/Info.plist;
@ -1228,7 +1234,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = "5.0-b1";
MARKETING_VERSION = "5.0-b2";
PRODUCT_BUNDLE_IDENTIFIER = com.nicoverbruggen.phpmon.beta;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

View File

@ -723,6 +723,7 @@ Gw
<outlet property="imageViewPhpVersionOK" destination="5aN-ZI-D7U" id="ePz-Cb-dWk"/>
<outlet property="imageViewType" destination="0NQ-ZD-CqD" id="Cph-FN-LaY"/>
<outlet property="labelDriver" destination="TbX-e2-3QL" id="qJh-Ak-Dge"/>
<outlet property="labelDriverType" destination="jKi-Ls-7FZ" id="ZTq-pP-qUC"/>
<outlet property="labelPathName" destination="CXK-Q9-CpO" id="iVZ-cL-azB"/>
<outlet property="labelSiteName" destination="XJL-Uw-frD" id="f0t-vd-W68"/>
</connections>

View File

@ -9,6 +9,7 @@
import Foundation
struct ComposerJson: Decodable {
let dependencies: Dictionary<String, String>?
let devDependencies: Dictionary<String, String>?
let configuration: Config?
@ -28,9 +29,16 @@ struct ComposerJson: Decodable {
return ("", "unknown")
}
/**
Checks if any notable dependencies can be resolved.
Only notable dependencies are saved.
*/
public func getNotableDependencies() -> [String: String] {
var notable: [String: String] = [:]
let scan = ["php", "laravel/framework"]
var scan = Array(PhpFrameworks.DependencyList.keys)
scan.append("php")
scan.forEach { dependency in
if dependencies?[dependency] != nil {

View File

@ -0,0 +1,46 @@
//
// Frameworks.swift
// PHP Monitor
//
// Created by Nico Verbruggen on 26/01/2022.
// Copyright © 2022 Nico Verbruggen. All rights reserved.
//
import Foundation
struct PhpFrameworks {
/// This list should probably be reversed when checked, because some of these
/// will also require either laravel/framework or symfony/symfony.
public static let DependencyList = [
// COMMON FRAMEWORKS
"laravel/framework" : "Laravel",
"symfony/symfony": "Symfony",
"laravel/lumen": "Lumen",
// VARIOUS CMS
"roots/bedrock": "Bedrock",
"cakephp/app": "CakePHP",
// TODO: Handle wildcards like these (currently disabled)
// "concrete5/*": "Concrete5",
// "contao/*": "Contao",
"craftcms/craft": "Craft",
"drupal/core": "Drupal",
"tightenco/jigsaw": "Jigsaw",
"joomla/uri": "Joomla",
"themsaid/katana": "Katana",
"getkirby/cms": "Kirby",
// "magento/*": "Magento",
"october/october": "OctoberCMS",
"sculpin/sculpin": "Sculpin",
// "slim/*": "Slim",
"statamic/cms": "Statamic",
"johnpbloch/wordpress-core": "Wordpress",
"zendframework/zendframework": "Zend",
"zendframework/zend-mvc": "Zend"
]
}

View File

@ -21,6 +21,9 @@ class Valet {
/// A cached list of sites that were detected after analyzing the paths set up for Valet.
var sites: [Site] = []
/// Whether we're busy with some blocking operation.
var isBusy: Bool = false
init() {
version = VersionExtractor.from(valet("--version"))
?? "UNKNOWN"
@ -49,6 +52,10 @@ class Valet {
}
public func reloadSites() {
if (isBusy) {
return
}
resolvePaths(tld: config.tld)
}
@ -88,6 +95,8 @@ class Valet {
Resolves all paths and creates linked or parked site instances that can be referenced later.
*/
private func resolvePaths(tld: String) {
isBusy = true
sites = []
for path in config.paths {
@ -98,6 +107,8 @@ class Valet {
}
sites = sites.sorted { $0.absolutePath < $1.absolutePath }
isBusy = false
}
/**
@ -162,6 +173,9 @@ class Valet {
/// What driver is currently in use. If not detected, defaults to nil.
var driver: String? = nil
/// Whether the driver was determined by checking the Composer file.
var driverDeterminedByComposer: Bool = false
/// A list of notable Composer dependencies.
var notableComposerDependencies: [String: String] = [:]
@ -179,8 +193,8 @@ class Valet {
self.name = URL(fileURLWithPath: absolutePath).lastPathComponent
self.aliasPath = nil
determineSecured(tld)
determineDriver()
determineComposerPhpVersion()
determineDriver()
}
convenience init(aliasPath: String, tld: String) {
@ -189,19 +203,27 @@ class Valet {
self.name = URL(fileURLWithPath: aliasPath).lastPathComponent
self.aliasPath = aliasPath
determineSecured(tld)
determineDriver()
determineComposerPhpVersion()
determineDriver()
}
public func determineSecured(_ tld: String) {
secured = Shell.fileExists("~/.config/valet/Certificates/\(self.name!).\(tld).key")
}
public func determineDriver() {
public func determineDriverViaComposer() {
PhpFrameworks.DependencyList.reversed().forEach { (key: String, value: String) in
if self.notableComposerDependencies.keys.contains(key) {
self.driver = value
self.driverDeterminedByComposer = true
}
}
}
public func determineDriverViaValet() {
let driver = Shell.pipe("cd '\(absolutePath!)' && valet which", requiresPath: true)
if driver.contains("This site is served by") {
self.driver = driver
// TODO: Use a regular expression to retrieve the driver instead?
.replacingOccurrences(of: "This site is served by [", with: "")
.replacingOccurrences(of: "ValetDriver].\n", with: "")
} else {
@ -209,6 +231,11 @@ class Valet {
}
}
public func determineDriver() {
// TODO: Offer a preference that still fetches the driver (slower)
self.determineDriverViaComposer()
}
public func determineComposerPhpVersion() {
let path = "\(absolutePath!)/composer.json"
do {

View File

@ -15,6 +15,7 @@ class SiteListCell: NSTableCellView
@IBOutlet weak var labelSiteName: NSTextField!
@IBOutlet weak var labelPathName: NSTextField!
@IBOutlet weak var labelDriverType: NSTextField!
@IBOutlet weak var imageViewLock: NSImageView!
@IBOutlet weak var imageViewType: NSImageView!
@ -53,6 +54,10 @@ class SiteListCell: NSTableCellView
: NSColor.init(red: 246/255, green: 71/255, blue: 71/255, alpha: 1.0) // red
// Show the current driver
labelDriverType.stringValue = site.driverDeterminedByComposer
? "Project Type".uppercased()
: "Driver Type".uppercased()
labelDriver.stringValue = "\(site.driver ?? "???")"
// Determine the Laravel version