From 5bcfb8cc9fa315fd40c8b5b96ddaf7ade979b436 Mon Sep 17 00:00:00 2001 From: Eric Nielsen Date: Tue, 17 May 2022 18:43:59 -0500 Subject: [PATCH] Override repository options along zmodule calls for the same module name. Other minor fixes: * Show skipping already installed modules with install action and `-v`. * Consider external module dirs when calling compile action directly, by making sure _zimfw_source_zimrc is called first. * Ignore return value from `zargs` with `-P`, as it's oddly returning 123 since Zsh 5.9. Maybe related to these changes: https://github.com/zsh-users/zsh/commit/67f932e7c5cfad02cdcc552dcd57e63536b7f965 --- CHANGELOG.md | 9 +- src/stage2/30_zmodule.zsh.erb | 85 +++++----- src/stage2/31_zimfw_source_zimrc.zsh.erb | 4 +- src/stage2/34_zimfw_list_unuseds.zsh.erb | 11 +- src/stage2/50_zimfw_clean_compiled.zsh.erb | 2 +- src/stage2/50_zimfw_compile.zsh.erb | 2 +- src/stage2/50_zimfw_install_update.zsh.erb | 5 +- src/stage2/69_zimfw_run_list.zsh.erb | 27 ++- src/stage2/70_zimfw_run_tool.zsh.erb | 33 ++-- src/stage2/80_zimfw.zsh.erb | 10 +- src/tools/git.zsh.erb | 2 +- src/zimfw.zsh.erb | 2 +- zimfw.zsh | 185 +++++++++++---------- 13 files changed, 195 insertions(+), 182 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5ebadc..bbefc16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -_No unreleased changes._ +### Fixed + +- Calling `zmodule` more than once will override the repository options along + the calls for the same module name. +- Also show skipping already installed modules with the install action and `-v`. +- Also consider external module directory paths when calling the compile action + directly. +- Ignore return value from `zargs` with `-P`. ## [1.9.0] - 2022-05-09 diff --git a/src/stage2/30_zmodule.zsh.erb b/src/stage2/30_zmodule.zsh.erb index da71c2a..a66867e 100644 --- a/src/stage2/30_zmodule.zsh.erb +++ b/src/stage2/30_zmodule.zsh.erb @@ -52,12 +52,10 @@ Initialization options: _zfailed=1 return 2 fi - local zurl=${1} zmodule=${1:t} ztool zdir ztype zrev zarg - local -i zsubmodules=1 zfrozen=0 zdisabled=0 - local -a zonpulls zfpaths zfunctions zcmds - zstyle -s ':zim:zmodule' use 'ztool' || ztool=git + local zurl=${1} zname=${1:t} zarg + local -a zfpaths zfunctions zcmds if [[ ${zurl} =~ ^[^:/]+: ]]; then - zmodule=${zmodule%.git} + zname=${zname%.git} elif [[ ${zurl} != /* ]]; then # Count number of slashes case ${#zurl//[^\/]/} in @@ -66,27 +64,35 @@ Initialization options: esac fi shift - if [[ ${1} == (-n|--name) ]]; then + while [[ ${1} == (-n|--name) ]]; do if (( # < 2 )); then - print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 fi shift - zmodule=${${1%%/##}##/##} + zname=${${1%%/##}##/##} shift - fi + done if [[ ${zurl} == /* ]]; then - zdir=${zurl%%/##} + _zdirs[${zname}]=${zurl%%/##} zurl= else - zdir=${ZIM_HOME}/modules/${zmodule} + _zdirs[${zname}]=${ZIM_HOME}/modules/${zname} fi + _zurls[${zname}]=${zurl} + # Set default values + if (( ! ${+_ztools[${zname}]} )); then + zstyle -s ':zim:zmodule' use "_ztools[${zname}]" || _ztools[${zname}]=git + fi + if (( ! ${+_ztypes[${zname}]} )) _ztypes[${zname}]=branch + if (( ! ${+_zsubmodules[${zname}]} )) _zsubmodules[${zname}]=1 + # Set values from options while (( # > 0 )); do case ${1} in -b|--branch|-t|--tag|-u|--use|--on-pull|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) if (( # < 2 )); then - print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 fi @@ -94,34 +100,34 @@ Initialization options: esac case ${1} in -b|--branch|-t|--tag|-u|--use|--no-submodules) - if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b The zmodule option %B${1}%b has no effect for external modules%f" + if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zname}:%b The zmodule option %B${1}%b has no effect for external modules%f" ;; esac case ${1} in -b|--branch) shift - ztype=branch - zrev=${1} + _ztypes[${zname}]=branch + _zrevs[${zname}]=${1} ;; -t|--tag) shift - ztype=tag - zrev=${1} + _ztypes[${zname}]=tag + _zrevs[${zname}]=${1} ;; -u|--use) shift - ztool=${1} + _ztools[${zname}]=${1} ;; - --no-submodules) zsubmodules=0 ;; - -z|--frozen) zfrozen=1 ;; + --no-submodules) _zsubmodules[${zname}]=0 ;; + -z|--frozen) _zfrozens[${zname}]=1 ;; --on-pull) shift - zonpulls+=(${1}) + _zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${1}" ;; -f|--fpath) shift zarg=${1} - if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} + if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg} zfpaths+=(${zarg}) ;; -a|--autoload) @@ -131,16 +137,16 @@ Initialization options: -s|--source) shift zarg=${1} - if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} + if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg} zcmds+=("source ${zarg:A}") ;; -c|--cmd) shift - zcmds+=(${1//{}/${zdir:A}}) + zcmds+=(${1//{}/${_zdirs[${zname}]:A}}) ;; - -d|--disabled) zdisabled=1 ;; + -d|--disabled) _zdisableds[${zname}]=1 ;; *) - print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 ;; @@ -148,42 +154,37 @@ Initialization options: shift done if (( _zflags & 1 )); then - _zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}" "${zsubmodules}" "${(j:; :)zonpulls}" "${zfrozen}" "${zdisabled}") + _znames+=(${zname}) fi if (( _zflags & 2 )); then - if (( zdisabled )); then - _zdisabled_dirs+=(${zdir}) + if (( _zdisableds[${zname}] )); then + _zdisabled_dirs+=(${_zdirs[${zname}]}) else - if [[ ! -e ${zdir} ]]; then - if [[ -z ${zurl} ]]; then - print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}: ${zdir}%b not found%f" - else - print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" - fi + if [[ ! -e ${_zdirs[${zname}]} ]]; then + print -u2 -PR "%F{red}<%= error %>${funcfiletrace[1]}:%B${zname}: ${_zdirs[${zname}]}%b not found%f" _zfailed=1 return 1 fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - zfpaths=(${zdir}/functions(NF)) + zfpaths=(${_zdirs[${zname}]}/functions(NF)) # _* functions are autoloaded by compinit # prompt_*_setup functions are autoloaded by promptinit zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t)) - local -ra prezto_scripts=(${zdir}/init.zsh(N)) + local -ra prezto_scripts=(${_zdirs[${zname}]}/init.zsh(N)) if (( ${#zfpaths} && ${#prezto_scripts} )); then # this follows the prezto module format, no need to check for other scripts zcmds=('source '${^prezto_scripts:A}) else # get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first) - local -ra zscripts=(${zdir}/(init.zsh|${zmodule:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) + local -ra zscripts=(${_zdirs[${zname}]}/(init.zsh|${zname:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=('source '${^zscripts:A}) fi fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - _zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zmodule}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} + _zimfw_print -u2 -PlR "%F{yellow}<%= warn %>${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} fi - _zdirs+=(${zdir}) - # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating modules - local -r zpre=${zmodule}$'\0' + # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating names + local -r zpre=${zname}$'\0' _zfpaths+=(${zpre}${^zfpaths}) _zfunctions+=(${zpre}${^zfunctions}) _zcmds+=(${zpre}${^zcmds}) diff --git a/src/stage2/31_zimfw_source_zimrc.zsh.erb b/src/stage2/31_zimfw_source_zimrc.zsh.erb index b1e72d3..1b7ca2d 100644 --- a/src/stage2/31_zimfw_source_zimrc.zsh.erb +++ b/src/stage2/31_zimfw_source_zimrc.zsh.erb @@ -1,11 +1,11 @@ _zimfw_source_zimrc() { - local -r ztarget=<%= home %>/.zimrc _zflags=${1} _zargs_action=${2} + local -r ztarget=<%= home %>/.zimrc _zflags=${1} local -i _zfailed=0 if ! source ${ztarget} || (( _zfailed )); then print -u2 -PR "%F{red}<%= failed %>Failed to source %B${ztarget}%b%f" return 1 fi - if (( _zflags & 1 && ${#_zmodules_zargs} == 0 )); then + if (( _zflags & 1 && ${#_znames} == 0 )); then print -u2 -PR "%F{red}<%= failed %>No modules defined in %B${ztarget}%b%f" return 1 fi diff --git a/src/stage2/34_zimfw_list_unuseds.zsh.erb b/src/stage2/34_zimfw_list_unuseds.zsh.erb index f87f14e..53d33a7 100644 --- a/src/stage2/34_zimfw_list_unuseds.zsh.erb +++ b/src/stage2/34_zimfw_list_unuseds.zsh.erb @@ -1,19 +1,18 @@ _zimfw_list_unuseds() { local -i i=1 local -a zinstalled=(${ZIM_HOME}/modules/*(N/)) + local -ar zdirs=(${(v)_zdirs}) # Search into subdirectories while (( i <= ${#zinstalled} )); do - if (( ${_zdirs[(I)${zinstalled[i]}/*]} || ${_zdisabled_dirs[(I)${zinstalled[i]}/*]} )); then + if (( ${zdirs[(I)${zinstalled[i]}/*]} || ${_zdisabled_dirs[(I)${zinstalled[i]}/*]} )); then zinstalled+=(${zinstalled[i]}/*(N/)) zinstalled[i]=() else (( i++ )) fi done - # Unused = all installed dirs not in _zdirs and _zdisabled_dirs - _zunused_dirs=(${${zinstalled:|_zdirs}:|_zdisabled_dirs}) + # Unused = all installed dirs not in zdirs and _zdisabled_dirs + _zunused_dirs=(${${zinstalled:|zdirs}:|_zdisabled_dirs}) local zunused - for zunused in ${_zunused_dirs}; do - _zimfw_print -PR "%B${zunused:t}:%b ${zunused}${1}" - done + for zunused (${_zunused_dirs}) _zimfw_print -PR "%B${zunused:t}:%b ${zunused}${1}" } diff --git a/src/stage2/50_zimfw_clean_compiled.zsh.erb b/src/stage2/50_zimfw_clean_compiled.zsh.erb index c625c14..7375ead 100644 --- a/src/stage2/50_zimfw_clean_compiled.zsh.erb +++ b/src/stage2/50_zimfw_clean_compiled.zsh.erb @@ -1,6 +1,6 @@ _zimfw_clean_compiled() { # Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once. - local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A}) + local -Ur zscriptdirs=(${ZIM_HOME} ${${(v)_zdirs##${ZIM_HOME}/*}:A}) local zopt if (( _zprintlevel > 0 )) zopt=-v command rm -f ${zopt} ${^zscriptdirs}/**/*.zwc(|.old)(N) && \ diff --git a/src/stage2/50_zimfw_compile.zsh.erb b/src/stage2/50_zimfw_compile.zsh.erb index 2fca33f..f518be8 100644 --- a/src/stage2/50_zimfw_compile.zsh.erb +++ b/src/stage2/50_zimfw_compile.zsh.erb @@ -1,6 +1,6 @@ _zimfw_compile() { # Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once. - local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A}) + local -Ur zscriptdirs=(${ZIM_HOME} ${${(v)_zdirs##${ZIM_HOME}/*}:A}) # Compile Zim scripts local zfile for zfile in ${^zscriptdirs}/(^*test*/)#*.zsh(|-theme)(N-.); do diff --git a/src/stage2/50_zimfw_install_update.zsh.erb b/src/stage2/50_zimfw_install_update.zsh.erb index bb21391..a02fe9b 100644 --- a/src/stage2/50_zimfw_install_update.zsh.erb +++ b/src/stage2/50_zimfw_install_update.zsh.erb @@ -1,3 +1,6 @@ _zimfw_install_update() { - _zimfw_source_zimrc 1 ${1} && zargs -n 11 -P 0 -- "${_zmodules_zargs[@]}" -- _zimfw_run_tool + local -r _zargs_action=${1} + _zimfw_source_zimrc 1 && zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool + # Ignore return from zargs with -P + return 0 } diff --git a/src/stage2/69_zimfw_run_list.zsh.erb b/src/stage2/69_zimfw_run_list.zsh.erb index bb3006d..656442f 100644 --- a/src/stage2/69_zimfw_run_list.zsh.erb +++ b/src/stage2/69_zimfw_run_list.zsh.erb @@ -1,26 +1,25 @@ _zimfw_run_list() { - local -r ztool=${1} zmodule=${3} zdir=${4} zurl=${5} ztype=${6} zrev=${7} zonpull=${9} - local -ri zsubmodules=${8} zfrozen=${10} zdisabled=${11} - print -PnR "%B${zmodule}:%b ${zdir}" - if [[ -z ${zurl} ]] print -Pn ' (external)' - if (( ${zfrozen} )) print -Pn ' (frozen)' - if (( ${zdisabled} )) print -Pn ' (disabled)' + local -r zname=${1} + print -PnR "%B${zname}:%b ${_zdirs[${zname}]}" + if [[ -z ${_zurls[${zname}]} ]] print -Pn ' (external)' + if (( ${_zfrozens[${zname}]} )) print -Pn ' (frozen)' + if (( ${_zdisableds[${zname}]} )) print -Pn ' (disabled)' print if (( _zprintlevel > 1 )); then - if [[ ${zfrozen} -eq 0 && -n ${zurl} ]]; then - print -nR " From: ${zurl}, " - if [[ -z ${zrev} ]]; then + if [[ ${_zfrozens[${zname}]} -eq 0 && -n ${_zurls[${zname}]} ]]; then + print -nR " From: ${_zurls[${zname}]}, " + if [[ -z ${_zrevs[${zname}]} ]]; then print -n 'default branch' else - print -nR "${ztype} ${zrev}" + print -nR "${_ztypes[${zname}]} ${_zrevs[${zname}]}" fi - print -nR ", using ${ztool}" - if (( ! zsubmodules )) print -nR ', no git submodules' + print -nR ", using ${_ztools[${zname}]}" + if (( ! _zsubmodules[${zname}] )) print -nR ', no git submodules' print - if [[ -n ${zonpull} ]] print -R " On-pull: ${zonpull}" + if [[ -n ${_zonpulls[${zname}]} ]] print -R " On-pull: ${_zonpulls[${zname}]}" fi # Match and remove the current module prefix from _zfpaths, _zfunctions and _zcmds - local -r zpre=${zmodule}$'\0' + local -r zpre=${zname}$'\0' local -r zfpaths=(${${(M)_zfpaths:#${zpre}*}#${zpre}}) zfunctions=(${${(M)_zfunctions:#${zpre}*}#${zpre}}) zcmds=(${${(M)_zcmds:#${zpre}*}#${zpre}}) if (( ${#zfpaths} )) print -R ' fpath: '${zfpaths} if (( ${#zfunctions} )) print -R ' autoload: '${zfunctions} diff --git a/src/stage2/70_zimfw_run_tool.zsh.erb b/src/stage2/70_zimfw_run_tool.zsh.erb index d518287..319efaf 100644 --- a/src/stage2/70_zimfw_run_tool.zsh.erb +++ b/src/stage2/70_zimfw_run_tool.zsh.erb @@ -1,41 +1,40 @@ _zimfw_run_tool() { - local -r ztool=${1} zaction=${2} zmodule=${3} zdir=${4} zurl=${5} - if [[ -z ${zurl} ]]; then - if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zmodule}:%b Skipping external module" + local -r zname=${1} + if [[ -z ${_zurls[${zname}]} ]]; then + if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping external module" return 0 fi - local -ri zfrozen=${10} - if (( zfrozen )); then - if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zmodule}:%b Skipping frozen module" + if (( _zfrozens[${zname}] )); then + if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping frozen module" return 0 fi - case ${zaction} in + case ${_zargs_action} in install) - if [[ -e ${zdir} ]]; then - # Already installed + if [[ -e ${_zdirs[${zname}]} ]]; then + if (( _zprintlevel > 1 )) print -u2 -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping already installed module" return 0 fi - _zimfw_print -nR <%= clear_line %>"Installing ${zmodule}<%= ellipsis %>" + _zimfw_print -nR <%= clear_line %>"Installing ${zname}<%= ellipsis %>" ;; update) - if [[ ! -d ${zdir} ]]; then - print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" + if [[ ! -d ${_zdirs[${zname}]} ]]; then + print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zname}:%b Not installed. Run %Bzimfw install%b to install.%f" return 1 fi - _zimfw_print -nR <%= clear_line %>"Updating ${zmodule}<%= ellipsis %>" + _zimfw_print -nR <%= clear_line %>"Updating ${zname}<%= ellipsis %>" ;; *) - print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zmodule}:%b Unknown action ${zaction}%f" + print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zname}:%b Unknown action ${_zargs_action}%f" return 1 ;; esac local zcmd - case ${ztool} in + case ${_ztools[${zname}]} in <%= render_tools("src/tools/*", "zcmd") %> *) - print -u2 -PR "<%= clear_line %>%F{red}<%= error %>%B${zmodule}:%b Unknown tool ${ztool}%f" + print -u2 -PR "<%= clear_line %>%F{red}<%= error %>%B${zname}:%b Unknown tool ${_ztools[${zname}]}%f" return 1 ;; esac - zsh -c ${zcmd} ${ztool} ${_zprintlevel} "${@[2,9]}" + zsh -c ${zcmd} ${_ztools[${zname}]} "${_zprintlevel}" "${_zargs_action}" "${zname}" "${_zdirs[${zname}]}" "${_zurls[${zname}]}" "${_ztypes[${zname}]}" "${_zrevs[${zname}]}" "${_zsubmodules[${zname}]}" "${_zonpulls[${zname}]}" } diff --git a/src/stage2/80_zimfw.zsh.erb b/src/stage2/80_zimfw.zsh.erb index 219cbe5..7894946 100644 --- a/src/stage2/80_zimfw.zsh.erb +++ b/src/stage2/80_zimfw.zsh.erb @@ -26,7 +26,9 @@ Actions: Options: %B-q%b Quiet (yes to prompts, and only outputs errors) %B-v%b Verbose (outputs more details)" - local -a _zdisabled_dirs _zdirs _zfpaths _zfunctions _zcmds _zmodules_zargs _zunused_dirs + local -Ua _znames _zdisabled_dirs + local -A _zfrozens _zdisableds _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls + local -a _zfpaths _zfunctions _zcmds _zunused_dirs local -i _zprintlevel=1 if (( # > 2 )); then print -u2 -PlR "%F{red}${0}: Too many options%f" '' ${zusage} @@ -57,11 +59,11 @@ Options: clean) _zimfw_source_zimrc 2 && _zimfw_clean_compiled && _zimfw_clean_dumpfile ;; clean-compiled) _zimfw_source_zimrc 2 && _zimfw_clean_compiled ;; clean-dumpfile) _zimfw_clean_dumpfile ;; - compile) _zimfw_compile ;; + compile) _zimfw_source_zimrc 2 && _zimfw_compile ;; help) print -PR ${zusage} ;; info) _zimfw_info ;; list) - _zimfw_source_zimrc 3 && zargs -n 11 -- "${_zmodules_zargs[@]}" -- _zimfw_run_list && \ + _zimfw_source_zimrc 3 && zargs -n 1 -- "${_znames[@]}" -- _zimfw_run_list && \ _zimfw_list_unuseds ' (unused)' ;; init) @@ -81,7 +83,7 @@ Options: upgrade) _zimfw_upgrade || return 1 (( _zprintlevel-- )) - _zimfw_compile + _zimfw_source_zimrc 2 && _zimfw_compile ;; version) print -PR ${_zversion} ;; *) diff --git a/src/tools/git.zsh.erb b/src/tools/git.zsh.erb index 048c79d..f7dfaf7 100644 --- a/src/tools/git.zsh.erb +++ b/src/tools/git.zsh.erb @@ -1,7 +1,7 @@ # This runs in a new shell builtin emulate -L zsh readonly -i PRINTLEVEL=${1} SUBMODULES=${8} -readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} TYPE=${6:=branch} ONPULL=${9} +readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} TYPE=${6} ONPULL=${9} REV=${7} print_error() { diff --git a/src/zimfw.zsh.erb b/src/zimfw.zsh.erb index 789fb35..d43df29 100644 --- a/src/zimfw.zsh.erb +++ b/src/zimfw.zsh.erb @@ -4,7 +4,7 @@ class Zim :clear_line, :ellipsis, :okay, :warn, :error, :done, :failed def initialize - @version = "1.9.0" + @version = "1.9.1-SNAPSHOT" @home = "${ZDOTDIR:-${HOME}}" @min_zsh_version = "5.2" # Matches {ssh,http,https,git}://{user@,}host/org/repo and {user@,}host:org/repo diff --git a/zimfw.zsh b/zimfw.zsh index 488f0e4..404a92a 100644 --- a/zimfw.zsh +++ b/zimfw.zsh @@ -138,12 +138,10 @@ Initialization options: _zfailed=1 return 2 fi - local zurl=${1} zmodule=${1:t} ztool zdir ztype zrev zarg - local -i zsubmodules=1 zfrozen=0 zdisabled=0 - local -a zonpulls zfpaths zfunctions zcmds - zstyle -s ':zim:zmodule' use 'ztool' || ztool=git + local zurl=${1} zname=${1:t} zarg + local -a zfpaths zfunctions zcmds if [[ ${zurl} =~ ^[^:/]+: ]]; then - zmodule=${zmodule%.git} + zname=${zname%.git} elif [[ ${zurl} != /* ]]; then # Count number of slashes case ${#zurl//[^\/]/} in @@ -152,27 +150,35 @@ Initialization options: esac fi shift - if [[ ${1} == (-n|--name) ]]; then + while [[ ${1} == (-n|--name) ]]; do if (( # < 2 )); then - print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 fi shift - zmodule=${${1%%/##}##/##} + zname=${${1%%/##}##/##} shift - fi + done if [[ ${zurl} == /* ]]; then - zdir=${zurl%%/##} + _zdirs[${zname}]=${zurl%%/##} zurl= else - zdir=${ZIM_HOME}/modules/${zmodule} + _zdirs[${zname}]=${ZIM_HOME}/modules/${zname} fi + _zurls[${zname}]=${zurl} + # Set default values + if (( ! ${+_ztools[${zname}]} )); then + zstyle -s ':zim:zmodule' use "_ztools[${zname}]" || _ztools[${zname}]=git + fi + if (( ! ${+_ztypes[${zname}]} )) _ztypes[${zname}]=branch + if (( ! ${+_zsubmodules[${zname}]} )) _zsubmodules[${zname}]=1 + # Set values from options while (( # > 0 )); do case ${1} in -b|--branch|-t|--tag|-u|--use|--on-pull|-f|--fpath|-a|--autoload|-s|--source|-c|--cmd) if (( # < 2 )); then - print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zmodule}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zname}:%b Missing argument for zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 fi @@ -180,34 +186,34 @@ Initialization options: esac case ${1} in -b|--branch|-t|--tag|-u|--use|--no-submodules) - if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}! ${funcfiletrace[1]}:%B${zmodule}:%b The zmodule option %B${1}%b has no effect for external modules%f" + if [[ -z ${zurl} ]] _zimfw_print -u2 -PR "%F{yellow}! ${funcfiletrace[1]}:%B${zname}:%b The zmodule option %B${1}%b has no effect for external modules%f" ;; esac case ${1} in -b|--branch) shift - ztype=branch - zrev=${1} + _ztypes[${zname}]=branch + _zrevs[${zname}]=${1} ;; -t|--tag) shift - ztype=tag - zrev=${1} + _ztypes[${zname}]=tag + _zrevs[${zname}]=${1} ;; -u|--use) shift - ztool=${1} + _ztools[${zname}]=${1} ;; - --no-submodules) zsubmodules=0 ;; - -z|--frozen) zfrozen=1 ;; + --no-submodules) _zsubmodules[${zname}]=0 ;; + -z|--frozen) _zfrozens[${zname}]=1 ;; --on-pull) shift - zonpulls+=(${1}) + _zonpulls[${zname}]="${_zonpulls[${zname}]+${_zonpulls[${zname}]}; }${1}" ;; -f|--fpath) shift zarg=${1} - if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} + if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg} zfpaths+=(${zarg}) ;; -a|--autoload) @@ -217,16 +223,16 @@ Initialization options: -s|--source) shift zarg=${1} - if [[ ${zarg} != /* ]] zarg=${zdir}/${zarg} + if [[ ${zarg} != /* ]] zarg=${_zdirs[${zname}]}/${zarg} zcmds+=("source ${zarg:A}") ;; -c|--cmd) shift - zcmds+=(${1//{}/${zdir:A}}) + zcmds+=(${1//{}/${_zdirs[${zname}]:A}}) ;; - -d|--disabled) zdisabled=1 ;; + -d|--disabled) _zdisableds[${zname}]=1 ;; *) - print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zmodule}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage} + print -u2 -PlR "%F{red}x ${funcfiletrace[1]}:%B${zname}:%b Unknown zmodule option %B${1}%b%f" '' ${zusage} _zfailed=1 return 2 ;; @@ -234,42 +240,37 @@ Initialization options: shift done if (( _zflags & 1 )); then - _zmodules_zargs+=("${ztool}" "${_zargs_action}" "${zmodule}" "${zdir}" "${zurl}" "${ztype}" "${zrev}" "${zsubmodules}" "${(j:; :)zonpulls}" "${zfrozen}" "${zdisabled}") + _znames+=(${zname}) fi if (( _zflags & 2 )); then - if (( zdisabled )); then - _zdisabled_dirs+=(${zdir}) + if (( _zdisableds[${zname}] )); then + _zdisabled_dirs+=(${_zdirs[${zname}]}) else - if [[ ! -e ${zdir} ]]; then - if [[ -z ${zurl} ]]; then - print -u2 -PR "%F{red}x ${funcfiletrace[1]}:%B${zmodule}: ${zdir}%b not found%f" - else - print -u2 -PR "%F{red}x ${funcfiletrace[1]}:%B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" - fi + if [[ ! -e ${_zdirs[${zname}]} ]]; then + print -u2 -PR "%F{red}x ${funcfiletrace[1]}:%B${zname}: ${_zdirs[${zname}]}%b not found%f" _zfailed=1 return 1 fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - zfpaths=(${zdir}/functions(NF)) + zfpaths=(${_zdirs[${zname}]}/functions(NF)) # _* functions are autoloaded by compinit # prompt_*_setup functions are autoloaded by promptinit zfunctions=(${^zfpaths}/^(*~|*.zwc(|.old)|_*|prompt_*_setup)(N-.:t)) - local -ra prezto_scripts=(${zdir}/init.zsh(N)) + local -ra prezto_scripts=(${_zdirs[${zname}]}/init.zsh(N)) if (( ${#zfpaths} && ${#prezto_scripts} )); then # this follows the prezto module format, no need to check for other scripts zcmds=('source '${^prezto_scripts:A}) else # get script with largest size (descending `O`rder by `L`ength, and return only `[1]` first) - local -ra zscripts=(${zdir}/(init.zsh|${zmodule:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) + local -ra zscripts=(${_zdirs[${zname}]}/(init.zsh|${zname:t}.(zsh|plugin.zsh|zsh-theme|sh))(NOL[1])) zcmds=('source '${^zscripts:A}) fi fi if (( ! ${#zfpaths} && ! ${#zfunctions} && ! ${#zcmds} )); then - _zimfw_print -u2 -PlR "%F{yellow}! ${funcfiletrace[1]}:%B${zmodule}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} + _zimfw_print -u2 -PlR "%F{yellow}! ${funcfiletrace[1]}:%B${zname}:%b Nothing found to be initialized. Customize the module name or initialization with %Bzmodule%b options.%f" '' ${zusage} fi - _zdirs+=(${zdir}) - # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating modules - local -r zpre=${zmodule}$'\0' + # Prefix is added to all _zfpaths, _zfunctions and _zcmds to distinguish the originating names + local -r zpre=${zname}$'\0' _zfpaths+=(${zpre}${^zfpaths}) _zfunctions+=(${zpre}${^zfunctions}) _zcmds+=(${zpre}${^zcmds}) @@ -278,13 +279,13 @@ Initialization options: } _zimfw_source_zimrc() { - local -r ztarget=${ZDOTDIR:-${HOME}}/.zimrc _zflags=${1} _zargs_action=${2} + local -r ztarget=${ZDOTDIR:-${HOME}}/.zimrc _zflags=${1} local -i _zfailed=0 if ! source ${ztarget} || (( _zfailed )); then print -u2 -PR "%F{red}Failed to source %B${ztarget}%b%f" return 1 fi - if (( _zflags & 1 && ${#_zmodules_zargs} == 0 )); then + if (( _zflags & 1 && ${#_znames} == 0 )); then print -u2 -PR "%F{red}No modules defined in %B${ztarget}%b%f" return 1 fi @@ -293,21 +294,20 @@ _zimfw_source_zimrc() { _zimfw_list_unuseds() { local -i i=1 local -a zinstalled=(${ZIM_HOME}/modules/*(N/)) + local -ar zdirs=(${(v)_zdirs}) # Search into subdirectories while (( i <= ${#zinstalled} )); do - if (( ${_zdirs[(I)${zinstalled[i]}/*]} || ${_zdisabled_dirs[(I)${zinstalled[i]}/*]} )); then + if (( ${zdirs[(I)${zinstalled[i]}/*]} || ${_zdisabled_dirs[(I)${zinstalled[i]}/*]} )); then zinstalled+=(${zinstalled[i]}/*(N/)) zinstalled[i]=() else (( i++ )) fi done - # Unused = all installed dirs not in _zdirs and _zdisabled_dirs - _zunused_dirs=(${${zinstalled:|_zdirs}:|_zdisabled_dirs}) + # Unused = all installed dirs not in zdirs and _zdisabled_dirs + _zunused_dirs=(${${zinstalled:|zdirs}:|_zdisabled_dirs}) local zunused - for zunused in ${_zunused_dirs}; do - _zimfw_print -PR "%B${zunused:t}:%b ${zunused}${1}" - done + for zunused (${_zunused_dirs}) _zimfw_print -PR "%B${zunused:t}:%b ${zunused}${1}" } _zimfw_version_check() { @@ -355,7 +355,7 @@ _zimfw_check_dumpfile() { _zimfw_clean_compiled() { # Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once. - local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A}) + local -Ur zscriptdirs=(${ZIM_HOME} ${${(v)_zdirs##${ZIM_HOME}/*}:A}) local zopt if (( _zprintlevel > 0 )) zopt=-v command rm -f ${zopt} ${^zscriptdirs}/**/*.zwc(|.old)(N) && \ @@ -372,7 +372,7 @@ _zimfw_clean_dumpfile() { _zimfw_compile() { # Array with unique dirs. ${ZIM_HOME} or any subdirectory should only occur once. - local -Ur zscriptdirs=(${ZIM_HOME} ${${_zdirs##${ZIM_HOME}/*}:A}) + local -Ur zscriptdirs=(${ZIM_HOME} ${${(v)_zdirs##${ZIM_HOME}/*}:A}) # Compile Zim scripts local zfile for zfile in ${^zscriptdirs}/(^*test*/)#*.zsh(|-theme)(N-.); do @@ -384,14 +384,17 @@ _zimfw_compile() { } _zimfw_info() { - print -R 'zimfw version: '${_zversion}' (built at 2022-05-09 23:35:03 UTC, previous commit is 741bb78)' + print -R 'zimfw version: '${_zversion}' (built at 2022-05-17 23:38:19 UTC, previous commit is d6b4aa6)' print -R 'ZIM_HOME: '${ZIM_HOME} print -R 'Zsh version: '${ZSH_VERSION} print -R 'System info: '$(command uname -a) } _zimfw_install_update() { - _zimfw_source_zimrc 1 ${1} && zargs -n 11 -P 0 -- "${_zmodules_zargs[@]}" -- _zimfw_run_tool + local -r _zargs_action=${1} + _zimfw_source_zimrc 1 && zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool + # Ignore return from zargs with -P + return 0 } _zimfw_uninstall() { @@ -432,28 +435,27 @@ _zimfw_upgrade() { } _zimfw_run_list() { - local -r ztool=${1} zmodule=${3} zdir=${4} zurl=${5} ztype=${6} zrev=${7} zonpull=${9} - local -ri zsubmodules=${8} zfrozen=${10} zdisabled=${11} - print -PnR "%B${zmodule}:%b ${zdir}" - if [[ -z ${zurl} ]] print -Pn ' (external)' - if (( ${zfrozen} )) print -Pn ' (frozen)' - if (( ${zdisabled} )) print -Pn ' (disabled)' + local -r zname=${1} + print -PnR "%B${zname}:%b ${_zdirs[${zname}]}" + if [[ -z ${_zurls[${zname}]} ]] print -Pn ' (external)' + if (( ${_zfrozens[${zname}]} )) print -Pn ' (frozen)' + if (( ${_zdisableds[${zname}]} )) print -Pn ' (disabled)' print if (( _zprintlevel > 1 )); then - if [[ ${zfrozen} -eq 0 && -n ${zurl} ]]; then - print -nR " From: ${zurl}, " - if [[ -z ${zrev} ]]; then + if [[ ${_zfrozens[${zname}]} -eq 0 && -n ${_zurls[${zname}]} ]]; then + print -nR " From: ${_zurls[${zname}]}, " + if [[ -z ${_zrevs[${zname}]} ]]; then print -n 'default branch' else - print -nR "${ztype} ${zrev}" + print -nR "${_ztypes[${zname}]} ${_zrevs[${zname}]}" fi - print -nR ", using ${ztool}" - if (( ! zsubmodules )) print -nR ', no git submodules' + print -nR ", using ${_ztools[${zname}]}" + if (( ! _zsubmodules[${zname}] )) print -nR ', no git submodules' print - if [[ -n ${zonpull} ]] print -R " On-pull: ${zonpull}" + if [[ -n ${_zonpulls[${zname}]} ]] print -R " On-pull: ${_zonpulls[${zname}]}" fi # Match and remove the current module prefix from _zfpaths, _zfunctions and _zcmds - local -r zpre=${zmodule}$'\0' + local -r zpre=${zname}$'\0' local -r zfpaths=(${${(M)_zfpaths:#${zpre}*}#${zpre}}) zfunctions=(${${(M)_zfunctions:#${zpre}*}#${zpre}}) zcmds=(${${(M)_zcmds:#${zpre}*}#${zpre}}) if (( ${#zfpaths} )) print -R ' fpath: '${zfpaths} if (( ${#zfunctions} )) print -R ' autoload: '${zfunctions} @@ -462,38 +464,37 @@ _zimfw_run_list() { } _zimfw_run_tool() { - local -r ztool=${1} zaction=${2} zmodule=${3} zdir=${4} zurl=${5} - if [[ -z ${zurl} ]]; then - if (( _zprintlevel > 1 )) print -u2 -PR $'\E[2K\r'"%F{green})%f %B${zmodule}:%b Skipping external module" + local -r zname=${1} + if [[ -z ${_zurls[${zname}]} ]]; then + if (( _zprintlevel > 1 )) print -u2 -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping external module" return 0 fi - local -ri zfrozen=${10} - if (( zfrozen )); then - if (( _zprintlevel > 1 )) print -u2 -PR $'\E[2K\r'"%F{green})%f %B${zmodule}:%b Skipping frozen module" + if (( _zfrozens[${zname}] )); then + if (( _zprintlevel > 1 )) print -u2 -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping frozen module" return 0 fi - case ${zaction} in + case ${_zargs_action} in install) - if [[ -e ${zdir} ]]; then - # Already installed + if [[ -e ${_zdirs[${zname}]} ]]; then + if (( _zprintlevel > 1 )) print -u2 -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping already installed module" return 0 fi - _zimfw_print -nR $'\E[2K\r'"Installing ${zmodule} ..." + _zimfw_print -nR $'\E[2K\r'"Installing ${zname} ..." ;; update) - if [[ ! -d ${zdir} ]]; then - print -u2 -PR $'\E[2K\r'"%F{red}x %B${zmodule}:%b Not installed. Run %Bzimfw install%b to install.%f" + if [[ ! -d ${_zdirs[${zname}]} ]]; then + print -u2 -PR $'\E[2K\r'"%F{red}x %B${zname}:%b Not installed. Run %Bzimfw install%b to install.%f" return 1 fi - _zimfw_print -nR $'\E[2K\r'"Updating ${zmodule} ..." + _zimfw_print -nR $'\E[2K\r'"Updating ${zname} ..." ;; *) - print -u2 -PR $'\E[2K\r'"%F{red}x %B${zmodule}:%b Unknown action ${zaction}%f" + print -u2 -PR $'\E[2K\r'"%F{red}x %B${zname}:%b Unknown action ${_zargs_action}%f" return 1 ;; esac local zcmd - case ${ztool} in + case ${_ztools[${zname}]} in degit) zcmd="# This runs in a new shell builtin emulate -L zsh -o EXTENDED_GLOB readonly -i PRINTLEVEL=\${1} SUBMODULES=\${8} @@ -649,7 +650,7 @@ esac git) zcmd="# This runs in a new shell builtin emulate -L zsh readonly -i PRINTLEVEL=\${1} SUBMODULES=\${8} -readonly ACTION=\${2} MODULE=\${3} DIR=\${4} URL=\${5} TYPE=\${6:=branch} ONPULL=\${9} +readonly ACTION=\${2} MODULE=\${3} DIR=\${4} URL=\${5} TYPE=\${6} ONPULL=\${9} REV=\${7} print_error() { @@ -745,16 +746,16 @@ case \${ACTION} in esac " ;; *) - print -u2 -PR "$'\E[2K\r'%F{red}x %B${zmodule}:%b Unknown tool ${ztool}%f" + print -u2 -PR "$'\E[2K\r'%F{red}x %B${zname}:%b Unknown tool ${_ztools[${zname}]}%f" return 1 ;; esac - zsh -c ${zcmd} ${ztool} ${_zprintlevel} "${@[2,9]}" + zsh -c ${zcmd} ${_ztools[${zname}]} "${_zprintlevel}" "${_zargs_action}" "${zname}" "${_zdirs[${zname}]}" "${_zurls[${zname}]}" "${_ztypes[${zname}]}" "${_zrevs[${zname}]}" "${_zsubmodules[${zname}]}" "${_zonpulls[${zname}]}" } zimfw() { builtin emulate -L zsh -o EXTENDED_GLOB - local -r _zversion='1.9.0' zusage="Usage: %B${0}%b [%B-q%b|%B-v%b] + local -r _zversion='1.9.1-SNAPSHOT' zusage="Usage: %B${0}%b [%B-q%b|%B-v%b] Actions: %Bbuild%b Build %B${ZIM_HOME}/init.zsh%b and %B${ZIM_HOME}/login_init.zsh%b. @@ -780,7 +781,9 @@ Actions: Options: %B-q%b Quiet (yes to prompts, and only outputs errors) %B-v%b Verbose (outputs more details)" - local -a _zdisabled_dirs _zdirs _zfpaths _zfunctions _zcmds _zmodules_zargs _zunused_dirs + local -Ua _znames _zdisabled_dirs + local -A _zfrozens _zdisableds _ztools _zdirs _zurls _ztypes _zrevs _zsubmodules _zonpulls + local -a _zfpaths _zfunctions _zcmds _zunused_dirs local -i _zprintlevel=1 if (( # > 2 )); then print -u2 -PlR "%F{red}${0}: Too many options%f" '' ${zusage} @@ -811,11 +814,11 @@ Options: clean) _zimfw_source_zimrc 2 && _zimfw_clean_compiled && _zimfw_clean_dumpfile ;; clean-compiled) _zimfw_source_zimrc 2 && _zimfw_clean_compiled ;; clean-dumpfile) _zimfw_clean_dumpfile ;; - compile) _zimfw_compile ;; + compile) _zimfw_source_zimrc 2 && _zimfw_compile ;; help) print -PR ${zusage} ;; info) _zimfw_info ;; list) - _zimfw_source_zimrc 3 && zargs -n 11 -- "${_zmodules_zargs[@]}" -- _zimfw_run_list && \ + _zimfw_source_zimrc 3 && zargs -n 1 -- "${_znames[@]}" -- _zimfw_run_list && \ _zimfw_list_unuseds ' (unused)' ;; init) @@ -835,7 +838,7 @@ Options: upgrade) _zimfw_upgrade || return 1 (( _zprintlevel-- )) - _zimfw_compile + _zimfw_source_zimrc 2 && _zimfw_compile ;; version) print -PR ${_zversion} ;; *)