]> arthur.barton.de Git - ax-zsh.git/blobdiff - bin/axzshctl
axzshctl: Use /usr/bin/env shebang to call zsh
[ax-zsh.git] / bin / axzshctl
index 0e310a4244cbb6c16d94a43002f19b330f42d13e..9d5eff027a2dc60f9ae31b75c8a839eaed48de24 100755 (executable)
@@ -1,7 +1,7 @@
-#!/bin/zsh
+#!/usr/bin/env zsh
 #
 # AX-ZSH: Alex' Modular ZSH Configuration
-# Copyright (c) 2015 Alexander Barton <alex@barton.de>
+# Copyright (c) 2015-2016 Alexander Barton <alex@barton.de>
 #
 
 # Include "ax-common.sh", if available:
@@ -12,10 +12,6 @@ for dir ("$HOME/lib" "$HOME/.ax" /usr/local /opt/ax /usr); do
 done
 if [[ -z "$ax_common_sourced" ]]; then
        function ax_msg {
-               case "$1" in
-                 "1"|"2") echo -n "! "; ;;
-                 *) echo -n "* "; ;;
-               esac
                shift
                echo "$@"
        }
@@ -37,25 +33,53 @@ function Usage {
        echo "  enable-default-plugins"
        echo "    Enable all default plugins."
        echo
+       echo "  check-plugins"
+       echo "    Detect plugins which are \"useful\" on this system."
+       echo
+       echo "  set-theme <name>|-"
+       echo "    Set active theme to <name>, or to the default."
+       echo
        echo "  upgrade"
        echo "    Upgrade AX-ZSH installation (requires Git)."
        echo
        exit 2
 }
 
+function NormalizedPluginName {
+       if [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_-]+$" ]]; then
+               echo "$1" | sed -e 's|/|#|g'
+       elif [[ "$1" =~ "/" ]]; then
+               basename "$1"
+       else
+               echo "$1"
+       fi
+}
+
 function EnablePlugin {
+       local plugin=$(NormalizedPluginName "$1")
        local dir="$AXZSH/active_plugins"
 
-       if [[ -h "$dir/$1" ]]; then
+       if [[ -h "$dir/$plugin" ]]; then
                ax_msg 1 "Plugin \"$1\" already active!"
                return 1
        fi
 
+       if [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_-]+$" ]]; then
+               # GitHub plugin
+               mkdir -p "$AXZSH/repos"
+               if [[ ! -e "$AXZSH/repos/$plugin" ]]; then
+                       ax_msg - "Cloning plugin from GitHub ..."
+                       git clone "https://github.com/$1.git" \
+                        "$AXZSH/repos/$plugin"
+               fi
+       fi
+
        for dname (
                "$plugin:A"
                "$AXZSH_PLUGIN_D/$plugin"
                "$ZSH_CUSTOM/$plugin"
                "$AXZSH/custom_plugins/$plugin"
+               "$AXZSH/repos/$plugin"
                "$AXZSH/plugins/$plugin"
                "$AXZSH/default_plugins/$plugin"
                "$AXZSH/core/$plugin"
@@ -74,25 +98,32 @@ function EnablePlugin {
 }
 
 function DisablePlugin {
+       local plugin=$(NormalizedPluginName "$1")
        local dir="$AXZSH/active_plugins"
 
-       if [[ ! -h "$dir/$1" ]]; then
+       if [[ ! -h "$dir/$plugin" ]]; then
                ax_msg 1 "Plugin \"$1\" not active?"
                return 1
        fi
 
-       rm -v "$dir/$1"
-       return $?
+       rm -v "$dir/$plugin"; r=$?
+       [ $r -eq 0 ] && rm -fr "$AXZSH/repos/$plugin"
+       return $r
 }
 
 function ResetPlugins {
        local dir="$AXZSH/active_plugins"
+       local r1=0, r2=0
 
        if [[ -e "$dir" ]]; then
                ax_msg - "Removing all symbolic links in $dir ..."
-               find "$dir" -type l -print -delete
+               find "$dir" -type l -print -delete; r1=$?
        fi
-       return $?
+
+       ax_msg - "Removing all external repositories in \"$AXZSH/repos\" ..."
+       rm -fr "$AXZSH/repos"; r2=$?
+
+       [[ $r1 == 0 && $r2 == 0 ]] && return 0 || return 1
 }
 
 function EnableDefaultPlugins {
@@ -107,6 +138,35 @@ function EnableDefaultPlugins {
        return $?
 }
 
+function SetTheme {
+       local link_name="$AXZSH/active_theme"
+
+       if [ $# -ne 1 ]; then
+               echo "Usage: axzsh_set_theme <name|->"
+               return 1
+       fi
+
+       rm -f "$link_name" || return 1
+
+       if [ "$1" = "-" ]; then
+               echo "Theme settings have been reset."
+               return 0
+       fi
+
+       if [ -r "$1" ]; then
+               theme="$1"
+       elif [ -r "$AXZSH/custom_themes/$1.axzshtheme" ]; then
+               theme="$AXZSH/custom_themes/$1.axzshtheme"
+       elif [ -r "$AXZSH/themes/$1.axzshtheme" ]; then
+               theme="$AXZSH/themes/$1.axzshtheme"
+       else
+               echo "Theme \"$1\" not found!"
+               return 1
+       fi
+       ln -sv "$theme" "$link_name" || return 1
+       return $?
+}
+
 function UpgradeAXZSH {
        if [[ $+commands[git] -eq 0 ]]; then
                ax_msg 2 "The git(1) command is not available!"
@@ -121,7 +181,88 @@ function UpgradeAXZSH {
        ( cd "$AXZSH" && git pull --ff-only )
 }
 
-NAME="$(basename "$0")"
+function UpgradeForeignPlugins {
+       if [[ $+commands[git] -eq 0 ]]; then
+               ax_msg 2 "The git(1) command is not available!"
+               return 1
+       fi
+
+       for dir ($AXZSH/repos/*(N)); do
+               name=$(basename "$dir" | sed -e 's|#|/|g')
+               if [ -d "$dir/.git" ]; then
+                       ax_msg - "Upgrading \"$name\" [git] ..."
+                       (
+                               cd "$dir"
+                               git pull --ff-only || ax_msg 2 "Pull failed!"
+                       )
+               else
+                       ax_msg 2 "Unknown repository type!"
+               fi
+       done
+}
+
+function CheckPlugins {
+       missing_plugins=()
+       invalid_plugins=()
+
+       ax_msg - "Checking plugins ..."
+       for dir ($AXZSH/plugins/*(N)); do
+               plugin=$(basename "$dir")
+
+               # Test if plugin is already enabled
+               [[ -e "$AXZSH/active_plugins/$plugin" ]] \
+                       && enabled=" (enabled)" \
+                       || unset enabled
+
+               # Test plugin ...
+               printf " - \"%s\"%s ... " "$plugin" "$enabled"
+               new_plugin=""
+               for script ($AXZSH/plugins/$plugin/$plugin.{zshrc,zprofile}); do
+                       [[ -r "$script" ]] || continue
+                       zsh -i -c "AXZSH_PLUGIN_CHECK=1 source $script"; r=$?
+                       if [[ $r -eq 0 ]]; then
+                               new_plugin=$plugin
+                               break
+                       fi
+               done
+               if [[ -n "$new_plugin" ]]; then
+                       detected_plugins+=($new_plugin)
+                       [[ -n "$enabled" ]] || missing_plugins+=($new_plugin)
+                       ax_msg 0 "OK."
+               elif [[ $r -eq 91 ]]; then
+                       ax_msg 1 "ignored."
+               elif [[ $r -eq 92 ]]; then
+                       ax_msg 1 "optional."
+               else
+                       [[ -n "$enabled" ]] && invalid_plugins+=($plugin)
+                       ax_msg 2 "failed."
+               fi
+       done
+       echo
+
+       result=0
+       if [[ -n "$missing_plugins" ]]; then
+               ax_msg 1 "Run the following command to enable all missing plugins:"
+               echo "$AXZSH/bin/axzshctl enable-plugin" $missing_plugins
+               echo
+               result=1
+       else
+               ax_msg 0 "All detected plugins are already enabled."
+       fi
+
+       if [[ -n "$invalid_plugins" ]]; then
+               ax_msg 1 "Run the following command to disable all failed plugins:"
+               echo "$AXZSH/bin/axzshctl disable-plugin" $invalid_plugins
+               result=1
+       else
+               ax_msg 0 "No failed plugins are enabled."
+       fi
+
+       echo
+       return $result
+}
+
+NAME="$0:t"
 
 [[ $# -gt 0 ]] || Usage
 
@@ -155,9 +296,18 @@ case "$cmd" in
                [[ $# -eq 0 ]] || Usage
                EnableDefaultPlugins
                ;;
+       "check-plugins")
+               [[ $# -eq 0 ]] || Usage
+               CheckPlugins
+               ;;
+       "set-theme")
+               [[ $# -eq 1 ]] || Usage
+               SetTheme "$1"
+               ;;
        "upgrade")
                [[ $# -eq 0 ]] || Usage
                UpgradeAXZSH
+               UpgradeForeignPlugins
                ;;
        *)
                Usage