Last active
June 6, 2025 20:04
-
-
Save rmpel/f5c220b5e49baf0df4f5bbf5b7e76fdf to your computer and use it in GitHub Desktop.
zsh automatic LocalWP context switcher when navigating folders of projects on MacOS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# this is a zsh script to automatically switch to the localwp shell when you enter a | |
# directory that contains a LocalWP website installation | |
# it is designed to trigger on any directory deeper or exactly the app/ folder of a localwp site. | |
# this code is FAR FROM perfect, but it works! Feel free to suggest/improve/etc | |
# | |
# this file is to be sourced in your .zshrc . | |
# | |
# Suggested install method: | |
# cd ~ ; mkdir -p .zsh ; git clone https://gist.github.com/f5c220b5e49baf0df4f5bbf5b7e76fdf.git .zsh/zsh-auto-localwp | |
# echo "source ~/.zsh/zsh-auto-localwp/zsh-auto-localwp.sh" >> ~/.zshrc | |
# | |
# Some software is required apart from tools you should already have on your mac; | |
# Prereq; LocalWP (required, of course ;) ) | |
# https://localwp.com/ | |
# Prereq; jq (required) | |
# Linux: sudo apt install jq | |
# MacOS: brew install jq | |
# If you do not already have brew, please go to https://brew.sh/ for installation instructions. | |
# Prereq; local-cli (optional) | |
# npm install -g @getflywheel/local-cli | |
# Prereq; realpath, sed, grep | |
# | |
# Method of operation: | |
# 1. When you enter a directory that matches a pattern ....../a-name/app/..... it will assume the sitename is a-name, and the site path is ....../a-name | |
# 2. It will look up the site id in the localwp sites.json file. If this path is listed, it will use the site id to set the environment. | |
# 3. If local-cli is available, it will check if the site is running, and start it if it is not. | |
# 4. When the environment is set, this will not be done again until you leave the site directory. | |
# 5. When you leave the site directory, the environment will be unset. You can jump between sites without any issues and each terminal will have their own environment. | |
# | |
# Notes; | |
# Script is far from DRY. Optimisation is needed. | |
# Script is far from perfect. It works, but it can and should be improved. | |
# Only developed and tested for MacOS using the Apple Terminal emulator. | |
# And for linux, MX Linux, xfce4 Terminal. | |
# And it goes without saying; only for zsh. | |
# | |
# This script is provided as-is, without any warranty or guarantee. Use at your own risk. | |
# Feel free to use, modify, share, etc. If you have improvements, please share them back. | |
# | |
# License; GPL v3, see https://www.gnu.org/licenses/gpl-3.0.html share-alike, attribution required. | |
### | |
# Global configuration; | |
# Define in your environment before loading this add-on. | |
# export AUTO_START_LOCALWP_APP=yes | |
AUTO_START_LOCALWP_APP=${AUTO_START_LOCALWP_APP:-no} | |
ZSH_AUTO_LOCALWP_PATH=$0:P | |
LOCAL_RUNTIME_DIRECTORY=~/.config/zsh-localwp/runtime | |
LOCAL_APP_LOCATION=~/.config/zsh-localwp/binary | |
LOCAL_APP_RESOURCES=~/.config/zsh-localwp/resources | |
LOCAL_CLI=$(which local-cli | head -n 1) | |
NOHUP=$(which setsid nohup | head -n 1) | |
LOCAL_SYSTEM_ARCHITECTURE= | |
### | |
# Get architecture | |
# returns linux, arm64 for macos on arm, x86_64 for macos on intel. Windows WSL support not yet here. Please contribute. | |
# @return string | |
function localwp_get_arch { | |
[ "" != "$LOCAL_SYSTEM_ARCHITECTURE" ] && echo "$LOCAL_SYSTEM_ARCHITECTURE" && return 0 | |
[ "" != "$(which arch)" ] && LOCAL_SYSTEM_ARCHITECTURE=darwin && [ "arm64" = "$(arch)" ] && LOCAL_SYSTEM_ARCHITECTURE=darwin-arm64 | |
[ -d /opt/Local/resources ] && LOCAL_SYSTEM_ARCHITECTURE=linux | |
echo "$LOCAL_SYSTEM_ARCHITECTURE" | |
} | |
LOCAL_SYSTEM_ARCHITECTURE=$(localwp_get_arch) | |
### Create or update symlinks to the LocalWP runtime directory, Application Resources, and LocalWP binary. | |
# We do this to create a uniform environment for all platforms. | |
# | |
function _localwp_symlink_maintenance { | |
[ ! -d ~/.config/zsh-localwp ] && mkdir -p ~/.config/zsh-localwp | |
[ -L "$LOCAL_RUNTIME_DIRECTORY" ] && rm "$LOCAL_RUNTIME_DIRECTORY" | |
[ -L "$LOCAL_APP_LOCATION" ] && rm "$LOCAL_APP_LOCATION" | |
[ -L "$LOCAL_APP_RESOURCES" ] && rm "$LOCAL_APP_RESOURCES" | |
local APP_LOCATION | |
case $LOCAL_SYSTEM_ARCHITECTURE in | |
darwin-arm64|darwin) | |
# create symlinks; MacOS edition. | |
APP_LOCATION="$(ls -1d {,~}/Applications/Local.app 2>/dev/null | grep Applications -m 1)" | |
[ -e ~/Library/Application" "Support/Local ] && ln -s ~/Library/Application" "Support/Local "$LOCAL_RUNTIME_DIRECTORY" | |
[ -e "$APP_LOCATION" ] && ln -s "$APP_LOCATION" "$LOCAL_APP_LOCATION" | |
[ -e "$APP_LOCATION/Contents/Resources" ] && ln -s "$APP_LOCATION/Contents/Resources" "$LOCAL_APP_RESOURCES" | |
;; | |
linux) | |
# create symlinks; Linux edition. | |
[ -e ~/.config/Local ] && ln -s /opt/Local "$LOCAL_RUNTIME_DIRECTORY" | |
[ -e /opt/Local/local ] && ln -s /opt/Local/local "$LOCAL_APP_LOCATION" | |
[ -e /opt/Local/resources ] && ln -s /opt/Local/resources "$LOCAL_APP_RESOURCES" | |
;; | |
esac | |
# PolyFill; the local-cli has hardcoded paths to the MacOS runtime directory. | |
local LOCAL_RUNTIME=~/.config/Local | |
local LOCAL_RUNTIME_MACOS=~/Library/Application" "Support/Local | |
[ -d $LOCAL_RUNTIME ] && [ ! -d "$LOCAL_RUNTIME_MACOS" ] && echo Non-MacOS path detected. Local-CLI expects it. Creating symlinks. Please hold... >&2 && mkdir -p ~/Library/Application\ Support && ln -s ~/.config/Local ~/Library/Application\ Support/ && echo Done. >&2 | |
} | |
_localwp_symlink_maintenance | |
[ ! -d "$LOCAL_RUNTIME_DIRECTORY" ] && echo LocalWP Runtime Dir not found. Inspect code, fix, try again. && return; | |
### | |
# Get the basename of a path, without using the basename command. | |
# @param $1 Path to the file or directory | |
# @param $2 Suffix to remove from the basename (optional) | |
_localwp_basename() { | |
# Usage: basename "path" ["suffix"] | |
# Strip all trailing forward-slashes '/' from | |
# the end of the string. | |
# | |
# "${1##*[!/]}": Remove all non-forward-slashes | |
# from the start of the string, leaving us with only | |
# the trailing slashes. | |
# "${1%%"${}"}: Remove the result of the above | |
# substitution (a string of forward slashes) from the | |
# end of the original string. | |
dir=${1%${1##*[!/]}} | |
# Remove everything before the final forward-slash '/'. | |
dir=${dir##*/} | |
# If a suffix was passed to the function, remove it from | |
# the end of the resulting string. | |
dir=${dir%"$2"} | |
# Print the resulting string and if it is empty, | |
# print '/'. | |
printf '%s\n' "${dir:-/}" | |
} | |
### | |
# Start LocalWP. | |
# @param $1 Path to the detected LocalWP app. If missing, we just Hail Mary on Local.app | |
function localwp_launch_localwp { | |
# prevent broken shell from infinitely trying to start Local. | |
[ ! -e "$LOCAL_CLI" ] && return 0; | |
"$LOCAL_CLI" list-sites >/dev/null 2>&1 && return 0 | |
echo -n "Starting Local.app ... Please wait ..." >&2 | |
# if linux, get local_app, start in background | |
if [ "linux" = "$(localwp_get_arch)" ]; then | |
$NOHUP "$LOCAL_APP_LOCATION" >/dev/null 2>&1 & | |
else | |
open -a "$LOCAL_APP_LOCATION" | |
fi | |
# start a retry counter at 15; we wait at most 15 seconds for the app to start. | |
local TIMEOUT=15 | |
local RETRY=$TIMEOUT | |
# loop until we have a connection to the local-cli | |
while [ $RETRY -gt 0 ]; do | |
"$LOCAL_CLI" list-sites >/dev/null 2>&1 && break | |
sleep 1 | |
RETRY=$((RETRY-1)) | |
# echo a dot, no new line | |
echo -n "." >&2 | |
done | |
echo "" >&2 | |
"$LOCAL_CLI" list-sites >/dev/null 2>&1 && \ | |
echo "Local.app started in $((TIMEOUT-RETRY)) seconds." >&2 || \ | |
echo "Local.app did not start in $TIMEOUT seconds." >&2 | |
} | |
### | |
# Find the MySQL binary path for a specific version, it will auto-detect the architecture and try the best match. | |
# @param $1 MySQL version | |
# | |
function localwp_find_mysql_binary_path { | |
LOCAL_SYSTEM_ARCHITECTURE=$(localwp_get_arch) | |
setopt nullglob | |
for i in \ | |
${LOCAL_RUNTIME_DIRECTORY}/lightning-services/mysql-${1}*/bin/${LOCAL_SYSTEM_ARCHITECTURE}/bin \ | |
${LOCAL_APP_RESOURCES}/extraResources/lightning-services/mysql-${1}*/bin/${LOCAL_SYSTEM_ARCHITECTURE}/bin \ | |
${LOCAL_RUNTIME_DIRECTORY}/lightning-services/mysql-${1}*/bin/darwin/bin \ | |
${LOCAL_APP_RESOURCES}/extraResources/lightning-services/mysql-${1}*/bin/darwin/bin \ | |
; do | |
if [ -d "$i" ]; then | |
export _LOCALWP_INTERNAL_CALL=1 | |
pushd $i >/dev/null 2>&1 | |
MYSQL_PATH=$(pwd -P) | |
popd >/dev/null 2>&1 | |
unset _LOCALWP_INTERNAL_CALL | |
break; | |
else | |
MYSQL_PATH="" | |
fi | |
done | |
unsetopt nullglob | |
echo "$MYSQL_PATH" | |
} | |
### | |
# Find the PHP binary path for a specific version, it will auto-detect the architecture and try the best match. | |
# @param $1 PHP version | |
# | |
function localwp_find_php_binary_path { | |
LOCAL_SYSTEM_ARCHITECTURE=$(localwp_get_arch) | |
setopt nullglob | |
for i in \ | |
${LOCAL_RUNTIME_DIRECTORY}/lightning-services/php-${1}*/bin/${LOCAL_SYSTEM_ARCHITECTURE}/bin \ | |
${LOCAL_APP_RESOURCES}/extraResources/lightning-services/php-${1}*/bin/${LOCAL_SYSTEM_ARCHITECTURE}/bin \ | |
${LOCAL_RUNTIME_DIRECTORY}/lightning-services/php-${1}*/bin/darwin/bin \ | |
${LOCAL_APP_RESOURCES}/extraResources/lightning-services/php-${1}*/bin/darwin/bin \ | |
; do | |
if [ -d "$i" ]; then | |
export _LOCALWP_INTERNAL_CALL=1 | |
pushd "$i" >/dev/null 2>&1 | |
PHP_PATH=$(pwd -P) | |
popd >/dev/null 2>&1 | |
unset _LOCALWP_INTERNAL_CALL | |
break; | |
else | |
PHP_PATH="" | |
fi | |
done | |
unsetopt nullglob | |
echo "$PHP_PATH" | |
} | |
### | |
# Find the Imagick module path for a specific PHP version, it will auto-detect the architecture and try the best match. | |
# @param $1 PHP version | |
# | |
function localwp_find_php_imagick_path { | |
LOCAL_SYSTEM_ARCHITECTURE=$(localwp_get_arch) | |
setopt nullglob | |
for i in \ | |
"${LOCAL_RUNTIME_DIRECTORY}/lightning-services/php-${1}+0/bin/${LOCAL_SYSTEM_ARCHITECTURE}/ImageMagick/modules-Q16/coders" \ | |
"${LOCAL_APP_RESOURCES}/extraResources/lightning-services/php-${1}*/bin/${LOCAL_SYSTEM_ARCHITECTURE}/ImageMagick/modules-Q16/coders \ | |
"${LOCAL_RUNTIME_DIRECTORY}/lightning-services/php-${1}+0/bin/darwin/ImageMagick/modules-Q16/coders" \ | |
"${LOCAL_APP_RESOURCES}/extraResources/lightning-services/php-${1}*/bin/darwin/ImageMagick/modules-Q16/coders \ | |
; do | |
if [ -d "$i" ]; then | |
export _LOCALWP_INTERNAL_CALL=1 | |
pushd $i >/dev/null 2>&1 | |
MGK_PATH=$(pwd -P) | |
popd >/dev/null 2>&1 | |
unset _LOCALWP_INTERNAL_CALL | |
break; | |
else | |
MGK_PATH="" | |
fi | |
done | |
unsetopt nullglob | |
echo "$MGK_PATH" | |
} | |
### | |
# Get the nth word from a string | |
# @param $1 Nth word | |
# @param $2..$N Strings | |
# | |
function localwp_get_nth_word { | |
local NTH="$1" | |
shift; | |
local WORDS=($*) | |
local WORD="${WORDS[$NTH]}" | |
echo "$WORD" | |
} | |
### | |
# Set the environment for a LocalWP site | |
# @param $1 Site name | |
# @param $2 Site ID | |
# @param $3 MySQL version | |
# @param $4 PHP version | |
# | |
function localwp_set_env { | |
if [ "yes" = $AUTO_START_LOCALWP_APP ]; then | |
localwp_launch_localwp | |
fi | |
echo -e "\033[33mSwitching to Local Shell for ${1}\033[0m" >&2 | |
if [ -e "$LOCAL_CLI" ]; then | |
SITE_STATE=$(localwp_get_nth_word 6 $("$LOCAL_CLI" list-sites | grep -- "$2")) | |
[ "halted" = "$SITE_STATE" ] && ( echo -e "\033[33m${1} not running, starting ...\033[0m" >&2 && "$LOCAL_CLI" start-site "$2" ) || echo -n '' >&2 | |
fi | |
export WP_ENV=local-by-flywheel | |
export MYSQL_HOME="${LOCAL_RUNTIME_DIRECTORY}/run/${2}/conf/mysql" | |
export PHPRC="${LOCAL_RUNTIME_DIRECTORY}/run/${2}/conf/php" | |
export WP_CLI_CONFIG_PATH="$LOCAL_APP_RESOURCES/extraResources/bin/wp-cli/config.yaml" | |
export WP_CLI_DISABLE_AUTO_CHECK_UPDATE=1 | |
PATH="$(localwp_find_mysql_binary_path ${3}):$PATH" | |
PATH="$(localwp_find_php_binary_path ${4}):$PATH" | |
PATH="${LOCAL_APP_RESOURCES}/extraResources/bin/wp-cli/posix:$PATH" | |
PATH="${LOCAL_APP_RESOURCES}/extraResources/bin/composer/posix:$PATH" | |
export PATH | |
MGK=$(localwp_find_php_imagick_path ${4}) | |
[ "" != "${MGK}" ] && export MAGICK_CODER_MODULE_PATH="${MGK}" | |
export LOCALWP_SITE="$1" | |
export LOCALWP_SITE_ID="$2" | |
[ "" = "$LD_LIBRARY_PATH" ] && LD_LIBRARY_PATH="$(localwp_find_php_binary_path ${4})"/../shared-libs | |
export LD_LIBRARY_PATH | |
local WEB_PATH="$(ls -d1 "${SITE_PATH}"/app/public "${SITE_PATH}"/app/public_html "${SITE_PATH}"/app/web 2>/dev/null | grep app | head -n1)" | |
local COMPOSER_PATH="$(ls -d1 "${WEB_PATH}"/composer.json "${WEB_PATH}"/../composer.json "${WEB_PATH}"/../../composer.json 2>/dev/null | grep composer.json | head -n1)" | |
if [ -f "$COMPOSER_PATH" ]; then | |
local SITE_PHP_VERSION=$(jq -r .config.platform.php "$COMPOSER_PATH") | |
if [ ! -z $SITE_PHP_VERSION ] && [ "null" != "$SITE_PHP_VERSION" ]; then | |
( echo "$SITE_PHP_VERSION" | php -r '$mm=function($in) { $in = explode(".", $in); return (float)"{$in[0]}.{$in[1]}"; }; $a = file_get_contents("php://stdin"); $a = $mm($a); $p = $mm(PHP_VERSION); exit (version_compare($a,$p));' ) || \ | |
( echo -e "\033[36mPHP Version in composer.json differs from LocalWP configured version. \033[0m" >&2 ; echo -e "\033[36mcomposer.json: $SITE_PHP_VERSION, LocalWP: $(php -r 'echo PHP_VERSION;'). \033[0m" >&2 ) | |
fi | |
fi | |
} | |
### | |
# Unset the environment for a LocalWP site | |
# | |
function localwp_unset_env { | |
unset LD_LIBRARY_PATH | |
unset WP_ENV | |
unset MYSQL_HOME | |
unset PHPRC | |
unset WP_CLI_CONFIG_PATH | |
unset WP_CLI_DISABLE_AUTO_CHECK_UPDATE | |
unset MAGICK_CODER_MODULE_PATH | |
# remove paths from PATH | |
# remove paths matching ${LOCAL_APP_LOCATION}/Contents/Resources/extraResources/bin/ | |
# remove paths matching ${LOCAL_RUNTIME_DIRECTORY}/lightning-services | |
PATH=$(echo $PATH | tr ':' '\n' | grep -v "${LOCAL_APP_RESOURCES}/extraResources/" | grep -v "${LOCAL_RUNTIME_DIRECTORY}/lightning-services" | tr '\n' ':') | |
# trim trailing/leading colons and remove multiple colons in a row | |
PATH=$(echo $PATH | sed 's/:*$//;s/^:*//;s/:+/:/g') | |
export PATH | |
export LOCALWP_SITE= | |
export LOCALWP_SITE_ID= | |
} | |
### | |
# MAIN Automatically switch to the LocalWP shell when entering a LocalWP site directory | |
# | |
function localwp_auto_switch { | |
if [ "" != "$_LOCALWP_INTERNAL_CALL" ]; then | |
return; | |
fi | |
[ "" = "$(which jq)" ] && return; | |
SITES_JSON_PATH="$LOCAL_RUNTIME_DIRECTORY"/sites.json | |
THEPWD="$(pwd)" | |
if [[ "$THEPWD" =~ /.+/([^/]+)/app($|/.*) ]]; then | |
## variable cutting, on first match with %%, on last match with % . | |
SITE_PATH=${THEPWD%%/app/*} | |
SITE_ID=$(jq -r ".[] | select(.path == \"$SITE_PATH\") | .id" "$SITES_JSON_PATH") | |
# does not seem to be a localwp site, but maybe the path is different | |
if [ "" = "$SITE_ID" ]; then | |
SITE_REAL_PATH=$(realpath "$SITE_PATH") | |
SITE_ID=$(jq -r ".[] | select(.path == \"$SITE_REAL_PATH\") | .id" "$SITES_JSON_PATH") | |
SITE_PATH="$SITE_REAL_PATH" | |
fi | |
# still no site id, we are done. | |
[ "" = "$SITE_ID" ] && return; | |
# PHP Config already pointing to this site, we assume all is o.k. | |
# This is because this variable is set by the localwp_set_env function | |
if [[ "$PHPRC" =~ "/$SITE_ID/" ]]; then | |
return | |
fi | |
# get the site name | |
SITE_NAME=$(_localwp_basename "$SITE_PATH") | |
echo -n -e "\033]0;Local Shell for ${SITE_NAME}\007" | |
MYSQL_VERSION=$(jq -r ".[] | select(.path == \"$SITE_PATH\") | .services.mysql.version" "$SITES_JSON_PATH") | |
PHP_VERSION=$(jq -r ".[] | select(.path == \"$SITE_PATH\") | .services.php.version" "$SITES_JSON_PATH") | |
# clear the environment | |
localwp_unset_env | |
# set the environment | |
localwp_set_env $SITE_NAME $SITE_ID $MYSQL_VERSION $PHP_VERSION | |
elif [[ "$PHPRC" =~ "/$SITE_ID/" ]]; then | |
# clear the environment | |
localwp_unset_env | |
# notify the user | |
echo -e "\033[33mSwitching off Local Shell\033[0m" >&2 | |
# clear the title | |
echo -n -e "\033]0;\007" | |
fi | |
} | |
function localwp_siteid_from_name { | |
SITES_JSON_PATH="$LOCAL_RUNTIME_DIRECTORY"/sites.json | |
SITE_ID=$(jq -r ".[] | select(.name == \"$1\") | .id" "$SITES_JSON_PATH") | |
if [ "" = "$SITE_ID" ]; then | |
echo "Site not found: $1" | |
return 1 | |
fi | |
echo "$SITE_ID" | |
} | |
function localwp_site_info_query { | |
# $1 is the query, $2 is the site id | |
SITES_JSON_PATH="$LOCAL_RUNTIME_DIRECTORY"/sites.json | |
jq -r .\"${2:-$SITE_ID}\"${1} "$SITES_JSON_PATH" | |
} | |
function localwp_evaluatepath { | |
local THE_PATH="$1" | |
local OLD_PATH="$1" | |
if [ -L "$THE_PATH" ] ; then | |
THE_PATH=$(readlink -f "$THE_PATH") | |
fi | |
if [ -e "$THE_PATH" ]; then | |
THE_PATH=$(realpath "$THE_PATH") | |
fi | |
if [ "$THE_PATH" != "$OLD_PATH" ]; then | |
localwp_evaluatepath "$THE_PATH" | |
else | |
# no change, return the path | |
echo "$THE_PATH" | |
fi | |
} | |
function localwp_print_info { | |
local S="${1:-$SITE_ID}" | |
local SITE_PATH="$(localwp_site_info_query .path "${S}")" | |
echo "SiteID: " ${S} | |
local ITEM | |
ITEM="${SITE_PATH}"/app | |
echo "Site root from current path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM=$(ls -d1 "${SITE_PATH}"/app/public "${SITE_PATH}"/app/public_html "${SITE_PATH}"/app/web 2>/dev/null | grep app | head -n1) | |
echo "Web root for this site (by disk): " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${SITE_PATH}"/app/.idea | |
echo ".IDEA folder location (by disk): " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${LOCAL_RUNTIME_DIRECTORY}"/run/"${S}"/conf/apache/site.conf | |
local APACHECONF="$ITEM" | |
echo "Apache config path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${SITE_PATH}"/conf/apache/site.conf.hbs | |
echo "Apache config template path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM=$(grep DocumentRoot "$APACHECONF" -m 1) | |
# data is in the form: DocumentRoot "/Users/username/Local Sites/sitename/app/public" | |
# Remove everything (" included) up til the first " found | |
ITEM=${ITEM#*\"} | |
# Remove everything (" included) after the first " found | |
ITEM=${ITEM%\"*} | |
echo "Web root for this ste (Apache): " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${LOCAL_RUNTIME_DIRECTORY}"/run/"${S}"/conf/php/php.ini | |
local PHPCONF="$ITEM" | |
echo "PHP config path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${SITE_PATH}"/conf/php/php.ini.hbs | |
echo "PHP config template path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM=$(grep openssl.cafile "$PHPCONF" -m 1) | |
# data is in the form: openssl.cafile="/Users/username/Local Sites/sitename/app/public/wp-includes/certificates/ca-bundle.crt" | |
# Remove everything ( = included) up til the first " found | |
ITEM=${ITEM#*\"} | |
# Remove everything (" included) after the first " found | |
ITEM=${ITEM%\"*} | |
echo "WordPress SSL CA Cert path (PHP): " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
local NAME="$(localwp_site_info_query .name "${S}")" | |
ITEM="${LOCAL_RUNTIME_DIRECTORY}/run/router/nginx/conf/route.${NAME}.test.conf" | |
echo "Router Config: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="${LOCAL_RUNTIME_DIRECTORY}/run/router/nginx/certs/${NAME}.test.crt" | |
echo "SSL Certificate: " $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
ITEM="$LOCAL_APP_LOCATION" | |
echo "LocalWP Application path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $ITEM | |
echo " =>" $(localwp_evaluatepath "$ITEM") | |
ITEM="$LOCAL_RUNTIME_DIRECTORY" | |
echo "LocalWP Runtime path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $ITEM | |
echo " =>" $(localwp_evaluatepath "$ITEM") | |
ITEM="$LOCAL_APP_RESOURCES" | |
echo "LocalWP Resources path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $ITEM | |
echo " =>" $(localwp_evaluatepath "$ITEM") | |
ITEM="$LOCAL_RUNTIME_DIRECTORY"/sites.json | |
echo "LocalWP Sites JSON path: " $( [ -e "$ITEM" ] && echo √ || echo x ) $ITEM | |
echo " =>" $(localwp_evaluatepath "$ITEM") | |
echo "TCP/IP ports:" | |
echo " Apache: " $(localwp_site_info_query ".services.apache.ports.HTTP[0]" "${S}") | |
echo " MySQL: " $(localwp_site_info_query ".services.mysql.ports.MYSQL[0]" "${S}") | |
ITEM="$LOCAL_RUNTIME_DIRECTORY/run/${S}/mysql/mysqld.sock" | |
echo " socket:" $( [ -e "$ITEM" ] && echo √ || echo x ) $(localwp_evaluatepath "$ITEM") | |
echo " PHP CGI: " $(localwp_site_info_query ".services.php.ports.cgi[0]" "${S}") | |
echo " MailPit UI: " $(localwp_site_info_query ".services.mailpit.ports.WEB[0]" "${S}") | |
echo " MailPit SMTP: " $(localwp_site_info_query ".services.mailpit.ports.SMTP[0]" "${S}") | |
echo "URLs:" | |
echo " Website: " http://$(localwp_site_info_query ".domain" "${S}")/ | |
echo " Mailpit: " http://$(localwp_site_info_query ".domain" "${S}"):$(localwp_site_info_query ".services.mailpit.ports.WEB[0]" "${S}")/ | |
} | |
function localwp { | |
if [ "" = "$1" ]; then | |
echo "Usage: localwp <command>" | |
echo "Commands:" | |
echo " start <site> Start a LocalWP site by name" | |
echo " stop <site> Stop a LocalWP site by name" | |
echo " restart <site> Restart a LocalWP site by name" | |
echo " status <site> Get the status of a LocalWP site by name" | |
echo " list List all LocalWP sites" | |
echo " selfupdate Update this script" | |
echo " selfedit Edit this script with editor defined in \$EDITOR" | |
return 1 | |
fi | |
if [ "yes" = $AUTO_START_LOCALWP_APP ]; then | |
localwp_launch_localwp | |
fi | |
local CURSITE="$LOCALWP_SITE_ID" | |
[ "$2" != "" ] && CURSITE=$(localwp_siteid_from_name "$2") | |
if [ "start" = "$1" ]; then | |
"$LOCAL_CLI" start-site "$CURSITE" | |
elif [ "stop" = "$1" ]; then | |
"$LOCAL_CLI" stop-site "$CURSITE" | |
elif [ "restart" = "$1" ]; then | |
"$LOCAL_CLI" stop-site "$CURSITE" | |
"$LOCAL_CLI" start-site "$CURSITE" | |
elif [ "status" = "$1" ]; then | |
"$LOCAL_CLI" list-sites | grep -- "$CURSITE" | |
elif [ "info" = "$1" ]; then | |
localwp_print_info "$CURSITE" | |
elif [ "list" = "$1" ]; then | |
"$LOCAL_CLI" list-sites | |
elif [ "selfreload" = "$1" ]; then | |
echo "Reloading localwp script..." | |
source "$ZSH_AUTO_LOCALWP_PATH" | |
elif [ "selfupdate" = "$1" ]; then | |
echo "Updating localwp script..." | |
cd "$(dirname "$ZSH_AUTO_LOCALWP_PATH")" || { echo "Failed to change directory to $(dirname "$ZSH_AUTO_LOCALWP_PATH")"; return 1; } | |
# fetch the latest version from the gist | |
[ -d .git ] && git pull || { echo "Not a git repository, cannot update."; return 1; } | |
cd - >/dev/null || { echo "Failed to return to previous directory."; return 1; } | |
echo "Update complete." | |
elif [ "selfedit" = "$1" ]; then | |
if [ -z "$EDITOR" ]; then | |
echo "No editor defined in \$EDITOR, please set it to your preferred editor." | |
return 1 | |
fi | |
echo "$EDITOR" "$ZSH_AUTO_LOCALWP_PATH" >&2 | |
"$EDITOR" "$ZSH_AUTO_LOCALWP_PATH" | |
else | |
echo "Unknown command: $1" | |
return 1 | |
fi | |
} | |
# autoload the hook | |
autoload -U add-zsh-hook | |
add-zsh-hook chpwd localwp_auto_switch |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment