From e7e6d3c6d9e7eaec9ca9f6557147b788821efc0f Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Mon, 3 Apr 2017 19:12:59 +0200 Subject: [PATCH] Implement caching of active plugins --- .gitignore | 1 + ax.zsh | 62 ++++++++++++++++++++++++++++++++++++++++++---------- bin/axzshctl | 12 ++++++++++ 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index ccaed66..a3dda39 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ active_plugins/ custom_plugins/ active_theme custom_themes/ +cache/ repos/ diff --git a/ax.zsh b/ax.zsh index de39ad8..555644d 100644 --- a/ax.zsh +++ b/ax.zsh @@ -7,11 +7,13 @@ script_type="$script_name[2,-1]" # Load plugin code of a given type. # - $1: plugin name # - $2: plugin type (optional; defaults to "zshrc") +# - $3: cache file (optional) function axzsh_load_plugin { dname="$1:A" plugin="$dname:t" [[ -z "$2" ]] && type="zshrc" || type="$2" fname="$dname/$plugin.$type" + cache_file="$3" # Strip repository prefix (like "alexbarton#test-plugin"): [[ "$plugin" =~ "#" ]] && plugin=$(echo $plugin | cut -d'#' -f2-) @@ -61,6 +63,21 @@ function axzsh_load_plugin { [[ -n "$AXZSH_DEBUG" ]] \ && echo " - $plugin ($type) ..." source "$fname" + + if [[ -n "$cache_file" ]]; then + # Add plugin data to cache + printf "# BEGIN: %s\ninit()\n{\n" "$fname" >>"$cache_file" + case "$fname" in + *"/repos/"*) + echo "[[ -n \"\$AXZSH_DEBUG\" ]] && echo ' - $plugin ($type): \"$fname\" ...'" >>$cache_file + echo "source '$fname'" >>$cache_file + ;; + *) + echo "[[ -n \"\$AXZSH_DEBUG\" ]] && echo ' - $plugin ($type, cached) ...'" >>$cache_file + "$cat_cmd" "$fname" >>"$cache_file" + esac + printf "}\ninit\n# END: %s\n\n" "$fname" >>"$cache_file" + fi fi # It is a success, even if only the plugin directory (and no script!) @@ -91,20 +108,43 @@ fi [[ -n "$AXZSH_DEBUG" ]] && echo "» $script_name:" -# Setup list of plugins to load: -typeset -U plugin_list -plugin_list=( - "$AXZSH/core/"[0-5]* - "$AXZSH/active_plugins/"*(N) - "$AXZSH/core/"[6-9]* -) +# Initialize cache +mkdir -p "$AXZSH/cache" +cache_file="$AXZSH/cache/$script_type.cache" + +cat_cmd=${commands[cat]:-cat} + +if [[ -r "$cache_file" ]]; then + # Cache file exists, use it! + [[ -n "$AXZSH_DEBUG" ]] \ + && echo " - Reading cache file \"$cache_file\" ..." + source "$cache_file" +else + # No cache file available. + # Setup list of plugins to load: + typeset -U plugin_list + plugin_list=( + "$AXZSH/core/"[0-5]* + "$AXZSH/active_plugins/"*(N) + "$AXZSH/core/"[6-9]* + ) + + # Create new cache file: + if [[ -n "$cache_file" ]]; then + [[ -n "$AXZSH_DEBUG" ]] \ + && echo " (Writing new cache file to \"$cache_file\" ...)" + printf "# %s\n\n" "$(LC_ALL=C date)" >"$cache_file" + fi -# Read in all the plugins for the current "type": -for plugin ($plugin_list); do - axzsh_load_plugin "$plugin" "$script_type" -done + # Read in all the plugins for the current "type": + for plugin ($plugin_list); do + axzsh_load_plugin "$plugin" "$script_type" "$cache_file" + done +fi # Clean up ... unfunction axzsh_load_plugin unset script_name script_type plugin unset plugin_list +unset cache_file +unset cat_cmd diff --git a/bin/axzshctl b/bin/axzshctl index ed5b637..6434a52 100755 --- a/bin/axzshctl +++ b/bin/axzshctl @@ -49,6 +49,12 @@ function Usage { exit 2 } +function DropCache { + [[ -r "$AXZSH/cache" ]] \ + && echo "Dropping caches ..." + rm -rf "$AXZSH/cache" +} + function NormalizedPluginName { if [[ "$1" =~ "^[[:alnum:]-]+/[[:alnum:]_-]+$" ]]; then echo "${1:gs/\//#}" @@ -321,12 +327,14 @@ case "$cmd" in for plugin in "$@"; do EnablePlugin "$plugin" done + DropCache ;; "disable-plugin") [[ $# -gt 0 ]] || Usage for plugin in "$@"; do DisablePlugin "$plugin" done + DropCache ;; "list-enabled") [[ $# -eq 0 ]] || Usage @@ -336,10 +344,12 @@ case "$cmd" in [[ $# -eq 0 ]] || Usage ResetPlugins EnableDefaultPlugins + DropCache ;; "enable-default-plugins") [[ $# -eq 0 ]] || Usage EnableDefaultPlugins + DropCache ;; "check-plugins") [[ $# -eq 0 ]] || Usage @@ -348,11 +358,13 @@ case "$cmd" in "set-theme") [[ $# -eq 1 ]] || Usage SetTheme "$1" + DropCache ;; "upgrade") [[ $# -eq 0 ]] || Usage UpgradeAXZSH UpgradeForeignPlugins + DropCache ;; *) Usage -- 2.39.2