add two-level fs cache and use it everywhere instead of the one-level cache

pull/260/head
romkatv 5 years ago
parent 7f3637ee0d
commit ab160b49f5

@ -269,6 +269,63 @@ _p9k_cache_get() {
[[ -n $v ]] && _p9k_cache_val=("${(@0)${v[1,-2]}}")
}
_p9k_cache_stat_get() {
local -H stat
local label=$1 f
shift
_p9k_cache_stat_meta=
_p9k_cache_stat_fprint=
for f; do
if zstat -H stat -- $f 2>/dev/null; then
_p9k_cache_stat_meta+="${(q)f} $stat[inode] $stat[mtime] $stat[size] $stat[mode]; "
fi
done
if _p9k_cache_get $0 $label meta "$@" && [[ $_p9k_cache_val[1] == $_p9k_cache_stat_meta ]]; then
_p9k_cache_stat_fprint=$_p9k_cache_val[2]
local -a key=($0 $label fprint "$@" "$_p9k_cache_stat_fprint")
_p9k_cache_fprint_key="${(pj:\0:)key}"
shift 2 _p9k_cache_val
return
fi
if (( $+commands[md5] )); then
local -a md5=(md5 -q)
elif (( $+commands[md5sum] )); then
local -a md5=(md5sum -b)
else
return 1
fi
local fprint
for f; do
if fprint="$($md5 $f 2>/dev/null)"; then
_p9k_cache_stat_fprint+="${(q)fprint} "
fi
done
local meta_key=$_p9k_cache_key
if _p9k_cache_get $0 $label fprint "$@" "$_p9k_cache_stat_fprint"; then
_p9k_cache_fprint_key=$_p9k_cache_key
_p9k_cache_key=$meta_key
_p9k_cache_set "$_p9k_cache_stat_meta" "$_p9k_cache_stat_fprint" "$_p9k_cache_val[@]"
shift 2 _p9k_cache_val
return
fi
_p9k_cache_fprint_key=$_p9k_cache_key
_p9k_cache_key=$meta_key
return 1
}
_p9k_cache_stat_set() {
_p9k_cache_set "$_p9k_cache_stat_meta" "$_p9k_cache_stat_fprint" "$@"
_p9k_cache_key=$_p9k_cache_fprint_key
_p9k_cache_set "$@"
}
# _p9k_param prompt_foo_BAR BACKGROUND red
_p9k_param() {
local key="_p9k_param ${(pj:\0:)*}"
@ -895,17 +952,14 @@ prompt_aws_eb_env() {
dir=${dir:h}
done
local -H stat
zstat -H stat -- $dir/.elasticbeanstalk/config.yml 2>/dev/null || return
local sig="$stat[inode].$stat[mtime].$stat[size].$stat[mode]"
if ! _p9k_cache_get $0 $dir || [[ $_p9k_cache_val[1] != $sig ]]; then
if ! _p9k_cache_stat_get $0 $dir/.elasticbeanstalk/config.yml; then
local env
env="$(command eb list 2>/dev/null)" || env=
env="${${(@M)${(@f)env}:#\* *}#\* }"
_p9k_cache_set "$sig" "$env"
_p9k_cache_stat_set "$env"
fi
[[ -n $_p9k_cache_val[2] ]] || return
_p9k_prompt_segment "$0" black green 'AWS_EB_ICON' 0 '' "${_p9k_cache_val[2]//\%/%%}"
[[ -n $_p9k_cache_val[1] ]] || return
_p9k_prompt_segment "$0" black green 'AWS_EB_ICON' 0 '' "${_p9k_cache_val[1]//\%/%%}"
}
################################################################
@ -1294,12 +1348,10 @@ prompt_dir() {
for pat in $_POWERLEVEL9K_DIR_PACKAGE_FILES; do
for pkg_file in $markers; do
[[ $pkg_file == $dir/${~pat} ]] || continue
local -H stat=()
zstat -H stat -- $pkg_file 2>/dev/null || continue
if ! _p9k_cache_get $0_pkg $stat[inode] $stat[mtime] $stat[size]; then
if ! _p9k_cache_stat_get $0_pkg $pkg_file; then
local pkg_name=''
pkg_name="$(jq -j '.name | select(. != null)' <$pkg_file 2>/dev/null)" || pkg_name=''
_p9k_cache_set "$pkg_name"
_p9k_cache_stat_set "$pkg_name"
fi
[[ -n $_p9k_cache_val[1] ]] || continue
parts[1,i]=($_p9k_cache_val[1])
@ -1667,12 +1719,10 @@ function _p9k_cached_cmd_stdout() {
local cmd=${commands[$1]:A}
[[ -n $cmd ]] || return
shift
local -H stat
zstat -H stat -- $cmd 2>/dev/null || return
if ! _p9k_cache_get $0 $stat[inode] $stat[mtime] $stat[size] $stat[mode] $cmd "$@"; then
if ! _p9k_cache_stat_get $0" ${(q)*}" $cmd; then
local out
out="$($cmd "$@" 2>/dev/null)"
_p9k_cache_set $(( ! $? )) "$out"
_p9k_cache_stat_set $(( ! $? )) "$out"
fi
(( $_p9k_cache_val[1] )) || return
_p9k_ret=$_p9k_cache_val[2]
@ -1682,12 +1732,10 @@ function _p9k_cached_cmd_stdout_stderr() {
local cmd=${commands[$1]:A}
[[ -n $cmd ]] || return
shift
local -H stat
zstat -H stat -- $cmd 2>/dev/null || return
if ! _p9k_cache_get $0 $stat[inode] $stat[mtime] $stat[size] $stat[mode] $cmd "$@"; then
if ! _p9k_cache_stat_get $0" ${(q)*}" $cmd; then
local out
out="$($cmd "$@" 2>&1)" # this line is the only diff with _p9k_cached_cmd_stdout
_p9k_cache_set $(( ! $? )) "$out"
_p9k_cache_stat_set $(( ! $? )) "$out"
fi
(( $_p9k_cache_val[1] )) || return
_p9k_ret=$_p9k_cache_val[2]
@ -2232,14 +2280,12 @@ prompt_date() {
prompt_todo() {
local todo=$commands[todo.sh]
[[ -n $todo && -r $_p9k_todo_file ]] || return
local -H stat
zstat -H stat -- $_p9k_todo_file 2>/dev/null || return
if ! _p9k_cache_get $0 $stat[inode] $stat[mtime] $stat[size]; then
if ! _p9k_cache_stat_get $0 $_p9k_todo_file; then
local count="$($todo -p ls | tail -1)"
if [[ $count == (#b)'TODO: '[[:digit:]]##' of '([[:digit:]]##)' '* ]]; then
_p9k_cache_set 1 $match[1]
_p9k_cache_stat_set 1 $match[1]
else
_p9k_cache_set 0 0
_p9k_cache_stat_set 0 0
fi
fi
(( $_p9k_cache_val[1] )) || return
@ -2944,15 +2990,7 @@ prompt_dir_writable() {
prompt_kubecontext() {
(( $+commands[kubectl] )) || return
local cfg
local -a key
for cfg in ${(s.:.)${KUBECONFIG:-$HOME/.kube/config}}; do
local -H stat
zstat -H stat -- $cfg 2>/dev/null || continue
key+=($cfg $stat[inode] $stat[mtime] $stat[size] $stat[mode])
done
if ! _p9k_cache_get $0 "${key[@]}"; then
if ! _p9k_cache_stat_get $0 ${(s.:.)${KUBECONFIG:-$HOME/.kube/config}}; then
local name namespace cluster cloud_name cloud_account cloud_zone cloud_cluster text state
() {
local cfg && cfg=(${(f)"$(kubectl config view -o=yaml 2>/dev/null)"}) || return
@ -3012,7 +3050,7 @@ prompt_kubecontext() {
fi
done
fi
_p9k_cache_set "$name" "$namespace" "$cluster" "$cloud_name" "$cloud_account" "$cloud_zone" "$cloud_cluster" "$text" "$state"
_p9k_cache_stat_set "$name" "$namespace" "$cluster" "$cloud_name" "$cloud_account" "$cloud_zone" "$cloud_cluster" "$text" "$state"
fi
typeset -g P9K_KUBECONTEXT_NAME=$_p9k_cache_val[1]
@ -3056,16 +3094,13 @@ prompt_java_version() {
prompt_azure() {
(( $+commands[az] )) || return
local -H stat
zstat -H stat -- ${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json 2>/dev/null || return
local sig="$stat[inode].$stat[mtime].$stat[size].$stat[mode]"
if ! _p9k_cache_get $0 || [[ $_p9k_cache_val[1] != $sig ]]; then
if ! _p9k_cache_stat_get $0 ${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json; then
local name
name="$(az account show --query name --output tsv 2>/dev/null)" || name=
_p9k_cache_set "$sig" "$name"
_p9k_cache_stat_set "$name"
fi
[[ -n $_p9k_cache_val[2] ]] || return
_p9k_prompt_segment "$0" "blue" "white" "AZURE_ICON" 0 '' "${_p9k_cache_val[2]//\%/%%}"
[[ -n $_p9k_cache_val[1] ]] || return
_p9k_prompt_segment "$0" "blue" "white" "AZURE_ICON" 0 '' "${_p9k_cache_val[1]//\%/%%}"
}
typeset -gra __p9k_nordvpn_tag=(
@ -3400,7 +3435,7 @@ function _p9k_dump_state() {
sysopen -a -m 600 -o creat,trunc -u fd $tmp || return
{
local include='_POWERLEVEL9K_*|_p9k_*|icons|OS|DEFAULT_COLOR|DEFAULT_COLOR_INVERTED'
local exclude='_p9k_gitstatus_*|_p9k_param_sig|_p9k_public_ip|_p9k_prompt|_p9k_prompt_idx|_p9k_dump_pid|_p9k_dump_scheduled|_p9k_async_pump_*'
local exclude='_p9k_gitstatus_*|_p9k_cache_stat_meta|_p9k_cache_stat_fprint|_p9k_cache_fprint_key|_p9k_param_sig|_p9k_public_ip|_p9k_prompt|_p9k_prompt_idx|_p9k_dump_pid|_p9k_dump_scheduled|_p9k_async_pump_*'
typeset -g __p9k_cached_param_sig=$_p9k_param_sig
typeset -p __p9k_cached_param_sig >&$fd || return
unset __p9k_cached_param_sig
@ -3731,6 +3766,9 @@ _p9k_init_vars() {
typeset -g _p9k_ret
typeset -g _p9k_cache_key
typeset -ga _p9k_cache_val
typeset -g _p9k_cache_stat_meta
typeset -g _p9k_cache_stat_fprint
typeset -g _p9k_cache_fprint_key
typeset -gA _p9k_cache
typeset -ga _p9k_t
typeset -g _p9k_n

Loading…
Cancel
Save