diff options
author | Adam Spiers <adamspiers@users.sourceforge.net> | 2000-08-02 13:45:51 +0000 |
---|---|---|
committer | Adam Spiers <adamspiers@users.sourceforge.net> | 2000-08-02 13:45:51 +0000 |
commit | fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8 (patch) | |
tree | 30430d5582628b202d8932a8d85576b0970edbf7 /Completion/Base | |
parent | b2aebcad027eab3339677eb790bfa41b37c3aef0 (diff) | |
download | zsh-fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8.tar.gz zsh-fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8.tar.xz zsh-fd15ea0fb5f43a05647e9755f2c86aabd6ee95f8.zip |
12486: new completion caching layer
Diffstat (limited to 'Completion/Base')
-rw-r--r-- | Completion/Base/.distfiles | 6 | ||||
-rw-r--r-- | Completion/Base/_cache_invalid | 21 | ||||
-rw-r--r-- | Completion/Base/_retrieve_cache | 31 | ||||
-rw-r--r-- | Completion/Base/_store_cache | 36 |
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 |