mirror of https://github.com/mattmc3/antidote
217 lines
7.0 KiB
Bash
217 lines
7.0 KiB
Bash
#!/bin/zsh
|
|
|
|
### Generate the Zsh script to load a plugin.
|
|
#
|
|
# usage: antidote script [-h|--help] [-k|--kind <kind>] [-p|--path <path>]
|
|
# [-c|--conditional <func>] [-b|--branch <branch>]
|
|
# [--pre <func>] [--post <func>] [--skip-load-defer]
|
|
# [-a|--autoload <path>] <bundle>
|
|
# <kind> : zsh,path,fpath,defer,clone,autoload
|
|
# <path> : Relative path from the bundle root
|
|
# <branch> : The git branch
|
|
# <bundle> : A bundle can be a directory, a zsh script, or a git repo
|
|
#
|
|
|
|
### Generate the Zsh script to load a plugin.
|
|
#function antidote-script {
|
|
emulate -L zsh; setopt local_options $_adote_funcopts
|
|
local MATCH MBEGIN MEND; local -a match mbegin mend # appease 'warn_create_global'
|
|
local REPLY=
|
|
|
|
local -a o_help o_kind o_path o_branch o_cond o_autoload o_pre o_post o_fpath_rule o_skip_load_defer
|
|
zparseopts $_adote_zparopt_flags -- \
|
|
h=o_help -help=h \
|
|
a:=o_autoload -autoload:=a \
|
|
b:=o_branch -branch:=b \
|
|
k:=o_kind -kind:=k \
|
|
p:=o_path -path:=p \
|
|
-pre:=o_pre \
|
|
-post:=o_post \
|
|
-fpath-rule:=o_fpath_rule \
|
|
-skip-load-defer=o_skip_load_defer \
|
|
c:=o_cond -conditional:=c ||
|
|
return 1
|
|
|
|
# set defaults
|
|
(( $#o_kind )) || o_kind=(--kind zsh)
|
|
if ! (( $#o_fpath_rule )); then
|
|
zstyle -a ':antidote:fpath' rule 'o_fpath_rule' || o_fpath_rule=(append)
|
|
fi
|
|
|
|
# strip '=' or ':' from beginning of arg values
|
|
local re='^[=:]?(.+)$'
|
|
[[ $o_kind[-1] =~ $re ]] && o_kind[-1]=$match
|
|
[[ $o_autoload[-1] =~ $re ]] && o_autoload[-1]=$match
|
|
[[ $o_path[-1] =~ $re ]] && o_path[-1]=$match
|
|
[[ $o_cond[-1] =~ $re ]] && o_cond[-1]=$match
|
|
[[ $o_branch[-1] =~ $re ]] && o_branch[-1]=$match
|
|
[[ $o_pre[-1] =~ $re ]] && o_pre[-1]=$match
|
|
[[ $o_post[-1] =~ $re ]] && o_post[-1]=$match
|
|
[[ $o_fpath_rule[-1] =~ $re ]] && o_fpath_rule[-1]=$match
|
|
|
|
local supported_kind_vals=(autoload clone defer fpath path zsh)
|
|
if (( $#o_kind )) && ! (( $supported_kind_vals[(Ie)$o_kind[-1]] )); then
|
|
print -ru2 "antidote: error: unexpected kind value: '$o_kind[-1]'" && return 1
|
|
fi
|
|
|
|
# If no fpath_rule is set, use the zstyle
|
|
if ! (( $#o_fpath_rule )); then
|
|
local zstyle_fpath_rule
|
|
zstyle -s ':antidote:fpath' rule 'zstyle_fpath_rule'
|
|
[[ -z "$zstyle_fpath_rule" ]] || o_fpath_rule=($zstyle_fpath_rule)
|
|
fi
|
|
|
|
local supported_fpath_rules=(append prepend)
|
|
if ! (( $supported_fpath_rules[(Ie)$o_fpath_rule[-1]] )); then
|
|
print -ru2 "antidote: error: unexpected fpath rule: '$o_fpath_rule[-1]'" && return 1
|
|
fi
|
|
|
|
local bundle=$1
|
|
if [[ -z "$bundle" ]]; then
|
|
print -ru2 "antidote: error: bundle argument expected" && return 1
|
|
fi
|
|
local bundle_name=$(__antidote_bundle_name $bundle)
|
|
|
|
# replace ~/ with $HOME/
|
|
if [[ "$bundle" == '~/'* ]]; then
|
|
bundle=$HOME/${bundle#'~/'*}
|
|
fi
|
|
|
|
# set the path to the bundle (repo or local)
|
|
local bundle_path
|
|
[[ -e "$bundle" ]] && bundle_path=$bundle || bundle_path=$(__antidote_bundle_dir $bundle)
|
|
|
|
# handle cloning repo bundles
|
|
local bundle_type
|
|
bundle_type="$(__antidote_bundle_type $bundle)"
|
|
if [[ "$bundle_type" == (repo|url|sshurl) ]] && [[ ! -e "$bundle_path" ]]; then
|
|
local giturl=$(__antidote_tourl $bundle)
|
|
print -ru2 "# antidote cloning $bundle_name..."
|
|
git clone --quiet --recurse-submodules --shallow-submodules $o_branch $giturl $bundle_path
|
|
[[ $? -eq 0 ]] || return 1
|
|
fi
|
|
|
|
# if we only needed to clone the bundle, compile and we're done
|
|
if [[ "$o_kind[-1]" == "clone" ]]; then
|
|
if zstyle -t ":antidote:bundle:$bundle" zcompile; then
|
|
__antidote_bundle_zcompile $bundle_path
|
|
fi
|
|
return
|
|
fi
|
|
|
|
# add path to bundle
|
|
[[ -n "$o_path[-1]" ]] && bundle_path+="/$o_path[-1]"
|
|
|
|
# handle defer pre-reqs first
|
|
local dopts zsh_defer='zsh-defer'
|
|
zstyle -s ":antidote:bundle:${bundle}" defer-options 'dopts'
|
|
[[ -n "$dopts" ]] && zsh_defer="zsh-defer $dopts"
|
|
|
|
# generate the script
|
|
local -a script=()
|
|
|
|
# add pre-load function
|
|
(( $#o_pre )) && script+=("$o_pre[-1]")
|
|
|
|
# handle defers
|
|
local source_cmd="source"
|
|
local zsh_defer_bundle
|
|
zstyle -s ':antidote:defer' bundle 'zsh_defer_bundle' \
|
|
|| zsh_defer_bundle='romkatv/zsh-defer'
|
|
if [[ "$o_kind[-1]" == "defer" ]]; then
|
|
source_cmd="${zsh_defer} source"
|
|
if ! (( $#o_skip_load_defer )); then
|
|
script+=(
|
|
'if ! (( $+functions[zsh-defer] )); then'
|
|
"$(antidote-script $zsh_defer_bundle | __antidote_indent)"
|
|
'fi'
|
|
)
|
|
fi
|
|
fi
|
|
|
|
# Let's make the path a little nicer to deal with
|
|
local print_bundle_path="$(__antidote_print_path "$bundle_path")"
|
|
|
|
# handle autoloading before sourcing
|
|
if (( $#o_autoload )); then
|
|
if [[ "$o_fpath_rule[-1]" == prepend ]]; then
|
|
script+=("fpath=( \"${print_bundle_path}/${o_autoload[-1]}\" \$fpath )")
|
|
script+=("builtin autoload -Uz \$fpath[1]/*(N.:t)")
|
|
else
|
|
script+=("fpath+=( \"${print_bundle_path}/${o_autoload[-1]}\" )")
|
|
script+=("builtin autoload -Uz \$fpath[-1]/*(N.:t)")
|
|
fi
|
|
fi
|
|
|
|
# generate load script
|
|
bundle_type="$(__antidote_bundle_type $bundle_path)"
|
|
local fpath_script
|
|
if [[ "$o_fpath_rule[-1]" == prepend ]]; then
|
|
fpath_script="fpath=( \"$print_bundle_path\" \$fpath )"
|
|
else
|
|
fpath_script="fpath+=( \"$print_bundle_path\" )"
|
|
fi
|
|
|
|
if [[ "$o_kind[-1]" == fpath ]]; then
|
|
# fpath
|
|
script+="$fpath_script"
|
|
elif [[ "$o_kind[-1]" == path ]]; then
|
|
# path
|
|
script+="export PATH=\"$print_bundle_path:\$PATH\""
|
|
elif [[ "$o_kind[-1]" == autoload ]]; then
|
|
# autoload
|
|
script+=("$fpath_script")
|
|
if [[ "$o_fpath_rule[-1]" == prepend ]]; then
|
|
script+=("builtin autoload -Uz \$fpath[1]/*(N.:t)")
|
|
else
|
|
script+=("builtin autoload -Uz \$fpath[-1]/*(N.:t)")
|
|
fi
|
|
else
|
|
if zstyle -t ":antidote:bundle:$bundle" zcompile; then
|
|
__antidote_bundle_zcompile $bundle_path
|
|
fi
|
|
if [[ $bundle_type == file ]]; then
|
|
script+="$source_cmd \"$print_bundle_path\""
|
|
else
|
|
# directory/default
|
|
local initfile initfiles
|
|
initfiles=(${(@f)$(__antidote_initfiles $bundle_path)})
|
|
# if no init file was found, assume the default
|
|
if [[ $#initfiles -eq 0 ]]; then
|
|
if (( $#o_path )); then
|
|
initfiles=($bundle_path/${bundle_path:t}.plugin.zsh)
|
|
else
|
|
initfiles=($bundle_path/${bundle_name:t}.plugin.zsh)
|
|
fi
|
|
fi
|
|
script+="$fpath_script"
|
|
local print_initfile
|
|
for initfile in $initfiles; do
|
|
print_initfile="$(__antidote_print_path "$initfile")"
|
|
script+="$source_cmd \"$print_initfile\""
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# add post-load function
|
|
if (( $#o_post )); then
|
|
if [[ "$o_kind[-1]" == "defer" ]]; then
|
|
script+=("${zsh_defer} $o_post[-1]")
|
|
else
|
|
script+=("$o_post[-1]")
|
|
fi
|
|
fi
|
|
|
|
# mark bundle as loaded
|
|
# script+="zstyle ':antidote:bundle:${bundle_name}' loaded yes"
|
|
|
|
# wrap conditional
|
|
if [[ -n "$o_cond[-1]" ]]; then
|
|
print "if $o_cond[-1]; then"
|
|
printf " %s\n" $script
|
|
print "fi"
|
|
else
|
|
printf "%s\n" $script
|
|
fi
|
|
#}
|