Don't use a new shell to run tool anymore
This was needed when we were using xargs, but we're already using zargs instead for quite some time. Pro is that now common functions are reused instead of repeated. Con (or change) is that due to that reuse, and in favor of simplification, the warning for a module with git submodules in degit is in a separate line from a separate print call now. Also fix regressions from recent commits: - Need to call _zimfw_source_zimrc twice with 1 and 2 flags instead of with flag 3, since flag 2 must be used after module is installed or updated. - Need to call _zimfw_print_okay from the function that handles on-pull, since we want to include the on-pull output in verbose mode. This function was called just `handle` before, now it's called _zimfw_pull_print_okay. Still need to figure out how to return a final error code from _zimfw_run_tool_action.
This commit is contained in:
parent
312b08c20a
commit
ee93f7944f
17 changed files with 577 additions and 635 deletions
|
@ -5,6 +5,6 @@ _zimfw_build_login_init() {
|
||||||
command mv -f ${ztarget}{,.old} || return 1
|
command mv -f ${ztarget}{,.old} || return 1
|
||||||
fi
|
fi
|
||||||
_zimfw_mv =(
|
_zimfw_mv =(
|
||||||
print -nR "<%= render_escaped("src/templates/login_init.zsh.erb") %>"
|
print '# Do nothing. This file is deprecated.'
|
||||||
) ${ztarget}
|
) ${ztarget}
|
||||||
}
|
}
|
||||||
|
|
3
src/stage2/70_zimfw_print_error.zsh.erb
Normal file
3
src/stage2/70_zimfw_print_error.zsh.erb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_zimfw_print_error() {
|
||||||
|
print -u2 -PlR <%= clear_line %>"%F{red}<%= error %>%B${_zname}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
||||||
|
}
|
3
src/stage2/70_zimfw_print_okay.zsh.erb
Normal file
3
src/stage2/70_zimfw_print_okay.zsh.erb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
_zimfw_print_okay() {
|
||||||
|
if (( _zprintlevel > ${2:-0} )) print -PlR <%= clear_line %>"<%= okay %>%B${_zname}:%b ${1}" ${3:+${(F):- ${(f)^3}}}
|
||||||
|
}
|
|
@ -1,44 +0,0 @@
|
||||||
_zimfw_run_tool() {
|
|
||||||
local -r zname=${1}
|
|
||||||
if [[ -z ${_zurls[${zname}]} ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping external module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
if (( _zfrozens[${zname}] )); then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping frozen module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
case ${_zargs_action} in
|
|
||||||
install)
|
|
||||||
if [[ -e ${_zdirs[${zname}]} ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR <%= clear_line %>"<%= okay %>%B${zname}:%b Skipping already installed module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
_zimfw_print -nR <%= clear_line %>"Installing ${zname}<%= ellipsis %>"
|
|
||||||
;;
|
|
||||||
check|update)
|
|
||||||
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
|
|
||||||
if [[ ${_zargs_action} == check ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -nR <%= clear_line %>"Checking ${zname}<%= ellipsis %>"
|
|
||||||
else
|
|
||||||
_zimfw_print -nR <%= clear_line %>"Updating ${zname}<%= ellipsis %>"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{red}<%= error %>%B${zname}:%b Unknown action ${_zargs_action}%f"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
local zcmd
|
|
||||||
case ${_ztools[${zname}]} in
|
|
||||||
<%= render_tools("src/tools/*", "zcmd") %>
|
|
||||||
*)
|
|
||||||
print -u2 -PR "<%= clear_line %>%F{red}<%= error %>%B${zname}:%b Unknown tool ${_ztools[${zname}]}%f"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
zsh -c ${zcmd} ${_ztools[${zname}]} "${_zprintlevel}" "${_zargs_action}" "${zname}" "${_zdirs[${zname}]}" "${_zurls[${zname}]}" "${_ztypes[${zname}]}" "${_zrevs[${zname}]}" "${_zsubmodules[${zname}]}" "${_zonpulls[${zname}]}"
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
_zimfw_run_tool_action() {
|
|
||||||
local -r _zargs_action=${1}
|
|
||||||
zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool
|
|
||||||
# Ignore return from zargs with -P. Was missing values before zsh 5.9, and
|
|
||||||
# it's intermittently failing in zsh 5.9 and macOS. See https://www.zsh.org/mla/workers/2022/msg00611.html
|
|
||||||
return 0
|
|
||||||
}
|
|
13
src/stage2/71_zimfw_pull_print_okay.zsh.erb
Normal file
13
src/stage2/71_zimfw_pull_print_okay.zsh.erb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
_zimfw_pull_print_okay() {
|
||||||
|
if [[ -n ${zonpull} ]]; then
|
||||||
|
local zerr
|
||||||
|
if ! zerr=$(builtin cd -q ${zdir} 2>&1 && builtin eval ${zonpull} 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during on-pull' ${zerr}
|
||||||
|
return 1
|
||||||
|
elif [[ ${_zprintlevel} -gt 1 && -n ${zerr} ]]; then
|
||||||
|
# Overrides ${3} to include the on-pull output, to be used by _zimfw_print_okay below.
|
||||||
|
builtin set ${1} ${2:-0} ${3:+${3}$'\n'}'On-pull output:'$'\n'${zerr}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_zimfw_print_okay "${@}"
|
||||||
|
}
|
152
src/stage2/75_zimfw_tool_degit.zsh.erb
Normal file
152
src/stage2/75_zimfw_tool_degit.zsh.erb
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
_zimfw_download_tarball() {
|
||||||
|
local host repo
|
||||||
|
if [[ ${zurl} =~ <%= url_regex %> ]]; then
|
||||||
|
host=${match[3]}
|
||||||
|
repo=${match[4]%.git}
|
||||||
|
fi
|
||||||
|
if [[ ${host} != github.com || -z ${repo} ]]; then
|
||||||
|
_zimfw_print_error "${zurl} is not a valid GitHub zurl. Will not try to ${_zaction}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local -r headers_target=${zdir}/${ztemp}_headers
|
||||||
|
{
|
||||||
|
local info_header header etag zerr
|
||||||
|
if [[ -r ${zinfo_target} ]]; then
|
||||||
|
local -r info=("${(@f)"$(<${zinfo_target})"}")
|
||||||
|
if [[ ${zurl} != ${info[1]} ]]; then
|
||||||
|
_zimfw_print_error "zurl does not match. Expected ${zurl}. Will not try to ${_zaction}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# Previous zrev is in line 2, reserved for future use.
|
||||||
|
info_header=${info[3]}
|
||||||
|
fi
|
||||||
|
local -r tarball_url=https://api.github.com/repos/${repo}/tarball/${zrev}
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
if [[ -z ${info_header} ]] return 0
|
||||||
|
if (( ${+commands[curl]} )); then
|
||||||
|
command curl -IfsL -H ${info_header} ${tarball_url} >${headers_target}
|
||||||
|
else
|
||||||
|
command wget --spider -qS --header=${info_header} ${tarball_url} 2>${headers_target}
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if (( ${+commands[curl]} )); then
|
||||||
|
if ! zerr=$(command curl -fsSL ${info_header:+-H} ${info_header} -o ${ztarball_target} -D ${headers_target} ${tarball_url} 2>&1); then
|
||||||
|
_zimfw_print_error "Error downloading ${tarball_url} with curl" ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
||||||
|
command wget -qS ${info_header:+--header=${info_header}} -O ${ztarball_target} ${tarball_url} 2>${headers_target}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
local -i http_code
|
||||||
|
while IFS= read -r header; do
|
||||||
|
header=${${header## ##}%%$'\r'##}
|
||||||
|
if [[ ${header} == HTTP/* ]]; then
|
||||||
|
http_code=${${(s: :)header}[2]}
|
||||||
|
elif [[ ${${(L)header%%:*}%% ##} == etag ]]; then
|
||||||
|
etag=${${header#*:}## ##}
|
||||||
|
fi
|
||||||
|
done < ${headers_target}
|
||||||
|
if (( http_code == 304 )); then
|
||||||
|
# Not Modified
|
||||||
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
|
return 0
|
||||||
|
elif (( http_code != 200 )); then
|
||||||
|
_zimfw_print_error "Error downloading ${tarball_url}, HTTP code ${http_code}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ -z ${etag} ]]; then
|
||||||
|
_zimfw_print_error "Error downloading ${tarball_url}, no ETag header found in response"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
command touch ${ztarball_target} # Update available
|
||||||
|
else
|
||||||
|
if ! print -lR "${zurl}" "${zrev}" "If-None-Match: ${etag}" >! ${zinfo_target} 2>/dev/null; then
|
||||||
|
_zimfw_print_error "Error creating or updating ${zinfo_target}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
} always {
|
||||||
|
command rm -f ${headers_target} 2>/dev/null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_untar_tarball() {
|
||||||
|
local zerr
|
||||||
|
if ! zerr=$(command tar -C ${1} --strip=1 -xzf ${ztarball_target} 2>&1); then
|
||||||
|
_zimfw_print_error "Error extracting ${ztarball_target}" ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_create_dir() {
|
||||||
|
local zerr
|
||||||
|
if ! zerr=$(command mkdir -p ${1} 2>&1); then
|
||||||
|
_zimfw_print_error "Error creating ${1}" ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_tool_degit() {
|
||||||
|
local -ri zsubmodules=${5}
|
||||||
|
local -r zdir=${1} zurl=${2} zrev=${4} zonpull=${6} ztemp=.zdegit_${sysparams[pid]}
|
||||||
|
local -r ztarball_target=${zdir}/${ztemp}_tarball.tar.gz zinfo_target=${zdir}/.zdegit
|
||||||
|
case ${_zaction} in
|
||||||
|
install)
|
||||||
|
{
|
||||||
|
_zimfw_create_dir ${zdir} && _zimfw_download_tarball && _zimfw_untar_tarball ${zdir} && _zimfw_pull_print_okay Installed || return 1
|
||||||
|
} always {
|
||||||
|
# return 1 does not change ${TRY_BLOCK_ERROR}, only changes ${?}
|
||||||
|
(( TRY_BLOCK_ERROR = ? ))
|
||||||
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
|
if (( TRY_BLOCK_ERROR )) command rm -rf ${zdir} 2>/dev/null
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if [[ ! -r ${zinfo_target} ]]; then
|
||||||
|
if (( _zprintlevel > 0 )); then
|
||||||
|
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${_zname}:%b Module was not installed using Zim's degit. Will not try to ${_zaction}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
readonly zdir_new=${zdir}${ztemp}
|
||||||
|
{
|
||||||
|
local zerr zlog
|
||||||
|
_zimfw_download_tarball || return 1
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
if [[ -e ${ztarball_target} ]]; then
|
||||||
|
_zimfw_print_okay 'Update available'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
if [[ -e ${ztarball_target} ]]; then
|
||||||
|
_zimfw_create_dir ${zdir_new} && _zimfw_untar_tarball ${zdir_new} || return 1
|
||||||
|
if (( ${+commands[diff]} )); then
|
||||||
|
zlog=$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr ${zdir} ${zdir_new} 2>/dev/null)
|
||||||
|
zlog=${${zlog//${zdir_new}/new}//${zdir}/old}
|
||||||
|
fi
|
||||||
|
if ! zerr=$({ command cp -f ${zinfo_target} ${zdir_new} && \
|
||||||
|
command rm -rf ${zdir} && command mv -f ${zdir_new} ${zdir} } 2>&1); then
|
||||||
|
_zimfw_print_error "Error updating ${zdir}" ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
_zimfw_pull_print_okay Updated 0 ${zlog} || return 1
|
||||||
|
else
|
||||||
|
_zimfw_pull_print_okay 'Already up to date' || return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
} always {
|
||||||
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
|
command rm -rf ${zdir_new} 2>/dev/null
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Check after successful install or update
|
||||||
|
if [[ ${_zprintlevel} -gt 0 && ${zsubmodules} -ne 0 && -e ${zdir}/.gitmodules ]]; then
|
||||||
|
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${_zname}:%b Module contains git submodules, which are not supported by Zim's degit. Use zmodule option %B--no-submodules%b to disable this warning.%f"
|
||||||
|
fi
|
||||||
|
}
|
94
src/stage2/75_zimfw_tool_git.zsh.erb
Normal file
94
src/stage2/75_zimfw_tool_git.zsh.erb
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
_zimfw_tool_git() {
|
||||||
|
local -ri zsubmodules=${5}
|
||||||
|
local -r zdir=${1} zurl=${2} ztype=${3} zonpull=${6}
|
||||||
|
local zrev=${4} ztorev zerr zout zlog
|
||||||
|
case ${_zaction} in
|
||||||
|
install)
|
||||||
|
if zerr=$(command git clone ${zrev:+-b} ${zrev} -q --config core.autocrlf=false ${${zsubmodules:#0}:+--recursive} -- ${zurl} ${zdir} 2>&1); then
|
||||||
|
_zimfw_pull_print_okay Installed
|
||||||
|
else
|
||||||
|
_zimfw_print_error 'Error during git clone' ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if [[ ! -r ${zdir}/.git ]]; then
|
||||||
|
if (( _zprintlevel > 0 )); then
|
||||||
|
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${_zname}:%b Module was not installed using git. Will not try to ${_zaction}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [[ ${zurl} != $(command git -C ${zdir} config --get remote.origin.url) ]]; then
|
||||||
|
_zimfw_print_error "zurl does not match. Expected ${zurl}. Will not try to ${_zaction}."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if ! zerr=$(command git -C ${zdir} fetch -pqt origin 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git fetch' ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${ztype} == branch ]]; then
|
||||||
|
if [[ -z ${zrev} ]]; then
|
||||||
|
# Get HEAD remote branch
|
||||||
|
if ! zerr=$(command git -C ${zdir} remote set-head origin -a 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git remote set-head' ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if zrev=$(command git -C ${zdir} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
||||||
|
zrev=${zrev#origin/}
|
||||||
|
else
|
||||||
|
_zimfw_print_error 'Error during git symbolic-ref' ${zrev}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
ztorev=${zrev}@{u}
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
local -ri behind=$(command git -C ${zdir} rev-list --count ${zrev}..${ztorev} -- 2>/dev/null)
|
||||||
|
if (( behind )); then
|
||||||
|
_zimfw_print_okay "Update available [behind ${behind}]"
|
||||||
|
return 4
|
||||||
|
else
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${zrev} == $(command git -C ${zdir} describe --tags --exact-match 2>/dev/null) ]]; then
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
_zimfw_pull_print_okay 'Already up to date'
|
||||||
|
return ${?}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
_zimfw_print_okay 'Update available'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
ztorev=${zrev}
|
||||||
|
fi
|
||||||
|
zlog=$(command git -C ${zdir} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${ztorev} -- 2>/dev/null)
|
||||||
|
if ! zerr=$(command git -C ${zdir} checkout -q ${zrev} -- 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git checkout' ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${ztype} == branch ]]; then
|
||||||
|
if ! zout=$(command git -C ${zdir} merge --ff-only --no-progress -n 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git merge' ${zout}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# keep just first line of zout
|
||||||
|
zout=${zout%%($'\n'|$'\r')*}
|
||||||
|
else
|
||||||
|
zout="Updating to ${ztype} ${zrev}"
|
||||||
|
fi
|
||||||
|
if (( zsubmodules )); then
|
||||||
|
if ! zerr=$(command git -C ${zdir} submodule update --init --recursive -q -- 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during git submodule update' ${zerr}
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
_zimfw_pull_print_okay ${zout} 0 ${zlog}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
45
src/stage2/77_zimfw_run_tool.zsh.erb
Normal file
45
src/stage2/77_zimfw_run_tool.zsh.erb
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
_zimfw_run_tool() {
|
||||||
|
local -r _zname=${1}
|
||||||
|
if [[ -z ${_zurls[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping external module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if (( _zfrozens[${_zname}] )); then
|
||||||
|
_zimfw_print_okay 'Skipping frozen module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case ${_zaction} in
|
||||||
|
install)
|
||||||
|
if [[ -e ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping already installed module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
_zimfw_print -nR <%= clear_line %>"Installing ${_zname}<%= ellipsis %>"
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if [[ ! -d ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_error 'Not installed. Run %Bzimfw install%b to install.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
if (( _zprintlevel > 1 )) print -nR <%= clear_line %>"Checking ${_zname}<%= ellipsis %>"
|
||||||
|
else
|
||||||
|
_zimfw_print -nR <%= clear_line %>"Updating ${_zname}<%= ellipsis %>"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_zimfw_print_error "Unknown action ${_zaction}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
local -r ztool=${_ztools[${_zname}]}
|
||||||
|
case ${ztool} in
|
||||||
|
degit|git)
|
||||||
|
_zimfw_tool_${ztool} "${_zdirs[${_zname}]}" "${_zurls[${_zname}]}" "${_ztypes[${_zname}]}" "${_zrevs[${_zname}]}" "${_zsubmodules[${_zname}]}" "${_zonpulls[${_zname}]}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_zimfw_print_error "Unknown tool ${ztool}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
5
src/stage2/78_zimfw_run_tool_action.zsh.erb
Normal file
5
src/stage2/78_zimfw_run_tool_action.zsh.erb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
_zimfw_run_tool_action() {
|
||||||
|
local -r _zaction=${1}
|
||||||
|
_zimfw_source_zimrc 1 && zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool
|
||||||
|
return 0
|
||||||
|
}
|
|
@ -72,22 +72,22 @@ Options:
|
||||||
;;
|
;;
|
||||||
check)
|
check)
|
||||||
_zrestartmsg=
|
_zrestartmsg=
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action ${1} || return 1
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_print -PR "<%= done %>Done with ${1}." # Only printed in verbose mode
|
_zimfw_print -PR "<%= done %>Done with ${1}." # Only printed in verbose mode
|
||||||
;;
|
;;
|
||||||
init)
|
init)
|
||||||
_zrestartmsg=
|
_zrestartmsg=
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action install || return 1
|
_zimfw_run_tool_action install || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_print -PR "<%= done %>Done with install." # Only printed in verbose mode
|
_zimfw_print -PR "<%= done %>Done with install." # Only printed in verbose mode
|
||||||
_zimfw_build && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
install|update)
|
install|update)
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action ${1} || return 1
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
_zimfw_print -PR "<%= done %>Done with ${1}.${_zrestartmsg}"
|
_zimfw_print -PR "<%= done %>Done with ${1}.${_zrestartmsg}"
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_build && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
uninstall) _zimfw_source_zimrc 2 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
uninstall) _zimfw_source_zimrc 2 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
||||||
check-version) _zimfw_check_version 1 ;;
|
check-version) _zimfw_check_version 1 ;;
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
# Do nothing. This file is deprecated.
|
|
|
@ -1,173 +0,0 @@
|
||||||
# This runs in a new shell
|
|
||||||
builtin emulate -L zsh -o EXTENDED_GLOB
|
|
||||||
integer PRINTLEVEL=${1}
|
|
||||||
readonly -i SUBMODULES=${8}
|
|
||||||
readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} REV=${7} ONPULL=${9} TEMP=.zdegit_${sysparams[pid]}
|
|
||||||
readonly TARBALL_TARGET=${DIR}/${TEMP}_tarball.tar.gz INFO_TARGET=${DIR}/.zdegit
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{red}<%= error %>%B${MODULE}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_okay() {
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
local -r log=${2:+${(F):- ${(f)^2}}}
|
|
||||||
if [[ ${SUBMODULES} -ne 0 && -e ${DIR}/.gitmodules ]]; then
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b ${1}. Module contains git submodules, which are not supported by Zim's degit. Use zmodule option %B--no-submodules%b to disable this warning.%f" ${log}
|
|
||||||
else
|
|
||||||
print -PlR <%= clear_line %>"<%= okay %>%B${MODULE}:%b ${1}" ${log}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
on_pull() {
|
|
||||||
if [[ -n ${ONPULL} ]]; then
|
|
||||||
if ! ERR=$(builtin cd -q ${DIR} 2>&1 && builtin eval ${ONPULL} 2>&1); then
|
|
||||||
print_error 'Error during on-pull' ${ERR}
|
|
||||||
return 1
|
|
||||||
elif [[ ${PRINTLEVEL} -gt 1 && -n ${ERR} ]]; then
|
|
||||||
builtin set ${1} ${2:+${2}$'\n'}"On-pull output:"$'\n'${ERR}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
download_tarball() {
|
|
||||||
local host repo
|
|
||||||
if [[ ${URL} =~ <%= url_regex %> ]]; then
|
|
||||||
host=${match[3]}
|
|
||||||
repo=${match[4]%.git}
|
|
||||||
fi
|
|
||||||
if [[ ${host} != github.com || -z ${repo} ]]; then
|
|
||||||
print_error "${URL} is not a valid GitHub URL. Will not try to ${ACTION}."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
local -r headers_target=${DIR}/${TEMP}_headers
|
|
||||||
{
|
|
||||||
local info_header header etag
|
|
||||||
if [[ -r ${INFO_TARGET} ]]; then
|
|
||||||
local -r info=("${(@f)"$(<${INFO_TARGET})"}")
|
|
||||||
if [[ ${URL} != ${info[1]} ]]; then
|
|
||||||
print_error "URL does not match. Expected ${URL}. Will not try to ${ACTION}."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
# Previous REV is in line 2, reserved for future use.
|
|
||||||
info_header=${info[3]}
|
|
||||||
fi
|
|
||||||
local -r tarball_url=https://api.github.com/repos/${repo}/tarball/${REV}
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
if [[ -z ${info_header} ]] return 0
|
|
||||||
if (( ${+commands[curl]} )); then
|
|
||||||
command curl -IfsL -H ${info_header} ${tarball_url} >${headers_target}
|
|
||||||
else
|
|
||||||
command wget --spider -qS --header=${info_header} ${tarball_url} 2>${headers_target}
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if (( ${+commands[curl]} )); then
|
|
||||||
if ! ERR=$(command curl -fsSL ${info_header:+-H} ${info_header} -o ${TARBALL_TARGET} -D ${headers_target} ${tarball_url} 2>&1); then
|
|
||||||
print_error "Error downloading ${tarball_url} with curl" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
|
||||||
command wget -qS ${info_header:+--header=${info_header}} -O ${TARBALL_TARGET} ${tarball_url} 2>${headers_target}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
local -i http_code
|
|
||||||
while IFS= read -r header; do
|
|
||||||
header=${${header## ##}%%$'\r'##}
|
|
||||||
if [[ ${header} == HTTP/* ]]; then
|
|
||||||
http_code=${${(s: :)header}[2]}
|
|
||||||
elif [[ ${${(L)header%%:*}%% ##} == etag ]]; then
|
|
||||||
etag=${${header#*:}## ##}
|
|
||||||
fi
|
|
||||||
done < ${headers_target}
|
|
||||||
if (( http_code == 304 )); then
|
|
||||||
# Not Modified
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
return 0
|
|
||||||
elif (( http_code != 200 )); then
|
|
||||||
print_error "Error downloading ${tarball_url}, HTTP code ${http_code}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ -z ${etag} ]]; then
|
|
||||||
print_error "Error downloading ${tarball_url}, no ETag header found in response"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
command touch ${TARBALL_TARGET} # Update available
|
|
||||||
else
|
|
||||||
if ! print -lR "${URL}" "${REV}" "If-None-Match: ${etag}" >! ${INFO_TARGET} 2>/dev/null; then
|
|
||||||
print_error "Error creating or updating ${INFO_TARGET}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
} always {
|
|
||||||
command rm -f ${headers_target} 2>/dev/null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
untar_tarball() {
|
|
||||||
if ! ERR=$(command tar -C ${1} --strip=1 -xzf ${TARBALL_TARGET} 2>&1); then
|
|
||||||
print_error "Error extracting ${TARBALL_TARGET}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
create_dir() {
|
|
||||||
if ! ERR=$(command mkdir -p ${1} 2>&1); then
|
|
||||||
print_error "Error creating ${1}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case ${ACTION} in
|
|
||||||
install)
|
|
||||||
{
|
|
||||||
create_dir ${DIR} && download_tarball && untar_tarball ${DIR} && on_pull && print_okay Installed
|
|
||||||
} always {
|
|
||||||
# return 1 does not change ${TRY_BLOCK_ERROR}, only changes ${?}
|
|
||||||
(( TRY_BLOCK_ERROR = ? ))
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
if (( TRY_BLOCK_ERROR )) command rm -rf ${DIR} 2>/dev/null
|
|
||||||
}
|
|
||||||
;;
|
|
||||||
check|update)
|
|
||||||
if [[ ! -r ${INFO_TARGET} ]]; then
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b Module was not installed using Zim's degit. Will not try to ${ACTION}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
readonly DIR_NEW=${DIR}${TEMP}
|
|
||||||
{
|
|
||||||
download_tarball || return 1
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
if [[ -e ${TARBALL_TARGET} ]]; then
|
|
||||||
print_okay 'Update available'
|
|
||||||
else
|
|
||||||
(( PRINTLEVEL-- ))
|
|
||||||
print_okay 'Already up to date'
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [[ ! -e ${TARBALL_TARGET} ]]; then
|
|
||||||
on_pull && print_okay 'Already up to date'
|
|
||||||
return ${?}
|
|
||||||
fi
|
|
||||||
create_dir ${DIR_NEW} && untar_tarball ${DIR_NEW} || return 1
|
|
||||||
if (( ${+commands[diff]} )); then
|
|
||||||
LOG=$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr ${DIR} ${DIR_NEW} 2>/dev/null)
|
|
||||||
LOG=${${LOG//${DIR_NEW}/new}//${DIR}/old}
|
|
||||||
fi
|
|
||||||
if ! ERR=$({ command cp -f ${INFO_TARGET} ${DIR_NEW} && \
|
|
||||||
command rm -rf ${DIR} && command mv -f ${DIR_NEW} ${DIR} } 2>&1); then
|
|
||||||
print_error "Error updating ${DIR}" ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
on_pull && print_okay Updated ${LOG}
|
|
||||||
fi
|
|
||||||
} always {
|
|
||||||
command rm -f ${TARBALL_TARGET} 2>/dev/null
|
|
||||||
command rm -rf ${DIR_NEW} 2>/dev/null
|
|
||||||
}
|
|
||||||
;;
|
|
||||||
esac
|
|
|
@ -1,116 +0,0 @@
|
||||||
# This runs in a new shell
|
|
||||||
builtin emulate -L zsh
|
|
||||||
integer PRINTLEVEL=${1}
|
|
||||||
readonly -i SUBMODULES=${8}
|
|
||||||
readonly ACTION=${2} MODULE=${3} DIR=${4} URL=${5} TYPE=${6} ONPULL=${9}
|
|
||||||
REV=${7}
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR <%= clear_line %>"%F{red}<%= error %>%B${MODULE}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_okay() {
|
|
||||||
if (( PRINTLEVEL > 0 )) print -PlR <%= clear_line %>"<%= okay %>%B${MODULE}:%b ${1}" ${2:+${(F):- ${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
on_pull() {
|
|
||||||
if [[ -n ${ONPULL} ]]; then
|
|
||||||
if ! ERR=$(builtin cd -q ${DIR} 2>&1 && builtin eval ${ONPULL} 2>&1); then
|
|
||||||
print_error 'Error during on-pull' ${ERR}
|
|
||||||
return 1
|
|
||||||
elif [[ ${PRINTLEVEL} -gt 1 && -n ${ERR} ]]; then
|
|
||||||
builtin set ${1} ${2:+${2}$'\n'}'On-pull output:'$'\n'${ERR}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case ${ACTION} in
|
|
||||||
install)
|
|
||||||
if ERR=$(command git clone ${REV:+-b} ${REV} -q --config core.autocrlf=false ${${SUBMODULES:#0}:+--recursive} -- ${URL} ${DIR} 2>&1); then
|
|
||||||
on_pull && print_okay Installed
|
|
||||||
else
|
|
||||||
print_error 'Error during git clone' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
check|update)
|
|
||||||
if [[ ! -r ${DIR}/.git ]]; then
|
|
||||||
if (( PRINTLEVEL > 0 )); then
|
|
||||||
print -u2 -PR <%= clear_line %>"%F{yellow}<%= warn %>%B${MODULE}:%b Module was not installed using git. Will not try to ${ACTION}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
if [[ ${URL} != $(command git -C ${DIR} config --get remote.origin.url) ]]; then
|
|
||||||
print_error "URL does not match. Expected ${URL}. Will not try to ${ACTION}."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if ! ERR=$(command git -C ${DIR} fetch -pqt origin 2>&1); then
|
|
||||||
print_error 'Error during git fetch' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ ${TYPE} == branch ]]; then
|
|
||||||
if [[ -z ${REV} ]]; then
|
|
||||||
# Get HEAD remote branch
|
|
||||||
if ! ERR=$(command git -C ${DIR} remote set-head origin -a 2>&1); then
|
|
||||||
print_error 'Error during git remote set-head' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if REV=$(command git -C ${DIR} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
|
||||||
REV=${REV#origin/}
|
|
||||||
else
|
|
||||||
print_error 'Error during git symbolic-ref' ${REV}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
TO_REV=${REV}@{u}
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
local -ri behind=$(command git -C ${DIR} rev-list --count ${REV}..${TO_REV} -- 2>/dev/null)
|
|
||||||
if (( behind )); then
|
|
||||||
print_okay "Update available [behind ${behind}]"
|
|
||||||
else
|
|
||||||
(( PRINTLEVEL-- ))
|
|
||||||
print_okay 'Already up to date'
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [[ ${REV} == $(command git -C ${DIR} describe --tags --exact-match 2>/dev/null) ]]; then
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
(( PRINTLEVEL-- ))
|
|
||||||
print_okay 'Already up to date'
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
on_pull && print_okay 'Already up to date'
|
|
||||||
return ${?}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [[ ${ACTION} == check ]]; then
|
|
||||||
print_okay 'Update available'
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
TO_REV=${REV}
|
|
||||||
fi
|
|
||||||
LOG=$(command git -C ${DIR} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${TO_REV} -- 2>/dev/null)
|
|
||||||
if ! ERR=$(command git -C ${DIR} checkout -q ${REV} -- 2>&1); then
|
|
||||||
print_error 'Error during git checkout' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if [[ ${TYPE} == branch ]]; then
|
|
||||||
if ! OUT=$(command git -C ${DIR} merge --ff-only --no-progress -n 2>&1); then
|
|
||||||
print_error 'Error during git merge' ${OUT}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
# keep just first line of OUT
|
|
||||||
OUT=${OUT%%($'\n'|$'\r')*}
|
|
||||||
else
|
|
||||||
OUT="Updating to ${TYPE} ${REV}"
|
|
||||||
fi
|
|
||||||
if (( SUBMODULES )); then
|
|
||||||
if ! ERR=$(command git -C ${DIR} submodule update --init --recursive -q -- 2>&1); then
|
|
||||||
print_error 'Error during git submodule update' ${ERR}
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
on_pull && print_okay ${OUT} ${LOG}
|
|
||||||
;;
|
|
||||||
esac
|
|
|
@ -31,16 +31,6 @@ class Zim
|
||||||
def render_commented(filename)
|
def render_commented(filename)
|
||||||
render(filename).gsub(/^(?=.)/, "# ").gsub(/^$/, "#")
|
render(filename).gsub(/^(?=.)/, "# ").gsub(/^$/, "#")
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_escaped(filename)
|
|
||||||
render(filename).gsub(/(?=\$[^']|"|`)/, "\\\\").gsub(/#\{/, "$\{")
|
|
||||||
end
|
|
||||||
|
|
||||||
def render_tools(pattern, var)
|
|
||||||
Dir[pattern].sort.map { |filename|
|
|
||||||
" #{File.basename(filename, ".zsh.erb")}) #{var}=\"#{render_escaped(filename)}\" ;;"
|
|
||||||
}.join("\n")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
zim = Zim.new
|
zim = Zim.new
|
||||||
%># AUTOMATICALLY GENERATED FILE. EDIT ONLY THE SOURCE FILES AND THEN COMPILE.
|
%># AUTOMATICALLY GENERATED FILE. EDIT ONLY THE SOURCE FILES AND THEN COMPILE.
|
||||||
|
|
428
zimfw.zsh
428
zimfw.zsh
|
@ -102,8 +102,7 @@ _zimfw_build_login_init() {
|
||||||
command mv -f ${ztarget}{,.old} || return 1
|
command mv -f ${ztarget}{,.old} || return 1
|
||||||
fi
|
fi
|
||||||
_zimfw_mv =(
|
_zimfw_mv =(
|
||||||
print -nR "# Do nothing. This file is deprecated.
|
print '# Do nothing. This file is deprecated.'
|
||||||
"
|
|
||||||
) ${ztarget}
|
) ${ztarget}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +433,7 @@ _zimfw_compile() {
|
||||||
}
|
}
|
||||||
|
|
||||||
_zimfw_info() {
|
_zimfw_info() {
|
||||||
print -R 'zimfw version: '${_zversion}' (built at 2023-03-26 21:48:32 UTC, previous commit is 903e0e5)'
|
print -R 'zimfw version: '${_zversion}' (built at 2023-03-28 12:56:15 UTC, previous commit is 312b08c)'
|
||||||
local zparam
|
local zparam
|
||||||
for zparam in LANG ${(Mk)parameters:#LC_*} OSTYPE TERM TERM_PROGRAM TERM_PROGRAM_VERSION ZIM_HOME ZSH_VERSION; do
|
for zparam in LANG ${(Mk)parameters:#LC_*} OSTYPE TERM TERM_PROGRAM TERM_PROGRAM_VERSION ZIM_HOME ZSH_VERSION; do
|
||||||
print -R ${(r.22....:.)zparam}${(P)zparam}
|
print -R ${(r.22....:.)zparam}${(P)zparam}
|
||||||
|
@ -519,346 +518,325 @@ _zimfw_run_list() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
_zimfw_run_tool() {
|
_zimfw_print_error() {
|
||||||
local -r zname=${1}
|
print -u2 -PlR $'\E[2K\r'"%F{red}x %B${_zname}:%b ${1}%f" ${2:+${(F):- ${(f)^2}}}
|
||||||
if [[ -z ${_zurls[${zname}]} ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping external module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
if (( _zfrozens[${zname}] )); then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping frozen module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
case ${_zargs_action} in
|
|
||||||
install)
|
|
||||||
if [[ -e ${_zdirs[${zname}]} ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -PR $'\E[2K\r'"%F{green})%f %B${zname}:%b Skipping already installed module"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
_zimfw_print -nR $'\E[2K\r'"Installing ${zname} ..."
|
|
||||||
;;
|
|
||||||
check|update)
|
|
||||||
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
|
|
||||||
if [[ ${_zargs_action} == check ]]; then
|
|
||||||
if (( _zprintlevel > 1 )) print -nR $'\E[2K\r'"Checking ${zname} ..."
|
|
||||||
else
|
|
||||||
_zimfw_print -nR $'\E[2K\r'"Updating ${zname} ..."
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
print -u2 -PR $'\E[2K\r'"%F{red}x %B${zname}:%b Unknown action ${_zargs_action}%f"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
local zcmd
|
|
||||||
case ${_ztools[${zname}]} in
|
|
||||||
degit) zcmd="# This runs in a new shell
|
|
||||||
builtin emulate -L zsh -o EXTENDED_GLOB
|
|
||||||
integer PRINTLEVEL=\${1}
|
|
||||||
readonly -i SUBMODULES=\${8}
|
|
||||||
readonly ACTION=\${2} MODULE=\${3} DIR=\${4} URL=\${5} REV=\${7} ONPULL=\${9} TEMP=.zdegit_\${sysparams[pid]}
|
|
||||||
readonly TARBALL_TARGET=\${DIR}/\${TEMP}_tarball.tar.gz INFO_TARGET=\${DIR}/.zdegit
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR $'\E[2K\r'\"%F{red}x %B\${MODULE}:%b \${1}%f\" \${2:+\${(F):- \${(f)^2}}}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
print_okay() {
|
_zimfw_print_okay() {
|
||||||
if (( PRINTLEVEL > 0 )); then
|
if (( _zprintlevel > ${2:-0} )) print -PlR $'\E[2K\r'"%F{green})%f %B${_zname}:%b ${1}" ${3:+${(F):- ${(f)^3}}}
|
||||||
local -r log=\${2:+\${(F):- \${(f)^2}}}
|
|
||||||
if [[ \${SUBMODULES} -ne 0 && -e \${DIR}/.gitmodules ]]; then
|
|
||||||
print -u2 -PlR $'\E[2K\r'\"%F{yellow}! %B\${MODULE}:%b \${1}. Module contains git submodules, which are not supported by Zim's degit. Use zmodule option %B--no-submodules%b to disable this warning.%f\" \${log}
|
|
||||||
else
|
|
||||||
print -PlR $'\E[2K\r'\"%F{green})%f %B\${MODULE}:%b \${1}\" \${log}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
on_pull() {
|
_zimfw_pull_print_okay() {
|
||||||
if [[ -n \${ONPULL} ]]; then
|
if [[ -n ${zonpull} ]]; then
|
||||||
if ! ERR=\$(builtin cd -q \${DIR} 2>&1 && builtin eval \${ONPULL} 2>&1); then
|
local zerr
|
||||||
print_error 'Error during on-pull' \${ERR}
|
if ! zerr=$(builtin cd -q ${zdir} 2>&1 && builtin eval ${zonpull} 2>&1); then
|
||||||
|
_zimfw_print_error 'Error during on-pull' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
elif [[ \${PRINTLEVEL} -gt 1 && -n \${ERR} ]]; then
|
elif [[ ${_zprintlevel} -gt 1 && -n ${zerr} ]]; then
|
||||||
builtin set \${1} \${2:+\${2}$'\n'}\"On-pull output:\"$'\n'\${ERR}
|
# Overrides ${3} to include the on-pull output, to be used by _zimfw_print_okay below.
|
||||||
|
builtin set ${1} ${2:-0} ${3:+${3}$'\n'}'On-pull output:'$'\n'${zerr}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
_zimfw_print_okay "${@}"
|
||||||
}
|
}
|
||||||
|
|
||||||
download_tarball() {
|
_zimfw_download_tarball() {
|
||||||
local host repo
|
local host repo
|
||||||
if [[ \${URL} =~ ^([^:@/]+://)?([^@]+@)?([^:/]+)[:/]([^/]+/[^/]+)/?\$ ]]; then
|
if [[ ${zurl} =~ ^([^:@/]+://)?([^@]+@)?([^:/]+)[:/]([^/]+/[^/]+)/?$ ]]; then
|
||||||
host=\${match[3]}
|
host=${match[3]}
|
||||||
repo=\${match[4]%.git}
|
repo=${match[4]%.git}
|
||||||
fi
|
fi
|
||||||
if [[ \${host} != github.com || -z \${repo} ]]; then
|
if [[ ${host} != github.com || -z ${repo} ]]; then
|
||||||
print_error \"\${URL} is not a valid GitHub URL. Will not try to \${ACTION}.\"
|
_zimfw_print_error "${zurl} is not a valid GitHub zurl. Will not try to ${_zaction}."
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
local -r headers_target=\${DIR}/\${TEMP}_headers
|
local -r headers_target=${zdir}/${ztemp}_headers
|
||||||
{
|
{
|
||||||
local info_header header etag
|
local info_header header etag zerr
|
||||||
if [[ -r \${INFO_TARGET} ]]; then
|
if [[ -r ${zinfo_target} ]]; then
|
||||||
local -r info=(\"\${(@f)\"\$(<\${INFO_TARGET})\"}\")
|
local -r info=("${(@f)"$(<${zinfo_target})"}")
|
||||||
if [[ \${URL} != \${info[1]} ]]; then
|
if [[ ${zurl} != ${info[1]} ]]; then
|
||||||
print_error \"URL does not match. Expected \${URL}. Will not try to \${ACTION}.\"
|
_zimfw_print_error "zurl does not match. Expected ${zurl}. Will not try to ${_zaction}."
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
# Previous REV is in line 2, reserved for future use.
|
# Previous zrev is in line 2, reserved for future use.
|
||||||
info_header=\${info[3]}
|
info_header=${info[3]}
|
||||||
fi
|
fi
|
||||||
local -r tarball_url=https://api.github.com/repos/\${repo}/tarball/\${REV}
|
local -r tarball_url=https://api.github.com/repos/${repo}/tarball/${zrev}
|
||||||
if [[ \${ACTION} == check ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
if [[ -z \${info_header} ]] return 0
|
if [[ -z ${info_header} ]] return 0
|
||||||
if (( \${+commands[curl]} )); then
|
if (( ${+commands[curl]} )); then
|
||||||
command curl -IfsL -H \${info_header} \${tarball_url} >\${headers_target}
|
command curl -IfsL -H ${info_header} ${tarball_url} >${headers_target}
|
||||||
else
|
else
|
||||||
command wget --spider -qS --header=\${info_header} \${tarball_url} 2>\${headers_target}
|
command wget --spider -qS --header=${info_header} ${tarball_url} 2>${headers_target}
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if (( \${+commands[curl]} )); then
|
if (( ${+commands[curl]} )); then
|
||||||
if ! ERR=\$(command curl -fsSL \${info_header:+-H} \${info_header} -o \${TARBALL_TARGET} -D \${headers_target} \${tarball_url} 2>&1); then
|
if ! zerr=$(command curl -fsSL ${info_header:+-H} ${info_header} -o ${ztarball_target} -D ${headers_target} ${tarball_url} 2>&1); then
|
||||||
print_error \"Error downloading \${tarball_url} with curl\" \${ERR}
|
_zimfw_print_error "Error downloading ${tarball_url} with curl" ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
# wget returns 8 when 304 Not Modified, so we cannot use wget's error codes
|
||||||
command wget -qS \${info_header:+--header=\${info_header}} -O \${TARBALL_TARGET} \${tarball_url} 2>\${headers_target}
|
command wget -qS ${info_header:+--header=${info_header}} -O ${ztarball_target} ${tarball_url} 2>${headers_target}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
local -i http_code
|
local -i http_code
|
||||||
while IFS= read -r header; do
|
while IFS= read -r header; do
|
||||||
header=\${\${header## ##}%%$'\r'##}
|
header=${${header## ##}%%$'\r'##}
|
||||||
if [[ \${header} == HTTP/* ]]; then
|
if [[ ${header} == HTTP/* ]]; then
|
||||||
http_code=\${\${(s: :)header}[2]}
|
http_code=${${(s: :)header}[2]}
|
||||||
elif [[ \${\${(L)header%%:*}%% ##} == etag ]]; then
|
elif [[ ${${(L)header%%:*}%% ##} == etag ]]; then
|
||||||
etag=\${\${header#*:}## ##}
|
etag=${${header#*:}## ##}
|
||||||
fi
|
fi
|
||||||
done < \${headers_target}
|
done < ${headers_target}
|
||||||
if (( http_code == 304 )); then
|
if (( http_code == 304 )); then
|
||||||
# Not Modified
|
# Not Modified
|
||||||
command rm -f \${TARBALL_TARGET} 2>/dev/null
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
return 0
|
return 0
|
||||||
elif (( http_code != 200 )); then
|
elif (( http_code != 200 )); then
|
||||||
print_error \"Error downloading \${tarball_url}, HTTP code \${http_code}\"
|
_zimfw_print_error "Error downloading ${tarball_url}, HTTP code ${http_code}"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if [[ -z \${etag} ]]; then
|
if [[ -z ${etag} ]]; then
|
||||||
print_error \"Error downloading \${tarball_url}, no ETag header found in response\"
|
_zimfw_print_error "Error downloading ${tarball_url}, no ETag header found in response"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if [[ \${ACTION} == check ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
command touch \${TARBALL_TARGET} # Update available
|
command touch ${ztarball_target} # Update available
|
||||||
else
|
else
|
||||||
if ! print -lR \"\${URL}\" \"\${REV}\" \"If-None-Match: \${etag}\" >! \${INFO_TARGET} 2>/dev/null; then
|
if ! print -lR "${zurl}" "${zrev}" "If-None-Match: ${etag}" >! ${zinfo_target} 2>/dev/null; then
|
||||||
print_error \"Error creating or updating \${INFO_TARGET}\"
|
_zimfw_print_error "Error creating or updating ${zinfo_target}"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
} always {
|
} always {
|
||||||
command rm -f \${headers_target} 2>/dev/null
|
command rm -f ${headers_target} 2>/dev/null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
untar_tarball() {
|
_zimfw_untar_tarball() {
|
||||||
if ! ERR=\$(command tar -C \${1} --strip=1 -xzf \${TARBALL_TARGET} 2>&1); then
|
local zerr
|
||||||
print_error \"Error extracting \${TARBALL_TARGET}\" \${ERR}
|
if ! zerr=$(command tar -C ${1} --strip=1 -xzf ${ztarball_target} 2>&1); then
|
||||||
|
_zimfw_print_error "Error extracting ${ztarball_target}" ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
create_dir() {
|
_zimfw_create_dir() {
|
||||||
if ! ERR=\$(command mkdir -p \${1} 2>&1); then
|
local zerr
|
||||||
print_error \"Error creating \${1}\" \${ERR}
|
if ! zerr=$(command mkdir -p ${1} 2>&1); then
|
||||||
|
_zimfw_print_error "Error creating ${1}" ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
case \${ACTION} in
|
_zimfw_tool_degit() {
|
||||||
|
local -ri zsubmodules=${5}
|
||||||
|
local -r zdir=${1} zurl=${2} zrev=${4} zonpull=${6} ztemp=.zdegit_${sysparams[pid]}
|
||||||
|
local -r ztarball_target=${zdir}/${ztemp}_tarball.tar.gz zinfo_target=${zdir}/.zdegit
|
||||||
|
case ${_zaction} in
|
||||||
install)
|
install)
|
||||||
{
|
{
|
||||||
create_dir \${DIR} && download_tarball && untar_tarball \${DIR} && on_pull && print_okay Installed
|
_zimfw_create_dir ${zdir} && _zimfw_download_tarball && _zimfw_untar_tarball ${zdir} && _zimfw_pull_print_okay Installed || return 1
|
||||||
} always {
|
} always {
|
||||||
# return 1 does not change \${TRY_BLOCK_ERROR}, only changes \${?}
|
# return 1 does not change ${TRY_BLOCK_ERROR}, only changes ${?}
|
||||||
(( TRY_BLOCK_ERROR = ? ))
|
(( TRY_BLOCK_ERROR = ? ))
|
||||||
command rm -f \${TARBALL_TARGET} 2>/dev/null
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
if (( TRY_BLOCK_ERROR )) command rm -rf \${DIR} 2>/dev/null
|
if (( TRY_BLOCK_ERROR )) command rm -rf ${zdir} 2>/dev/null
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
check|update)
|
check|update)
|
||||||
if [[ ! -r \${INFO_TARGET} ]]; then
|
if [[ ! -r ${zinfo_target} ]]; then
|
||||||
if (( PRINTLEVEL > 0 )); then
|
if (( _zprintlevel > 0 )); then
|
||||||
print -u2 -PR $'\E[2K\r'\"%F{yellow}! %B\${MODULE}:%b Module was not installed using Zim's degit. Will not try to \${ACTION}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f\"
|
print -u2 -PR $'\E[2K\r'"%F{yellow}! %B${_zname}:%b Module was not installed using Zim's degit. Will not try to ${_zaction}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
readonly DIR_NEW=\${DIR}\${TEMP}
|
readonly zdir_new=${zdir}${ztemp}
|
||||||
{
|
{
|
||||||
download_tarball || return 1
|
local zerr zlog
|
||||||
if [[ \${ACTION} == check ]]; then
|
_zimfw_download_tarball || return 1
|
||||||
if [[ -e \${TARBALL_TARGET} ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
print_okay 'Update available'
|
if [[ -e ${ztarball_target} ]]; then
|
||||||
|
_zimfw_print_okay 'Update available'
|
||||||
|
return 4
|
||||||
|
fi
|
||||||
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
|
return 0
|
||||||
else
|
else
|
||||||
(( PRINTLEVEL-- ))
|
if [[ -e ${ztarball_target} ]]; then
|
||||||
print_okay 'Already up to date'
|
_zimfw_create_dir ${zdir_new} && _zimfw_untar_tarball ${zdir_new} || return 1
|
||||||
|
if (( ${+commands[diff]} )); then
|
||||||
|
zlog=$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr ${zdir} ${zdir_new} 2>/dev/null)
|
||||||
|
zlog=${${zlog//${zdir_new}/new}//${zdir}/old}
|
||||||
fi
|
fi
|
||||||
else
|
if ! zerr=$({ command cp -f ${zinfo_target} ${zdir_new} && \
|
||||||
if [[ ! -e \${TARBALL_TARGET} ]]; then
|
command rm -rf ${zdir} && command mv -f ${zdir_new} ${zdir} } 2>&1); then
|
||||||
on_pull && print_okay 'Already up to date'
|
_zimfw_print_error "Error updating ${zdir}" ${zerr}
|
||||||
return \${?}
|
|
||||||
fi
|
|
||||||
create_dir \${DIR_NEW} && untar_tarball \${DIR_NEW} || return 1
|
|
||||||
if (( \${+commands[diff]} )); then
|
|
||||||
LOG=\$(command diff -x '.zdegit*' -x '*.zwc' -x '*.zwc.old' -qr \${DIR} \${DIR_NEW} 2>/dev/null)
|
|
||||||
LOG=\${\${LOG//\${DIR_NEW}/new}//\${DIR}/old}
|
|
||||||
fi
|
|
||||||
if ! ERR=\$({ command cp -f \${INFO_TARGET} \${DIR_NEW} && \
|
|
||||||
command rm -rf \${DIR} && command mv -f \${DIR_NEW} \${DIR} } 2>&1); then
|
|
||||||
print_error \"Error updating \${DIR}\" \${ERR}
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
on_pull && print_okay Updated \${LOG}
|
_zimfw_pull_print_okay Updated 0 ${zlog} || return 1
|
||||||
|
else
|
||||||
|
_zimfw_pull_print_okay 'Already up to date' || return 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
} always {
|
} always {
|
||||||
command rm -f \${TARBALL_TARGET} 2>/dev/null
|
command rm -f ${ztarball_target} 2>/dev/null
|
||||||
command rm -rf \${DIR_NEW} 2>/dev/null
|
command rm -rf ${zdir_new} 2>/dev/null
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
" ;;
|
# Check after successful install or update
|
||||||
git) zcmd="# This runs in a new shell
|
if [[ ${_zprintlevel} -gt 0 && ${zsubmodules} -ne 0 && -e ${zdir}/.gitmodules ]]; then
|
||||||
builtin emulate -L zsh
|
print -u2 -PR $'\E[2K\r'"%F{yellow}! %B${_zname}:%b Module contains git submodules, which are not supported by Zim's degit. Use zmodule option %B--no-submodules%b to disable this warning.%f"
|
||||||
integer PRINTLEVEL=\${1}
|
|
||||||
readonly -i SUBMODULES=\${8}
|
|
||||||
readonly ACTION=\${2} MODULE=\${3} DIR=\${4} URL=\${5} TYPE=\${6} ONPULL=\${9}
|
|
||||||
REV=\${7}
|
|
||||||
|
|
||||||
print_error() {
|
|
||||||
print -u2 -PlR $'\E[2K\r'\"%F{red}x %B\${MODULE}:%b \${1}%f\" \${2:+\${(F):- \${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
print_okay() {
|
|
||||||
if (( PRINTLEVEL > 0 )) print -PlR $'\E[2K\r'\"%F{green})%f %B\${MODULE}:%b \${1}\" \${2:+\${(F):- \${(f)^2}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
on_pull() {
|
|
||||||
if [[ -n \${ONPULL} ]]; then
|
|
||||||
if ! ERR=\$(builtin cd -q \${DIR} 2>&1 && builtin eval \${ONPULL} 2>&1); then
|
|
||||||
print_error 'Error during on-pull' \${ERR}
|
|
||||||
return 1
|
|
||||||
elif [[ \${PRINTLEVEL} -gt 1 && -n \${ERR} ]]; then
|
|
||||||
builtin set \${1} \${2:+\${2}$'\n'}'On-pull output:'$'\n'\${ERR}
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
case \${ACTION} in
|
_zimfw_tool_git() {
|
||||||
|
local -ri zsubmodules=${5}
|
||||||
|
local -r zdir=${1} zurl=${2} ztype=${3} zonpull=${6}
|
||||||
|
local zrev=${4} ztorev zerr zout zlog
|
||||||
|
case ${_zaction} in
|
||||||
install)
|
install)
|
||||||
if ERR=\$(command git clone \${REV:+-b} \${REV} -q --config core.autocrlf=false \${\${SUBMODULES:#0}:+--recursive} -- \${URL} \${DIR} 2>&1); then
|
if zerr=$(command git clone ${zrev:+-b} ${zrev} -q --config core.autocrlf=false ${${zsubmodules:#0}:+--recursive} -- ${zurl} ${zdir} 2>&1); then
|
||||||
on_pull && print_okay Installed
|
_zimfw_pull_print_okay Installed
|
||||||
else
|
else
|
||||||
print_error 'Error during git clone' \${ERR}
|
_zimfw_print_error 'Error during git clone' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
check|update)
|
check|update)
|
||||||
if [[ ! -r \${DIR}/.git ]]; then
|
if [[ ! -r ${zdir}/.git ]]; then
|
||||||
if (( PRINTLEVEL > 0 )); then
|
if (( _zprintlevel > 0 )); then
|
||||||
print -u2 -PR $'\E[2K\r'\"%F{yellow}! %B\${MODULE}:%b Module was not installed using git. Will not try to \${ACTION}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f\"
|
print -u2 -PR $'\E[2K\r'"%F{yellow}! %B${_zname}:%b Module was not installed using git. Will not try to ${_zaction}. Use zmodule option %B-z%b|%B--frozen%b to disable this warning.%f"
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [[ \${URL} != \$(command git -C \${DIR} config --get remote.origin.url) ]]; then
|
if [[ ${zurl} != $(command git -C ${zdir} config --get remote.origin.url) ]]; then
|
||||||
print_error \"URL does not match. Expected \${URL}. Will not try to \${ACTION}.\"
|
_zimfw_print_error "zurl does not match. Expected ${zurl}. Will not try to ${_zaction}."
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if ! ERR=\$(command git -C \${DIR} fetch -pqt origin 2>&1); then
|
if ! zerr=$(command git -C ${zdir} fetch -pqt origin 2>&1); then
|
||||||
print_error 'Error during git fetch' \${ERR}
|
_zimfw_print_error 'Error during git fetch' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if [[ \${TYPE} == branch ]]; then
|
if [[ ${ztype} == branch ]]; then
|
||||||
if [[ -z \${REV} ]]; then
|
if [[ -z ${zrev} ]]; then
|
||||||
# Get HEAD remote branch
|
# Get HEAD remote branch
|
||||||
if ! ERR=\$(command git -C \${DIR} remote set-head origin -a 2>&1); then
|
if ! zerr=$(command git -C ${zdir} remote set-head origin -a 2>&1); then
|
||||||
print_error 'Error during git remote set-head' \${ERR}
|
_zimfw_print_error 'Error during git remote set-head' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if REV=\$(command git -C \${DIR} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
if zrev=$(command git -C ${zdir} symbolic-ref --short refs/remotes/origin/HEAD 2>&1); then
|
||||||
REV=\${REV#origin/}
|
zrev=${zrev#origin/}
|
||||||
else
|
else
|
||||||
print_error 'Error during git symbolic-ref' \${REV}
|
_zimfw_print_error 'Error during git symbolic-ref' ${zrev}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
TO_REV=\${REV}@{u}
|
ztorev=${zrev}@{u}
|
||||||
if [[ \${ACTION} == check ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
local -ri behind=\$(command git -C \${DIR} rev-list --count \${REV}..\${TO_REV} -- 2>/dev/null)
|
local -ri behind=$(command git -C ${zdir} rev-list --count ${zrev}..${ztorev} -- 2>/dev/null)
|
||||||
if (( behind )); then
|
if (( behind )); then
|
||||||
print_okay \"Update available [behind \${behind}]\"
|
_zimfw_print_okay "Update available [behind ${behind}]"
|
||||||
|
return 4
|
||||||
else
|
else
|
||||||
(( PRINTLEVEL-- ))
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
print_okay 'Already up to date'
|
|
||||||
fi
|
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
if [[ \${REV} == \$(command git -C \${DIR} describe --tags --exact-match 2>/dev/null) ]]; then
|
if [[ ${zrev} == $(command git -C ${zdir} describe --tags --exact-match 2>/dev/null) ]]; then
|
||||||
if [[ \${ACTION} == check ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
(( PRINTLEVEL-- ))
|
_zimfw_print_okay 'Already up to date' 1
|
||||||
print_okay 'Already up to date'
|
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
on_pull && print_okay 'Already up to date'
|
_zimfw_pull_print_okay 'Already up to date'
|
||||||
return \${?}
|
return ${?}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
if [[ \${ACTION} == check ]]; then
|
if [[ ${_zaction} == check ]]; then
|
||||||
print_okay 'Update available'
|
_zimfw_print_okay 'Update available'
|
||||||
return 0
|
return 4
|
||||||
fi
|
fi
|
||||||
TO_REV=\${REV}
|
ztorev=${zrev}
|
||||||
fi
|
fi
|
||||||
LOG=\$(command git -C \${DIR} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..\${TO_REV} -- 2>/dev/null)
|
zlog=$(command git -C ${zdir} log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${ztorev} -- 2>/dev/null)
|
||||||
if ! ERR=\$(command git -C \${DIR} checkout -q \${REV} -- 2>&1); then
|
if ! zerr=$(command git -C ${zdir} checkout -q ${zrev} -- 2>&1); then
|
||||||
print_error 'Error during git checkout' \${ERR}
|
_zimfw_print_error 'Error during git checkout' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if [[ \${TYPE} == branch ]]; then
|
if [[ ${ztype} == branch ]]; then
|
||||||
if ! OUT=\$(command git -C \${DIR} merge --ff-only --no-progress -n 2>&1); then
|
if ! zout=$(command git -C ${zdir} merge --ff-only --no-progress -n 2>&1); then
|
||||||
print_error 'Error during git merge' \${OUT}
|
_zimfw_print_error 'Error during git merge' ${zout}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
# keep just first line of OUT
|
# keep just first line of zout
|
||||||
OUT=\${OUT%%($'\n'|$'\r')*}
|
zout=${zout%%($'\n'|$'\r')*}
|
||||||
else
|
else
|
||||||
OUT=\"Updating to \${TYPE} \${REV}\"
|
zout="Updating to ${ztype} ${zrev}"
|
||||||
fi
|
fi
|
||||||
if (( SUBMODULES )); then
|
if (( zsubmodules )); then
|
||||||
if ! ERR=\$(command git -C \${DIR} submodule update --init --recursive -q -- 2>&1); then
|
if ! zerr=$(command git -C ${zdir} submodule update --init --recursive -q -- 2>&1); then
|
||||||
print_error 'Error during git submodule update' \${ERR}
|
_zimfw_print_error 'Error during git submodule update' ${zerr}
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
on_pull && print_okay \${OUT} \${LOG}
|
_zimfw_pull_print_okay ${zout} 0 ${zlog}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
_zimfw_run_tool() {
|
||||||
|
local -r _zname=${1}
|
||||||
|
if [[ -z ${_zurls[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping external module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if (( _zfrozens[${_zname}] )); then
|
||||||
|
_zimfw_print_okay 'Skipping frozen module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
case ${_zaction} in
|
||||||
|
install)
|
||||||
|
if [[ -e ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_okay 'Skipping already installed module' 1
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
_zimfw_print -nR $'\E[2K\r'"Installing ${_zname} ..."
|
||||||
|
;;
|
||||||
|
check|update)
|
||||||
|
if [[ ! -d ${_zdirs[${_zname}]} ]]; then
|
||||||
|
_zimfw_print_error 'Not installed. Run %Bzimfw install%b to install.'
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ${_zaction} == check ]]; then
|
||||||
|
if (( _zprintlevel > 1 )) print -nR $'\E[2K\r'"Checking ${_zname} ..."
|
||||||
|
else
|
||||||
|
_zimfw_print -nR $'\E[2K\r'"Updating ${_zname} ..."
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
|
||||||
" ;;
|
|
||||||
*)
|
*)
|
||||||
print -u2 -PR "$'\E[2K\r'%F{red}x %B${zname}:%b Unknown tool ${_ztools[${zname}]}%f"
|
_zimfw_print_error "Unknown action ${_zaction}"
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
local -r ztool=${_ztools[${_zname}]}
|
||||||
|
case ${ztool} in
|
||||||
|
degit|git)
|
||||||
|
_zimfw_tool_${ztool} "${_zdirs[${_zname}]}" "${_zurls[${_zname}]}" "${_ztypes[${_zname}]}" "${_zrevs[${_zname}]}" "${_zsubmodules[${_zname}]}" "${_zonpulls[${_zname}]}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_zimfw_print_error "Unknown tool ${ztool}"
|
||||||
return 1
|
return 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
zsh -c ${zcmd} ${_ztools[${zname}]} "${_zprintlevel}" "${_zargs_action}" "${zname}" "${_zdirs[${zname}]}" "${_zurls[${zname}]}" "${_ztypes[${zname}]}" "${_zrevs[${zname}]}" "${_zsubmodules[${zname}]}" "${_zonpulls[${zname}]}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_zimfw_run_tool_action() {
|
_zimfw_run_tool_action() {
|
||||||
local -r _zargs_action=${1}
|
local -r _zaction=${1}
|
||||||
zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool
|
_zimfw_source_zimrc 1 && zargs -n 1 -P 0 -- "${_znames[@]}" -- _zimfw_run_tool
|
||||||
# Ignore return from zargs with -P. Was missing values before zsh 5.9, and
|
|
||||||
# it's intermittently failing in zsh 5.9 and macOS. See https://www.zsh.org/mla/workers/2022/msg00611.html
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,22 +914,22 @@ Options:
|
||||||
;;
|
;;
|
||||||
check)
|
check)
|
||||||
_zrestartmsg=
|
_zrestartmsg=
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action ${1} || return 1
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_print -PR "Done with ${1}." # Only printed in verbose mode
|
_zimfw_print -PR "Done with ${1}." # Only printed in verbose mode
|
||||||
;;
|
;;
|
||||||
init)
|
init)
|
||||||
_zrestartmsg=
|
_zrestartmsg=
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action install || return 1
|
_zimfw_run_tool_action install || return 1
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_print -PR "Done with install." # Only printed in verbose mode
|
_zimfw_print -PR "Done with install." # Only printed in verbose mode
|
||||||
_zimfw_build && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
install|update)
|
install|update)
|
||||||
_zimfw_source_zimrc 3 && _zimfw_run_tool_action ${1} || return 1
|
_zimfw_run_tool_action ${1} || return 1
|
||||||
_zimfw_print -PR "Done with ${1}.${_zrestartmsg}"
|
_zimfw_print -PR "Done with ${1}.${_zrestartmsg}"
|
||||||
(( _zprintlevel-- ))
|
(( _zprintlevel-- ))
|
||||||
_zimfw_build && _zimfw_compile
|
_zimfw_source_zimrc 2 && _zimfw_build && _zimfw_compile
|
||||||
;;
|
;;
|
||||||
uninstall) _zimfw_source_zimrc 2 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
uninstall) _zimfw_source_zimrc 2 && _zimfw_list_unuseds && _zimfw_uninstall ;;
|
||||||
check-version) _zimfw_check_version 1 ;;
|
check-version) _zimfw_check_version 1 ;;
|
||||||
|
|
BIN
zimfw.zsh.gz
Normal file
BIN
zimfw.zsh.gz
Normal file
Binary file not shown.
Loading…
Reference in a new issue