blob: 00aed7d28a8b36cf0055b9da1d598dd4a93cc17d (
plain) (
blame)
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
|
#compdef vcsh
function __vcsh_repositories () {
local -a repos
repos=( ${(f)"$(_call_program repositories vcsh list)"} )
_describe -t repositories 'repository' repos
}
function _vcsh-clone () {
_default #TODO
}
local func
for func in help init list list-tracked pull push version; do
_vcsh-$func() { _nothing }
done
for func in delete enter list-tracked-by upgrade write-gitignore; do
_vcsh-$func() { (( CURRENT == 2 )) && __vcsh_repositories }
done
function _vcsh-rename () {
case $CURRENT in
2) __vcsh_repositories ;;
3) _message "new repository name" ;;
*) _nothing ;;
esac
}
function _vcsh-run () {
(( CURRENT == 2 )) && __vcsh_repositories
if (( CURRENT >= 3 )); then
words=( "${(@)words[3,-1]}" )
(( CURRENT -= 2 ))
_complete
fi
}
function _vcsh () {
local curcontext="${curcontext}" ret=1
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} && ret=0
if [[ ${state} == "subcommand_or_options_or_repo" ]]; then
if (( CURRENT == 1 )); then
_describe -t subcommands 'vcsh sub-commands' subcommands && ret=0
__vcsh_repositories && ret=0
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 && ret=0
else
curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:"
_call_function ret _vcsh-${vcshcommand}
fi
fi
fi
return ret
}
_vcsh "$@"
|