1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2025-11-09 05:40:07 +01: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

@@ -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