1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#compdef vcsh
function __vcsh_repositories () {
local expl
local -a repos
repos=( ${(f)"$(command vcsh list)"} )
_describe -t repos 'repositories' repos
}
function __vcsh_not_implemented_yet () {
_message "Subcommand completion '${1#*-}': not implemented yet"
}
function _vcsh-clone () {
__vcsh_not_implemented_yet "$0" #TODO
}
function _vcsh-delete () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh-enter () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh-foreach () {
_dispatch vcsh-foreach git
}
function _vcsh-help () {
_nothing
}
function _vcsh-init () {
_nothing
}
function _vcsh-list () {
_nothing
}
function _vcsh-list-tracked () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh-list-untracked () {
_nothing
}
function _vcsh-pull () {
_nothing
}
function _vcsh-push () {
_nothing
}
function _vcsh-rename () {
(( CURRENT == 2 )) && __vcsh_repositories
(( CURRENT == 3 )) && _message "new repository name"
(( CURRENT > 3 )) && _nothing
}
function _vcsh-run () {
(( CURRENT == 2 )) && __vcsh_repositories
(( CURRENT == 3 )) && _command_names -e
if (( CURRENT >= 4 )); then
# see _precommand in zsh
words=( "${(@)words[3,-1]}" )
(( CURRENT -= 2 ))
_normal
fi
}
function _vcsh-status () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh-upgrade () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh-version () {
_nothing
}
function _vcsh-which () {
_files
}
function _vcsh-write-gitignore () {
(( CURRENT == 2 )) && __vcsh_repositories
}
function _vcsh () {
local curcontext="${curcontext}"
local state vcshcommand
local -a args subcommands
local VCSH_REPO_D
: ${VCSH_REPO_D:="${XDG_CONFIG_HOME:-"$HOME/.config"}/vcsh/repo.d"}
subcommands=(
"clone:clone an existing repository"
"commit:commit in all repositories"
"delete:delete an existing repository"
"enter:enter repository; spawn new <\$SHELL>"
"foreach:execute for all repos"
"help:display help"
"init:initialize an empty repository"
"list:list all local vcsh repositories"
"list-tracked:list all files tracked by vcsh"
"list-untracked:list all files not tracked by vcsh"
"pull:pull from all vcsh remotes"
"push:push to vcsh remotes"
"rename:rename a repository"
"run:run command with <\$GIT_DIR> and <\$GIT_WORK_TREE> set"
"status:show statuses of all/one vcsh repositories"
"upgrade:upgrade repository to currently recommended settings"
"version:print version information"
"which:find <substring> in name of any tracked file"
"write-gitignore:write .gitignore.d/<repo> via git ls-files"
)
args=(
'-c[source <file> prior to other configuration files]:config files:_path_files'
'-d[enable debug mode]'
'-v[enable verbose mode]'
'*:: :->subcommand_or_options_or_repo'
)
_arguments -C ${args} && return
if [[ ${state} == "subcommand_or_options_or_repo" ]]; then
if (( CURRENT == 1 )); then
_describe -t subcommands 'vcsh sub-commands' subcommands
__vcsh_repositories
else
vcshcommand="${words[1]}"
if ! (( ${+functions[_vcsh-$vcshcommand]} )); then
# There is no handler function, so this is probably the name
# of a repository. Act accordingly.
# FIXME: this may want to use '_dispatch vcsh git'
GIT_DIR=$VCSH_REPO_D/$words[1].git _dispatch git git
else
curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:"
_call_function ret _vcsh-${vcshcommand} && (( ret ))
fi
fi
fi
}
_vcsh "$@"
|