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
|
#!/usr/bin/python
from bzrlib import plugin
from bzrlib import commands
template="""\
# Programmable completion for the Bazaar-NG bzr command under bash. Source
# this file (or on some systems add it to ~/.bash_completion and start a new
# shell) and bash's completion mechanism will know all about bzr's options!
# Known to work with bash 2.05a with programmable completion and extended
# pattern matching enabled (use 'shopt -s extglob progcomp' to enable
# these if they are not already enabled).
# Based originally on the svn bash completition script.
# Customized by Sven Wilhelm/Icecrash.com
# Adjusted for automatic generation by Martin von Gagern
_bzr ()
{
local cur cmds cmdOpts opt helpCmds optBase i
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
cmds='%(cmds)s'
if [[ $COMP_CWORD -eq 1 ]] ; then
COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
return 0
fi
# if not typing an option, or if the previous option required a
# parameter, then fallback on ordinary filename expansion
helpCmds='help|--help|h|\?'
if [[ ${COMP_WORDS[1]} != @($helpCmds) ]] && \
[[ "$cur" != -* ]] ; then
return 0
fi
cmdOpts=
case ${COMP_WORDS[1]} in
%(cases)s\
*)
cmdOpts='--help -h'
;;
esac
cmdOpts=" $cmdOpts "
# take out options already given
for (( i=2; i<=$COMP_CWORD-1; ++i )) ; do
opt=${COMP_WORDS[$i]}
case $opt in
--*) optBase=${opt/=*/} ;;
-*) optBase=${opt:0:2} ;;
esac
cmdOpts=" $cmdOpts "
cmdOpts=${cmdOpts/ ${optBase} / }
# take out some alternatives
case $optBase in
%(optalt)s\
esac
# skip next option if this one requires a parameter
if [[ $opt == @($optsParam) ]] ; then
((++i))
fi
done
COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )
return 0
}
complete -F _bzr -o default bzr
"""
def bash_completion_function(out):
aliases = []
cases = ""
optaliases = {}
reqarg = {}
for name in sorted(commands.all_command_names()):
cmd = commands.get_cmd_object(name)
cases += "\t" + name
aliases.append(name)
for alias in cmd.aliases:
cases += "|" + alias
aliases.append(alias)
cases += ")\n"
plugin = cmd.plugin_name()
if plugin is not None:
cases += "\t\t# plugin \"%s\"\n" % plugin
opts = cmd.options()
optnames = []
for optname in sorted(cmd.options()):
opt = opts[optname]
optset = set()
for (name, short_name, optname, help) in opt.iter_switches():
if short_name is not None:
optset.add("-" + short_name)
if name is not None:
optset.add("--" + name)
for optname in optset:
if optname not in optaliases:
optaliases[optname] = optset
else:
optaliases[optname] &= optset
optnames.extend(sorted(optset))
cases += "\t\tcmdOpts='" + " ".join(optnames) + "'\n\t\t;;\n"
optalt = ""
for opt1 in sorted(optaliases):
optset = optaliases[opt1]
if len(optset) == 1:
continue
optalt += "\t\t" + opt1 + ")\n"
for opt2 in sorted(optset):
if opt1 != opt2:
optalt += "\t\t\tcmdOpts=${cmdOpts/ " + opt2 + " / }\n"
optalt += "\t\t\t;;\n"
out.write(template % {"cmds": " ".join(aliases),
"cases": cases,
"optalt": optalt})
if __name__ == '__main__':
import sys
import locale
locale.setlocale(locale.LC_ALL, '')
plugin.load_plugins()
commands.install_bzr_command_hooks()
bash_completion_function(sys.stdout)
|