#compdef dots : ${DOTFILES:=~/dotfiles} local repo local -a commands repos new_repos commands=( bootstrap:'set up initial dotfiles on a new system' clone:'download dotfiles packages over Git' fetch:'retrieve updates to your packages' stow:'stow downloaded packages into your ~' unstow:'unstow installed packages (cleans up their symlinks)' restow:'unstow then stow installed packages (may be useful if package layout changed)' pull:'fetch and apply package updates' status:'check whether your packages have changes' ) if ! _retrieve_cache dots-repositories; then repos=($(curl -s -X GET "https://git.00dani.me/api/v1/orgs/dot/repos" -H "accept: application/json" | jq -r '.[].name')) _store_cache dots-repositories repos fi for repo in $repos; [[ -d $DOTFILES/$repo ]] || new_repos+=$repo _dots_subcommands() { _describe -t commands command commands } _dots_subcommand_parameters() { case $words[1] in bootstrap) _nothing ;; # no more arguments! clone) if (( $#new_repos )); then _values -w package $new_repos else _message 'all known packages are already installed, you can still enter a git url manually' fi ;; fetch|*stow|pull|st|status) _values -w package $DOTFILES/*(/:t) ;; esac } _arguments \ '(-v --verbose)'{-v,--verbose}'[request verbose output from Git and Stow]' \ ': :_dots_subcommands' \ '*:: :_dots_subcommand_parameters'