1
0
mirror of https://github.com/zplug/zplug synced 2025-04-05 23:29:10 +02:00
zplug/autoload/commands/__install__

78 lines
1.9 KiB
Bash

#!/usr/bin/env zsh
# Description:
# Install packages in parallel
local repo arg
local -A repo_pids proc_states hook_build hook_finished hook_pids status_codes
local -A tags
local -F SECONDS=0
local -aU repos
local -i status_code=0
while (( $# > 0 ))
do
arg="$1"
case "$arg" in
-*|--*)
__zplug::core::options::unknown "$arg"
return $status
;;
"")
# Invalid
return 1
;;
*/*)
repos+=( "${arg:gs:@::}" )
;;
*)
return 1
;;
esac
shift
done
if ! __zplug::job::parallel::init "$repos[@]"; then
# Since the initialization has failed, this command is terminated.
# The error message etc. should be done within that function.
return 1
fi
repos=( "$reply[@]" )
for repo in "$repos[@]"
do
__zplug::core::tags::parse "$repo"
tags=( "${reply[@]}" )
# Run the installation in background
{
if [[ -n $tags[if] ]] && ! eval "${tags[if]}" 2> >(__zplug::log::capture::error) >/dev/null; then
status_code=$_zplug_status[skip_if]
else
if __zplug::core::sources::is_handler_defined "install" "$tags[from]"; then
__zplug::core::sources::use_handler \
"install" \
"$tags[from]" \
"$repo"
status_code=$status
fi
fi
# Manage the status codes in a file
# to lock the file in order to write asynchronously
__zplug::job::handle::flock \
"$_zplug_log[install]" \
"repo:$repo\tstatus:$status_code"
} &
repo_pids[$repo]=$(builtin printf $!) # for zsh 5.3
hook_build[$repo]="$tags[hook-build]"
hook_finished[$repo]=false
proc_states[$repo]="created"
status_codes[$repo]=""
__zplug::job::handle::wait
done
__zplug::job::handle::elapsed_time $SECONDS
__zplug::job::parallel::deinit