foxshell/fn/-z4h-direnv-hook
2025-07-04 11:48:40 -05:00

81 lines
1.7 KiB
Bash

#!/usr/bin/env zsh
eval "$_z4h_opt"
unset _z4h_direnv_err
if (( ARGC )); then
local direnv=$1
else
local direnv=${commands[direnv]-}
if [[ -z $direnv ]]; then
unset _z4h_direnv_sig
return 1
fi
fi
# { print -n '\x1f\x8b\x08\x00\x00\x00\x00\x00'; base64 -d <<<${${DIRENV_WATCHES//-/+}//_//} } | zcat 2>/dev/null
# zcat
# gzcat
# uncompress -c
# gunzip -c
# gzip -cd
local sig
local envrc=(./(../)#.envrc(NY1:a))
if (( $#envrc )); then
local -a deps=(
${XDG_DATA_HOME:-~/.local/share}/direnv/allow
${XDG_CONFIG_HOME:-~/.config}/{direnv.toml,config.toml})
local -a stat
local files=($^deps(N))
local non_files=(${deps:|files})
if zstat -A stat +mtime -- $envrc $files 2>/dev/null; then
local sig=$envrc$'\0'${(pj:\0:)stat}
else
local sig=stat-error
fi
elif [[ ! -v DIRENV_WATCHES ]]; then
typeset -g _z4h_direnv_sig=none
return
else
local sig=none
fi
[[ $sig == ${_z4h_direnv_sig-} ]] && return
unset _z4h_direnv_sig
local data
data=$(
local out
out=$($direnv export zsh) 2>&1
builtin printf '%s%18d%d' "$out" $#out $(( ! $? ))
) || return
local -i success=$data[-1]
local -i out_len=$data[-19,-2]
local out=$data[-out_len-19,-20]
local err=${data[1,-out_len-20]%%$'\n'#}
if [[ -n $err ]]; then
local ctx=:z4h:direnv:
(( success )) && ctx+='success' || ctx+='error'
if zstyle -T $ctx notify; then
if builtin zle; then
typeset -g _p9k__raw_msg=${err//\%/%%}$'\n'
else
print -ru2 -- $err
fi
fi
fi
emulate -L zsh
if [[ ! -v __p9k_trapped ]]; then
local -i __p9k_trapped
builtin trap : INT
builtin trap "builtin trap ${(q)__p9k_trapint:--} INT" EXIT
fi
builtin eval -- $out
typeset -g _z4h_direnv_sig=$sig