1
0
Fork 0
mirror of https://github.com/zdharma-continuum/zinit-annex-bin-gem-node.git synced 2025-01-30 16:58:17 +01:00
zinit-annex-bin-gem-node/za-bgn-atclone-handler
vladislav doster 121eae9ca0
style: consistent log prefix (#34)
Signed-off-by: Vladislav Doster <mvdoster@gmail.com>
2023-12-24 06:27:01 -06:00

299 lines
11 KiB
Bash

# Copyright (c) 2019-2020 Sebastian Gniazdowski
# License MIT
za-bgn-atclone-handler() {
emulate -RL zsh
setopt extendedglob warncreateglobal typesetsilent noshortloops
if [[ "$1" = plugin ]] {
local type="$1" user="$2" plugin="$3" id_as="$4" dir="${5#%}" hook="$6"
} else {
local type="$1" url="$2" id_as="$3" dir="${4#%}" hook="$5"
}
local nl=$'\n'
if [[ -n "${ICE[gem]}" ]] {
local -a gem_defs srcdst tmpsdst gems
gem_defs=( "${(s.;.)ICE[gem]}" )
local gem
for gem ( $gem_defs ) {
srcdst=( ${(@s.->.)gem} )
tmpsdst=( ${(@s.<-.)srcdst[1]} )
if (( ${#tmpsdst} > 1 )); then
srcdst=( "${tmpsdst[1]}" "${tmpsdst[2]}" "${srcdst[2]:-${tmpdist[2]#\!}}" )
else
srcdst=( "${tmpsdst[1]#\!}" "${tmpsdst[1]}" "${srcdst[2]:-${srcdst[1]#\!}}" )
fi
srcdst=( "${srcdst[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
srcdst[2]=${srcdst[2]#\!}
# Substitute the standard keywords and param''-s
@zinit-substitute 'srcdst[1]' 'srcdst[2]' 'srcdst[3]'
gems+=( ${srcdst[2]} )
}
(( ${#gems} )) && {
if [[ $hook = *atclone-<-> ]]; then
command gem install -q --no-user-install -i "$dir" "${gems[@]}"
elif [[ $hook = *atpull-<-> ]]; then
if (( !OPTS[opt_-q,--quiet] )) {
print -P -- "%F{38}bin-gem-node annex: %F{154}Updating the gems...%f"
command gem update -q --no-user-install -i "$dir" "${gems[@]}"
} else {
command gem update -q --no-user-install -i "$dir" "${gems[@]}" &> /dev/null
}
fi
}
}
if [[ -n "${ICE[pip]}" ]] {
local -a pip_defs srcdst tmpsdst imods umods
pip_defs=( "${(s.;.)ICE[pip]}" )
local pip
integer perform_update=0
for pip ( $pip_defs ) {
srcdst=( ${(@s.->.)pip} )
tmpsdst=( ${(@s.<-.)srcdst[1]} )
if (( ${#tmpsdst} > 1 )); then
srcdst=( "${tmpsdst[1]}" "${tmpsdst[2]}" "${srcdst[2]:-${tmpdist[2]#\!}}" )
else
srcdst=( "${tmpsdst[1]#\!}" "${tmpsdst[1]}" "${srcdst[2]:-${srcdst[1]#\!}}" )
fi
srcdst=( "${srcdst[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
srcdst[2]=${srcdst[2]#\!}
# Substitute the standard keywords and param''-s
@zinit-substitute 'srcdst[1]' 'srcdst[2]' 'srcdst[3]'
if [[ "$hook" = *atclone-<-> ]]; then
imods+=( ${srcdst[2]} )
elif [[ "$hook" = *atpull-<-> && -n ${srcdst[2]} ]]; then
umods+=( ${srcdst[2]} )
perform_update=1
break
fi
}
(( ${#imods} )) && \
( builtin cd -q "$dir" && command python3 -m venv venv && VIRTUALENV=venv(:A) command venv/bin/pip install "${imods[@]}" )
(( perform_update )) && (( ${#umods} )) && \
(
builtin cd -q "$dir" && {
if (( !OPTS[opt_-q,--quiet] )) {
print -P -- "%F{38}bin-gem-node annex: %F{154}Updating the pip packages...%f"
VIRTUALENV=venv(:A) command venv/bin/pip install --upgrade "${umods[@]}"
} else {
VIRTUALENV=venv(:A) command venv/bin/pip install -q --upgrade "${umods[@]}"
}
}
)
}
if [[ -n "${ICE[node]}" ]] {
local -a node_defs srcdst tmpsdst mods
node_defs=( "${(s.;.)ICE[node]}" )
local node
integer perform_update=0
for node ( $node_defs ) {
srcdst=( ${(@s.->.)node} )
tmpsdst=( ${(@s.<-.)srcdst[1]} )
if (( ${#tmpsdst} > 1 )); then
srcdst=( "${tmpsdst[1]}" "${tmpsdst[2]}" "${srcdst[2]:-${tmpdist[2]#\!}}" )
else
srcdst=( "${tmpsdst[1]#\!}" "${tmpsdst[1]}" "${srcdst[2]:-${srcdst[1]#\!}}" )
fi
srcdst=( "${srcdst[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
srcdst[2]=${srcdst[2]#\!}
# Substitute the standard keywords and param''-s
@zinit-substitute 'srcdst[1]' 'srcdst[2]' 'srcdst[3]'
if [[ "$hook" = *atclone-<-> ]]; then
mods+=( ${srcdst[2]} )
elif [[ "$hook" = *atpull-<-> && -n ${srcdst[2]} ]]; then
perform_update=1
break
fi
}
(( ${#mods} )) && \
( builtin cd -q "$dir" && command npm --silent install "${mods[@]}" )
(( perform_update )) && \
(
builtin cd -q "$dir" && {
if (( !OPTS[opt_-q,--quiet] )) {
print -P -- "%F{38}bin-gem-node annex: %F{154}Updating the node modules...%f"
command npm --silent update
} else {
command npm --silent update &> /dev/null
}
}
)
}
#
# sbin'' ice – creation of shims (the name borrowed from rbenv)
#
if (( ${+ICE[sbin]} )) {
local -a sbins srcdst
sbins=( ${(s.;.)ICE[sbin]} )
(( !$#sbins )) && sbins+=("")
local sbin
(
# CD for the globbing through eval
builtin cd -q "$dir" || return
for sbin ( $sbins ) {
integer set_gem_home=0 set_node_path=0 set_virtualenv=0 set_cwd=0 \
use_all_null=0 use_err_null=0 use_out_null=0 use_1=0
if [[ -z $sbin ]]; then
if [[ -f $dir/${id_as:t} ]]; then
sbin="$dir/${id_as:t}"
elif [[ -n $plugin && -f $dir/$plugin ]]; then
sbin="$dir/$plugin"
elif [[ -n $url && -f $dir/${url:t} ]]; then
sbin="$dir/${url:t}"
# Search in tree.
elif [[ -f $dir/**/($id_as:t|$plugin)(#qN[1].) ]]; then
sbin=( $dir/**/($id_as:t|$plugin)(Nnon.) )
sbin=$sbin[1]
else
local -a files
files=( $dir/**/*(*Nnon:t) )
if (( ${#files} )); then
sbin="${files[1]}"
else
print -P -- "%F{38}bin-gem-node annex: %F{160}The automatic-empty sbin ice didn't find any executable files%f"
break
fi
fi
fi
# Allow multiple separators, =>,->,→
srcdst=( ${(@s.=>.)${(@s.→.)${(@s.->.)sbin}}} )
srcdst=( "${srcdst[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
[[ ${srcdst[1]} = [1gnpcNEO]#g[1gnpcNEO]#:* ]] && set_gem_home=1
[[ ${srcdst[1]} = [1gnpcNEO]#n[1gnpcNEO]#:* ]] && set_node_path=1
[[ ${srcdst[1]} = [1gnpcNEO]#p[1gnpcNEO]#:* ]] && set_virtualenv=1
[[ ${srcdst[1]} = [1gnpcNEO]#c[1gnpcNEO]#:* ]] && set_cwd=1
[[ ${srcdst[1]} = [1gnpcNEO]#N[1gnpcNEO]#:* ]] && use_all_null=1
[[ ${srcdst[1]} = [1gnpcNEO]#E[1gnpcNEO]#:* ]] && use_err_null=1
[[ ${srcdst[1]} = [1gnpcNEO]#O[1gnpcNEO]#:* ]] && use_out_null=1
[[ ${srcdst[1]} = [1gnpcNEO]#1[1gnpcNEO]#:* ]] && use_1=1
srcdst[1]=${srcdst[1]#[a-zA-Z0-9]#:}
# Substitute the standard keywords and param''-s
@zinit-substitute 'srcdst[1]' 'srcdst[2]'
local -a fnames
local fname
if [[ $srcdst[1] != /* ]]; then
# Search tree and sort from ./
eval "fnames=( **/${srcdst[1]}(Nnon-.) )"
else
eval "fnames=( ${srcdst[1]}(Nnon-.) )"
fi
if (( !${#fnames} )) {
print -P -- "%F{38}bin-gem-node annex: %F{160}Warning: %F{154}The sbin'' ice (\`%F{219}$sbin%F{154}') didn't match any files%f"
continue
}
for fname ( $fnames ) {
srcdst[1]="$fname"
local target_binary="${${(M)srcdst[1]:#/*}:-$dir/${srcdst[1]}}" \
fnam="${srcdst[2]:-${srcdst[1]:t}}"
local file="$ZPFX/bin/$fnam"
if [[ $OSTYPE == cygwin ]]; then
.za-bgn-bin-or-src-function-body-cygwin 0 \
"$fnam" \
"$target_binary" "$dir" "$set_gem_home" \
"$set_node_path" "$set_virtualenv" "$set_cwd" "$use_all_null" \
"$use_err_null" "$use_out_null"
builtin print -r -- "$REPLY" \
>! "$file.cmd"
command chmod +x "$file.cmd"
continue
fi
.za-bgn-bin-or-src-function-body 0 \
"$fnam" \
"$target_binary" "$dir" "$set_gem_home" \
"$set_node_path" "$set_virtualenv" "$set_cwd" "$use_all_null" \
"$use_err_null" "$use_out_null"
builtin print -r -- "#!/usr/bin/env zsh$nl$nl$REPLY$nl$nl$fnam \"\$@\"" \
>! "$file"
command chmod +x "$file" "$target_binary"
if [[ -x $file ]]; then
(( !OPTS[opt_-q,--quiet] )) && \
if [[ -x $target_binary ]]; then
if [[ $hook == atclone-<-> || $ZINIT[annex-multi-flag:pull-active] -ge 2 ]] {
+zi-log "{m} {b}sbin{rst}: ${${${hook:#*atclone-<->}:+Re-c}:-C}reated {file}$fnam{rst} shim & set +x on the {file}${target_binary:t}{rst} binary"
}
else
+zi-log "{m} {b}sbin{rst}: ${${${hook:#*atclone-<->}:+Re-c}:-C}reated {file}$fnam{rst} shim, but {file}${target_binary:t}{rst} binary does not exist or failed to set +x on it"
fi
else
+zi-log "{e} {b}sbin{rst}: Failed to create {file}$fnam{rst} shim"
fi
if ((use_1)); then
(($#fnames-1)) && \
+zinit-message {pre}bin-gem-node annex: {warn}Skipped \
{num}$(($#fnames-1)){warn} files that match the \
{ice}sbin\'\'{warn} ice \({obj}${(j:, :)fnames[2,8]}\
${${$(($#fnames>8)):#0}:+,{b}{note}$(($#fnames-8)) more\{\}}{warn}\), because of {flag}1:…{warn} flag given
break
fi
}
}
)
}
if [[ -n "${ICE[fbin]}" ]] {
local -a fbins srcdst
fbins=( "${(s.;.)ICE[fbin]}" )
local fbin
for fbin ( $fbins ) {
srcdst=( ${(@s.->.)fbin} )
srcdst=( "${srcdst[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" )
srcdst[1]=${srcdst[1]#[a-zA-Z]##:}
# Substitute the standard keywords and param''-s
@zinit-substitute 'srcdst[1]'
local target_binary="${${(M)srcdst[1]:#/*}:-$dir/${srcdst[1]}}" \
command chmod +x "$target_binary"
if [[ -x $target_binary ]]; then
(( !OPTS[opt_-q,--quiet] )) && \
print -P -- "%F{38}bin-gem-node annex: %F{154}Set +x on the %F{219}${target_binary:t}%F{154} binary%f"
else
print -P -- "%F{38}bin-gem-node annex: %F{160}Something went wrong setting +x on the %F{219}${target_binary:t}%F{160} binary%f"
fi
}
}
}
# vim:ft=zsh:sw=4:sts=4:et