foxshell/fn/-z4h-install-one
2025-07-04 11:48:40 -05:00

150 lines
5 KiB
Bash

#!/usr/bin/env zsh
local url postinstall command
if [[ $1 == */* ]]; then
if [[ $1 == *@* ]]; then
url=https://github.com/${1%%@*}/archive/${1#*@}.tar.gz
1=${1%%@*}
else
url=https://github.com/$1/archive/master.tar.gz
fi
if ! zstyle -s :z4h:$1 postinstall postinstall; then
case $1 in
ohmyzsh/ohmyzsh)
postinstall=-z4h-postinstall-ohmyzsh
;;
MichaelAquilina/zsh-you-should-use)
postinstall=-z4h-postinstall-zsh-you-should-use
;;
wfxr/forgit)
postinstall=-z4h-postinstall-forgit
;;
changyuheng/fz)
postinstall=-z4h-postinstall-fz
;;
zsh-users/(zsh-syntax-highlighting|zsh-autosuggestions|zsh-history-substring-search))
postinstall=-z4h-postinstall-zsh-users
;;
*)
postinstall=
;;
esac
fi
else
local -a channel
zstyle -a :z4h:$1 channel channel || channel=(stable)
local tmux_cmd='sh -- '${(q)Z4H}/zsh4humans/sc/install-tmux' -d "${Z4H_PACKAGE_DIR}" -q'
tmux_cmd+=' && print -r -- "$EPOCHREALTIME" >"${Z4H_PACKAGE_DIR}"/stamp'
local brew_cmd='command brew tap --quiet homebrew/command-not-found && zf_mkdir -- "${Z4H_PACKAGE_DIR}"'
case $#channel-$channel[1] in
2-command) command=$channel[2];;
1-stable|1-testing)
case $1 in
tmux) command=$tmux_cmd;;
homebrew-command-not-found) command=$brew_cmd;;
terminfo) url=https://github.com/romkatv/terminfo/archive/v1.4.0.tar.gz;;
*) url=https://github.com/zsh4humans/$1/archive/z4h-$channel[1].tar.gz;;
esac
;;
1-dev)
case $1 in
fzf) url=https://github.com/junegunn/$1/archive/master.tar.gz;;
powerlevel10k) url=https://github.com/romkatv/$1/archive/master.tar.gz;;
systemd) url=https://github.com/systemd/$1/archive/master.tar.gz;;
zsh-completions) url=https://github.com/zsh-users/$1/archive/master.tar.gz;;
zsh-autosuggestions) url=https://github.com/zsh-users/$1/archive/master.tar.gz;;
zsh-syntax-highlighting) url=https://github.com/zsh-users/$1/archive/master.tar.gz;;
zsh-history-substring-search) url=https://github.com/zsh-users/$1/archive/master.tar.gz;;
terminfo) url=https://github.com/romkatv/terminfo/archive/v1.3.0.tar.gz;;
tmux) command=$tmux_cmd;;
homebrew-command-not-found) command=$brew_cmd;;
*)
print -Pru2 -- "%F{3}z4h%f: %F{1}internal error%f: unknown package: ${1//\%/%%}"
return 1
;;
esac
;;
1-none)
zf_mkdir -p -- $Z4H/$1 || return
return
;;
*)
print -Pru2 -- '%F{3}z4h%f: invalid zstyle'
print -Pru2 -- ''
print -Pru2 -- " %F{2}zstyle%f :z4h:${(q)1//\%/%%} channel %F{1}${(j: :)${(@q)channel//\%/%%}}%f"
print -Pru2 -- ''
print -Pru2 -- 'Supported values: %Bstable%b, %Btesting%b and %Bdev%b.'
return 1
;;
esac
(( $+functions[-z4h-postinstall-$1] )) && postinstall=-z4h-postinstall-$1
fi
local suf
[[ $1 == systemd ]] && suf=' completions'
if [[ -e $Z4H/.updating ]]; then
print -Pru2 -- "%F{3}z4h%f: updating %B${1//\%/%%}%b$suf"
else
print -Pru2 -- "%F{3}z4h%f: installing %B${1//\%/%%}%b$suf"
fi
local dst=$Z4H/$1
zf_mkdir -p -- ${dst:h} 2>/dev/null || zf_mkdir -p -- ${dst:h} || return
local old new
{
if (( $+commands[mktemp] )); then
old="$(command mktemp -d -- $dst.old.XXXXXXXXXX)" || return
new="$(command mktemp -d -- $dst.new.XXXXXXXXXX)" || return
else
old=$dst.old.$$
new=$dst.new.$$
zf_rm -rf -- $old $new || return
zf_mkdir -p -- $old $new || return
fi
local Z4H_PACKAGE_NAME=$1 Z4H_PACKAGE_DIR=$new/${1:t}
if [[ -n $command ]]; then
() { eval $command } || return 1
if [[ ! -d $Z4H_PACKAGE_DIR ]]; then
print -Pru2 -- "%F{3}z4h%f: custom command failed to install: %F{1}${Z4H_PACKAGE_DIR//\%/%%}%f"
return 1
fi
else
local err
if (( $+commands[curl] )); then
err="$(command curl -fsSL -- $url 2>&1 >$new/snapshot.tar.gz)"
elif (( $+commands[wget] )); then
err="$(command wget -O- -- $url 2>&1 >$new/snapshot.tar.gz)"
else
print -Pru2 -- "%F{3}z4h%f: please install %F{1}curl%f or %F{1}wget%f"
return 1
fi
if (( $? )); then
print -ru2 -- $err
print -Pru2 -- "%F{3}z4h%f: failed to download %F{1}${url//\%/%%}%f"
return 1
fi
command tar -C $new -xzf $new/snapshot.tar.gz || return
local dirs=($new/*-*(N/))
if (( $#dirs != 1 )); then
print -Pru2 -- "%F{3}z4h%f: invalid content: %F{1}${url//\%/%%}%f"
return 1
fi
if [[ $dirs[1] != $new/${1:t} ]]; then
-z4h-mv $dirs[1] $new/${1:t} || return
fi
fi
eval $postinstall || return
[[ ! -e $dst ]] || -z4h-mv $dst $old/${1:t} 2>/dev/null || zf_rm -rf -- $dst || return
-z4h-mv $new/${1:t} $dst || return
} always {
[[ -z $old && -z $new ]] || zf_rm -rf -- $old $new
}