summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hartmann <richih.mailinglist@gmail.com>2013-07-24 16:51:39 +0200
committerRichard Hartmann <richih.mailinglist@gmail.com>2013-07-24 22:03:55 +0200
commitf9851d817fd6b45e00c35d71f9047f95eca06f42 (patch)
treeffdec2fcd1cd516b9079237e07b09bdceeb803ca
parente282fd8ecb65ef558a5b145f674460476087027a (diff)
downloadzsh-f9851d817fd6b45e00c35d71f9047f95eca06f42.tar.gz
zsh-f9851d817fd6b45e00c35d71f9047f95eca06f42.zip
31571: Completion/Unix/Command/_vcsh: Update
-rw-r--r--ChangeLog4
-rw-r--r--Completion/Unix/Command/_vcsh149
2 files changed, 137 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 385763cf1..ba993140b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-07-24 Richard Hartmann <richih.mailinglist@gmail.com>
+
+ * 31571: Completion/Unix/Command/_vcsh: Update
+
2013-07-24 Peter Stephenson <p.stephenson@samsung.com>
* Src/hist.c: 31570: with HIST_REDUCE_BLANKS don't truncate
diff --git a/Completion/Unix/Command/_vcsh b/Completion/Unix/Command/_vcsh
index 89588e4b2..47dbd9e69 100644
--- a/Completion/Unix/Command/_vcsh
+++ b/Completion/Unix/Command/_vcsh
@@ -1,18 +1,135 @@
#compdef vcsh
-_arguments \
- ':subcommand:((
- clone\:"clone from repo"
- help\:"display help"
- delete\:"delete repo"
- enter\:"Enter repo; spawn new \$SHELL"
- init\:"init & clone from repo"
- list\:"list all repos"
- list-tracked\:"list all files tracked by vcsh"
- list-tracked-by\:"list files tracked by a repo"
- rename\:"rename repo"
- run\:"run command on repo"
- setup\:"set up repo with recommended settings"
- write-gitignore\:"write .gitignore.d/foo via git ls-files"
- \<REPO\>\:"Run git command directly"
- ))'
+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-help () {
+ _nothing
+}
+
+function _vcsh-init () {
+ _nothing
+}
+
+function _vcsh-list () {
+ _nothing
+}
+
+function _vcsh-list-tracked () {
+ _nothing
+}
+
+function _vcsh-list-tracked-by () {
+ (( CURRENT == 2 )) && __vcsh_repositories
+}
+
+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
+ if (( CURRENT >= 3 )); then
+ words=( "${(@)words[3,-1]}" )
+ (( CURRENT -= 2 ))
+ _complete
+ fi
+}
+
+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
+
+ subcommands=(
+ "clone:clone an existing repository"
+ "delete:delete an existing repository"
+ "enter:enter repository; spawn new <\$SHELL>"
+ "help:display help"
+ "init:initialize an empty repository"
+ "list:list all local vcsh repositories"
+ "list-tracked:list all files tracked by vcsh"
+ "list-tracked-by:list files tracked by a repository"
+ "pull:pull from all vcsh remotes"
+ "rename:rename a repository"
+ "run:run command with <\$GIT_DIR> and <\$GIT_WORK_TREE> set"
+ "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.
+ _dispatch git git
+ else
+ curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:"
+ _call_function ret _vcsh-${vcshcommand}
+ fi
+ fi
+ fi
+}
+
+_vcsh "$@"