150 lines
5 KiB
Bash
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
|
|
}
|