mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-08 04:20:07 +02:00
✨ Add default site to site list (#125)
This commit is contained in:
Binary file not shown.
@ -32,6 +32,7 @@ class ValetConfigParserTest: XCTestCase {
|
|||||||
"/Users/username/.config/valet/Sites",
|
"/Users/username/.config/valet/Sites",
|
||||||
"/Users/username/Sites"
|
"/Users/username/Sites"
|
||||||
])
|
])
|
||||||
|
XCTAssertEqual(config.defaultSite, "/Users/username/default-site")
|
||||||
XCTAssertEqual(config.loopback, "127.0.0.1")
|
XCTAssertEqual(config.loopback, "127.0.0.1")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,5 +4,6 @@
|
|||||||
"/Users/username/.config/valet/Sites",
|
"/Users/username/.config/valet/Sites",
|
||||||
"/Users/username/Sites"
|
"/Users/username/Sites"
|
||||||
],
|
],
|
||||||
"loopback": "127.0.0.1"
|
"loopback": "127.0.0.1",
|
||||||
|
"default": "/Users/username/default-site"
|
||||||
}
|
}
|
||||||
|
25
phpmon/Assets.xcassets/IconDefault.imageset/Contents.json
vendored
Normal file
25
phpmon/Assets.xcassets/IconDefault.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "Default.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Default@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"template-rendering-intent" : "template"
|
||||||
|
}
|
||||||
|
}
|
BIN
phpmon/Assets.xcassets/IconDefault.imageset/Default.png
vendored
Normal file
BIN
phpmon/Assets.xcassets/IconDefault.imageset/Default.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 861 B |
BIN
phpmon/Assets.xcassets/IconDefault.imageset/Default@2x.png
vendored
Normal file
BIN
phpmon/Assets.xcassets/IconDefault.imageset/Default@2x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
@ -13,6 +13,8 @@ protocol SiteScanner
|
|||||||
func resolveSiteCount(paths: [String]) -> Int
|
func resolveSiteCount(paths: [String]) -> Int
|
||||||
|
|
||||||
func resolveSitesFrom(paths: [String]) -> [ValetSite]
|
func resolveSitesFrom(paths: [String]) -> [ValetSite]
|
||||||
|
|
||||||
|
func resolveSite(path: String) -> ValetSite?
|
||||||
}
|
}
|
||||||
|
|
||||||
class FakeSiteScanner: SiteScanner
|
class FakeSiteScanner: SiteScanner
|
||||||
@ -41,6 +43,10 @@ class FakeSiteScanner: SiteScanner
|
|||||||
func resolveSitesFrom(paths: [String]) -> [ValetSite] {
|
func resolveSitesFrom(paths: [String]) -> [ValetSite] {
|
||||||
return fakes
|
return fakes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resolveSite(path: String) -> ValetSite? {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ValetSiteScanner: SiteScanner
|
class ValetSiteScanner: SiteScanner
|
||||||
@ -67,7 +73,7 @@ class ValetSiteScanner: SiteScanner
|
|||||||
.contentsOfDirectory(atPath: path)
|
.contentsOfDirectory(atPath: path)
|
||||||
|
|
||||||
return entries.forEach {
|
return entries.forEach {
|
||||||
if let site = self.getSite($0, forPath: path, tld: Valet.shared.config.tld) {
|
if let site = self.resolveSite(path: "\($0)/\(path))") {
|
||||||
sites.append(site)
|
sites.append(site)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,6 +82,35 @@ class ValetSiteScanner: SiteScanner
|
|||||||
return sites
|
return sites
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Determines whether the site can be resolved as a symbolic link or as a directory.
|
||||||
|
Regular files are ignored, and the site is added to Valet's list of sites.
|
||||||
|
*/
|
||||||
|
func resolveSite(path: String) -> ValetSite? {
|
||||||
|
// Get the TLD from the global Valet object
|
||||||
|
let tld = Valet.shared.config.tld
|
||||||
|
|
||||||
|
// See if the file is a symlink, if so, resolve it
|
||||||
|
let attrs = try! FileManager.default.attributesOfItem(atPath: path)
|
||||||
|
|
||||||
|
// We can also determine whether the thing at the path is a directory, too
|
||||||
|
let type = attrs[FileAttributeKey.type] as! FileAttributeType
|
||||||
|
|
||||||
|
// We should also check that we can interpret the path correctly
|
||||||
|
if URL(fileURLWithPath: path).lastPathComponent == "" {
|
||||||
|
Log.warn("Could not parse the site: \(path), skipping!")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if type == FileAttributeType.typeSymbolicLink {
|
||||||
|
return ValetSite(aliasPath: path, tld: tld)
|
||||||
|
} else if type == FileAttributeType.typeDirectory {
|
||||||
|
return ValetSite(absolutePath: path, tld: tld)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Determines whether the site can be resolved as a symbolic link or as a directory.
|
Determines whether the site can be resolved as a symbolic link or as a directory.
|
||||||
Regular files are ignored. Returns true if the path can be parsed.
|
Regular files are ignored. Returns true if the path can be parsed.
|
||||||
@ -93,32 +128,4 @@ class ValetSiteScanner: SiteScanner
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Determines whether the site can be resolved as a symbolic link or as a directory.
|
|
||||||
Regular files are ignored, and the site is added to Valet's list of sites.
|
|
||||||
*/
|
|
||||||
private func getSite(_ entry: String, forPath path: String, tld: String) -> ValetSite? {
|
|
||||||
let siteDir = path + "/" + entry
|
|
||||||
|
|
||||||
// See if the file is a symlink, if so, resolve it
|
|
||||||
let attrs = try! FileManager.default.attributesOfItem(atPath: siteDir)
|
|
||||||
|
|
||||||
// We can also determine whether the thing at the path is a directory, too
|
|
||||||
let type = attrs[FileAttributeKey.type] as! FileAttributeType
|
|
||||||
|
|
||||||
// We should also check that we can interpret the path correctly
|
|
||||||
if URL(fileURLWithPath: siteDir).lastPathComponent == "" {
|
|
||||||
Log.warn("Could not parse the site: \(siteDir), skipping!")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if type == FileAttributeType.typeSymbolicLink {
|
|
||||||
return ValetSite(aliasPath: siteDir, tld: tld)
|
|
||||||
} else if type == FileAttributeType.typeDirectory {
|
|
||||||
return ValetSite(absolutePath: siteDir, tld: tld)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -98,6 +98,8 @@ class Valet {
|
|||||||
We don't want to do duplicate or parallel work!
|
We don't want to do duplicate or parallel work!
|
||||||
*/
|
*/
|
||||||
public func reloadSites() {
|
public func reloadSites() {
|
||||||
|
loadConfiguration()
|
||||||
|
|
||||||
if (isBusy) {
|
if (isBusy) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -155,6 +157,11 @@ class Valet {
|
|||||||
.resolveSitesFrom(paths: config.paths)
|
.resolveSitesFrom(paths: config.paths)
|
||||||
.sorted { $0.absolutePath < $1.absolutePath }
|
.sorted { $0.absolutePath < $1.absolutePath }
|
||||||
|
|
||||||
|
if let defaultPath = Valet.shared.config.defaultSite,
|
||||||
|
let site = ValetSiteScanner().resolveSite(path: defaultPath) {
|
||||||
|
sites.insert(site, at: 0)
|
||||||
|
}
|
||||||
|
|
||||||
isBusy = false
|
isBusy = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@ class SiteListKindCell: NSTableCellView, SiteListCellProtocol
|
|||||||
|
|
||||||
func populateCell(with site: ValetSite) {
|
func populateCell(with site: ValetSite) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// If the `aliasPath` is nil, we're dealing with a parked site (otherwise: linked).
|
// If the `aliasPath` is nil, we're dealing with a parked site (otherwise: linked).
|
||||||
imageViewType.image = NSImage(
|
imageViewType.image = NSImage(
|
||||||
named: site.aliasPath == nil
|
named: site.aliasPath == nil
|
||||||
@ -22,6 +24,11 @@ class SiteListKindCell: NSTableCellView, SiteListCellProtocol
|
|||||||
: "IconLinked"
|
: "IconLinked"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Unless, of course, this is a default site
|
||||||
|
if site.absolutePath == Valet.shared.config.defaultSite {
|
||||||
|
imageViewType.image = NSImage(named: "IconDefault")
|
||||||
|
}
|
||||||
|
|
||||||
imageViewType.contentTintColor = NSColor.tertiaryLabelColor
|
imageViewType.contentTintColor = NSColor.tertiaryLabelColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,8 +78,21 @@ extension SiteListVC {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc func isolateSite(sender: PhpMenuItem) {
|
@objc func isolateSite(sender: PhpMenuItem) {
|
||||||
self.performAction(command: "cd '\(selectedSite!.absolutePath)' && sudo \(Paths.valet) isolate php@\(sender.version) && exit;") {
|
let command = "cd '\(selectedSite!.absolutePath)' && sudo \(Paths.valet) isolate php@\(sender.version) && exit;"
|
||||||
|
|
||||||
|
self.performAction(command: command) {
|
||||||
self.selectedSite!.determineIsolated()
|
self.selectedSite!.determineIsolated()
|
||||||
|
|
||||||
|
if self.selectedSite!.isolatedPhpVersion == nil {
|
||||||
|
BetterAlert()
|
||||||
|
.withInformation(
|
||||||
|
title: "site_list.alerts_isolation_failed.title".localized,
|
||||||
|
subtitle: "site_list.alerts_isolation_failed.subtitle".localized,
|
||||||
|
description: "site_list.alerts_isolation_failed.desc".localized(command)
|
||||||
|
)
|
||||||
|
.withPrimary(text: "OK")
|
||||||
|
.show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,11 @@
|
|||||||
"site_list.title" = "Domains";
|
"site_list.title" = "Domains";
|
||||||
"site_list.subtitle" = "Linked & Parked";
|
"site_list.subtitle" = "Linked & Parked";
|
||||||
|
|
||||||
"site_list.alerts_status_not_changed.title" = "SSL Status Not Changed";
|
"site_list.alerts_isolation_failed.title" = "Oops! Site Not Isolated";
|
||||||
|
"site_list.alerts_isolation_failed.subtitle" = "Something went wrong trying to isolate this site. If this is your default site but it is not linked, I recommend manually linking the site prior to setting up isolation.";
|
||||||
|
"site_list.alerts_isolation_failed.desc" = "To find out what goes wrong, you can try running the command in your terminal manually: %@";
|
||||||
|
|
||||||
|
"site_list.alerts_status_not_changed.title" = "Oops! SSL Status Not Changed";
|
||||||
"site_list.alerts_status_not_changed.desc" = "Something went wrong. Try running the command in your terminal manually: %@";
|
"site_list.alerts_status_not_changed.desc" = "Something went wrong. Try running the command in your terminal manually: %@";
|
||||||
|
|
||||||
"site_list.alerts_status_changed.title" = "SSL Status Changed";
|
"site_list.alerts_status_changed.title" = "SSL Status Changed";
|
||||||
|
Reference in New Issue
Block a user