foxshell/fn/-z4h-cmd-update
2025-07-04 11:48:40 -05:00

82 lines
2.5 KiB
Bash

#!/usr/bin/env zsh
eval "$_z4h_opt"
-z4h-check-core-params || return
if (( ARGC )); then
print -Pru2 -- '%F{3}z4h%f: unexpected %F{1}update%f argument'
return '_z4h_err()'
fi
if (( _z4h_dangerous_root )); then
print -Pru2 -- "%F{3}z4h%f: refusing to %Bupdate%b as %F{1}root%f"
return 1
fi
local old=$Z4H.old.$$
local new=$Z4H.new.$$
{
zf_rm -rf -- $old $new || return
zf_mkdir -p -- $new || return
print -n >$new/.updating || return
Z4H_UPDATING=$Z4H Z4H=$new </dev/null >/dev/null $_z4h_exe -ic '
(( $? )) && "exit" "1"
"builtin" "emulate" "zsh" "-o" "no_aliases"
[[ $Z4H == '${(q)new}' ]] || exit 0
print -n >$Z4H/tmp/update-successful' || return
if [[ ! -e $new/tmp/update-successful ]]; then
local home=~
local zdotdir=${${${(q)ZDOTDIR}/#${(q)home}/'~'}//\%/%%}
local z4h=${${${(q)Z4H}/#${(q)home}/'~'}//\%/%%}
print -Pru2 -- '%F{3}z4h%f: %B$Z4H%b %F{1}does not propagate%f through %U.zshrc%u'
print -Pru2 -- ''
print -Pru2 -- 'Change %U'$zdotdir'/.zshrc%u to keep %BZ4H%b intact if already set.'
print -Pru2 -- ''
print -Pru2 -- 'For example:'
print -Pru2 -- ''
print -Pru2 -- ' %F{2}:%f %F{3}"${Z4H:=${XDG_CACHE_HOME:-$HOME/.cache}/zsh4humans}"%f'
print -Pru2 -- ''
print -Pru2 -- 'Note: The leading colon (%F{2}:%f) is necessary.'
return 1
fi
zf_rm -- $new/tmp/update-successful || return
zf_rm -- $new/.updating || return
-z4h-mv $Z4H $old 2>/dev/null || zf_rm -rf -- $Z4H || return
if [[ -e $Z4H ]]; then
local home=~
local z4h=${${${(q)Z4H}/#${(q)home}/'~'}//\%/%%}
print -Pru2 -- '%F{3}z4h%f: %F{1}cannot delete %U'$z4h'%u%f'
print -Pru2 -- ''
print -Pru2 -- 'This might help:'
print -Pru2 -- ''
print -Pru2 -- ' %F{2}%Ucommand%u %Usudo%u rm%f -rf -- %U'$z4h'%u && %U%F{2}exec%u zsh%f'
print -Pru2 -- ''
print -Pru2 -- '%F{3}z4h%f: attempting to recover'
if [[ ! -e $Z4H/stickycache ]]; then
command cp -r -- $new/stickycache $Z4H/stickycache || true
fi
if [[ -o zle ]]; then
exec -- $_z4h_exe -i || return
else
exec -- $_z4h_exe -i --no-zle || return
fi
fi
-z4h-mv $new $Z4H || return
} always {
if (( $? )); then
-z4h-error-command update
fi
zf_rm -rf -- $old $new || return
}
print -Pru2 -- "%F{3}z4h%f: %Bupdate successful%b"
print -Pru2 -- "%F{3}z4h%f: restarting %F{2}zsh%f"
if [[ -o zle ]]; then
exec -- $_z4h_exe -i || return
else
exec -- $_z4h_exe -i --no-zle || return
fi