1
0
mirror of https://github.com/zplug/zplug synced 2025-08-31 02:00:38 +02:00
zplug/autoload/commands/__update__
2016-04-20 00:42:35 -04:00

205 lines
5.8 KiB
Bash

#!/bin/zsh
__import "core/core"
__import "print/print"
__import "print/logger"
__import "job/spinner"
__import "zplug/variables"
trap '__zplug::job::spinner::unlock; trap - SIGINT' SIGINT
local line filter is_select=false
local -i max=0 ret=0
local -a args
local -a queue
local -i queue_max=$ZPLUG_THREADS
local -F SECONDS=0
arg="$1"
case "$arg" in
--self)
__self__
return $status
;;
--select)
is_select=true; shift
;;
-*|--*)
__zplug::print::print::die "[zplug] $arg: Unknown option\n"
return 1
;;
esac
# Initialize
{
filter="$(__zplug::core::core::get_filter "$ZPLUG_FILTER")"
if $is_select; then
args=(${(@f)"$(echo "${(Fk)zplugs[@]}" | eval "$filter")"})
else
args=(${(u)${@:gs:@::}})
fi
if (( $#args == 0 )); then
__list__
return $status
fi
for line in "${args[@]}"
do
(( $#line > $max )) && max=$#line
done
}
__zplug::job::spinner::lock
__zplug::job::spinner::spinner &
for line in "${args[@]}"
do
line="$(__zplug::core::core::packaging "$line")"
if ! __zplug::core::core::zpluged "$line"; then
__zplug::print::print::die "[zplug] $line: no such package\n"
ret=1
continue
fi
# Run installation in subprocess
{
# All variables are treated as local variable
# because of background job (subprocess)
local k ret=1
local -A zspec
__parser__ "$line"
zspec=( "${reply[@]}" )
case "$zspec[from]" in
"local")
continue
;;
esac
if [[ $# == 1 && $argv[1] == $zspec[name] ]]; then
if (( $_zplug_boolean_true[(I)$zspec[frozen]] )); then
__zplug::job::spinner::unlock
__zplug::print::print::put "$fg[green]$zspec[name]: $fg[blue]frozen repo$reset_color. Update? [y/N]: "
if read -q; then
__zplug::print::print::put "\n"
__zplug::job::spinner::lock
__zplug::job::spinner::spinner &
SECONDS=0
else
continue
fi
fi
fi
__zplug::job::spinner::echo "%-20s %s\n" \
"Updating..." \
"$line"
function () {
if (( $_zplug_boolean_true[(I)$zspec[frozen]] )); then
return 3
fi
# Change directory to fullpath of zspec dir
# or parent directory of zspec dir
# If it fails, return this unnamed function with error code 2
builtin cd -q $zspec[dir] || \
builtin cd -q ${zspec[dir]:h} || \
return 1
# If zspec from is gh-r (GitHub Releases),
# send a http request to git.io/releases with os argument
# or, git pull (case of normal plugin)
if [[ $zspec[from] == "gh-r" ]]; then
__releases__ \
--use "${zspec[use]:-}" \
--at "${zspec[at]:-}" \
"$line"
else
if [[ -e $zspec[dir]/.git/shallow ]]; then
git fetch --unshallow
else
git fetch
fi
git checkout -q "$zspec[at]"
local rev_local rev_remote rev_base
rev_local="$(git rev-parse HEAD)"
rev_remote="$(git rev-parse "@{u}")"
rev_base="$(git merge-base HEAD "@{u}")"
if [[ $rev_local == $rev_remote ]]; then
# up-to-date
return 4
elif [[ $rev_local = $rev_base ]]; then
# need to pull
git merge --ff-only origin/$zspec[at] && git submodule update --init --recursive
return $status
elif [ $rev_remote = $rev_base ]; then
# need to push
return 1
else
# Diverged
return 1
fi
fi
} &>/dev/null
# Return code of above unnamed function
# Incidentally,
# nothing is output even if it success or fails
ret=$status
case "$ret" in
0)
__zplug::job::spinner::echo "$fg[green]%-20s$reset_color %-${max}s\t(%.2fs)\n" \
"Updated!" \
"$line" \
$SECONDS
# hook after updating
if [[ -n $zspec[hook-build] ]]; then
eval "$zspec[hook-build]"
fi
;;
1)
__zplug::job::spinner::echo "$fg[red]%-20s$reset_color %-${max}s\t(%.2fs)\n" \
"Failed to update" \
"$line" \
$SECONDS
;;
2)
sleep 1
__zplug::job::spinner::echo "$fg[magenta]%-20s$reset_color %-${max}s\t(%.2fs)\n" \
"Repo not found" \
"$line" \
$(( SECONDS - 1 ))
;;
3)
sleep 1
__zplug::job::spinner::echo "$fg[blue]%-20s$reset_color %-${max}s\t(%.2fs)\n" \
"Frozen repo" \
"$line" \
$(( SECONDS - 1 ))
;;
4)
__zplug::job::spinner::echo "$fg[white]%-20s$reset_color %-${max}s\t(%.2fs)\n" \
"Up-to-date" \
"$line" \
$SECONDS
;;
esac
} &
queue+=($!)
if (( $#queue % queue_max == 0 )); then
wait $queue &>/dev/null
queue=()
fi
done
if (( $#queue > 0 )); then
wait $queue &>/dev/null
fi
queue=()
__zplug::job::spinner::unlock
return $ret