summaryrefslogtreecommitdiff
path: root/Completion/Base
diff options
context:
space:
mode:
authorAdam Spiers <adamspiers@users.sourceforge.net>2000-08-02 13:45:51 +0000
committerAdam Spiers <adamspiers@users.sourceforge.net>2000-08-02 13:45:51 +0000
commitfd15ea0fb5f43a05647e9755f2c86aabd6ee95f8 (patch)
tree30430d5582628b202d8932a8d85576b0970edbf7 /Completion/Base
parentb2aebcad027eab3339677eb790bfa41b37c3aef0 (diff)
downloadzsh-fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8.tar.gz
zsh-fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8.zip
12486: new completion caching layer
Diffstat (limited to 'Completion/Base')
-rw-r--r--Completion/Base/.distfiles6
-rw-r--r--Completion/Base/_cache_invalid21
-rw-r--r--Completion/Base/_retrieve_cache31
-rw-r--r--Completion/Base/_store_cache36
4 files changed, 91 insertions, 3 deletions
diff --git a/Completion/Base/.distfiles b/Completion/Base/.distfiles
index a906bfc76..0cbe1f97f 100644
--- a/Completion/Base/.distfiles
+++ b/Completion/Base/.distfiles
@@ -1,7 +1,7 @@
DISTFILES_SRC='
.distfiles
- _arg_compile _arguments _brace_parameter _combination
+ _arg_compile _arguments _brace_parameter _cache_invalid _combination
_command_names _condition _default _describe _equal _first _in_vared
- _jobs _math _parameter _precommand _redirect _regex_arguments _subscript
- _tilde _value _values
+ _jobs _math _parameter _precommand _redirect _regex_arguments
+ _retrieve_cache _store_cache _subscript _tilde _value _values
'
diff --git a/Completion/Base/_cache_invalid b/Completion/Base/_cache_invalid
new file mode 100644
index 000000000..e55381439
--- /dev/null
+++ b/Completion/Base/_cache_invalid
@@ -0,0 +1,21 @@
+#autoload
+#
+# Function to decide whether a completions cache needs rebuilding
+
+local _cache_ident _cache_dir _cache_path _cache_policy
+_cache_ident="$1"
+
+# If the cache is disabled, we never want to rebuild it, so pretend
+# it's valid.
+zstyle -t ":completion:${curcontext}:" use-cache || return 1
+
+zstyle -s ":completion:${curcontext}:" cache-path _cache_dir
+: ${_cache_dir:=${ZDOTDIR:-$HOME}/.zcompcache}
+_cache_path="$_cache_dir/$_cache_ident"
+
+# See whether the caching policy says that the cache needs rebuilding
+# (the policy will return 0 if it does).
+zstyle -s ":completion:${curcontext}:" cache-policy _cache_policy
+[[ -n "$_cache_policy" ]] && "$_cache_policy" "$_cache_path" && return 0
+
+return 1
diff --git a/Completion/Base/_retrieve_cache b/Completion/Base/_retrieve_cache
new file mode 100644
index 000000000..6a82cd48b
--- /dev/null
+++ b/Completion/Base/_retrieve_cache
@@ -0,0 +1,31 @@
+#autoload
+#
+# Retrieval component of completions caching layer
+
+local _cache_ident _cache_dir _cache_path _cache_policy
+_cache_ident="$1"
+
+if zstyle -t ":completion:${curcontext}:" use-cache; then
+ # Decide which directory to retrieve cache from, and ensure it exists
+ zstyle -s ":completion:${curcontext}:" cache-path _cache_dir
+ : ${_cache_dir:=${ZDOTDIR:-HOME}/.zcompcache}
+ if [[ ! -d "$_cache_dir" ]]; then
+ [[ -e "$_cache_dir" ]] &&
+ _message "cache-dir ($_cache_dir) isn't a directory\!"
+ return 1
+ fi
+
+ _cache_path="$_cache_dir/$_cache_ident"
+
+ if [[ -e "$_cache_path" ]]; then
+ _cache_invalid "$_cache_ident" && return 1
+
+ . "$_cache_path"
+ return 0
+ else
+ return 1
+ fi
+else
+ return 1
+fi
+
diff --git a/Completion/Base/_store_cache b/Completion/Base/_store_cache
new file mode 100644
index 000000000..2fe7dfcb6
--- /dev/null
+++ b/Completion/Base/_store_cache
@@ -0,0 +1,36 @@
+#autoload
+#
+# Storage component of completions caching layer
+
+local _cache_ident
+_cache_ident="$1"
+
+if zstyle -t ":completion:${curcontext}:" use-cache; then
+ # Decide which directory to cache to, and ensure it exists
+ zstyle -s ":completion:${curcontext}:" cache-path _cache_dir
+ : ${_cache_dir:=${ZDOTDIR:-$HOME}/.zcompcache}
+ if [[ ! -d "$_cache_dir" ]]; then
+ if [[ -e "$_cache_dir" ]]; then
+ _message "cache-dir style points to a non-directory\!"
+ else
+ mkdir -p "$_cache_dir"
+ if [[ ! -d "$_cache_dir" ]]; then
+ _message "Couldn't create cache-dir $_cache_dir"
+ return 1
+ fi
+ fi
+ fi
+
+ shift
+ for var; do
+ case ${(Pt)var} in
+ (*readonly*) ;;
+ (*(association|array)*) print -r "$var=( ${(kv@Pqq)^^var} )";;
+ (*) print -r "$var=${(Pqq)^^var}";;
+ esac
+ done >! "$_cache_dir/$_cache_ident"
+else
+ return 1
+fi
+
+return 0