~bzr-pqm/bzr/bzr.dev

0.27.16 by Martin von Gagern
Added distutils setup script and plugin meta data.
1
#!/usr/bin/env python
0.27.2 by Martin von Gagern
First programmatic generation of completions.
2
5147.5.4 by Martin von Gagern
Assign copyright to Canonical Ltd.
3
# Copyright (C) 2009, 2010 Canonical Ltd
0.27.14 by Martin von Gagern
Added GPL 2 license document and copyright notice.
4
#
5147.5.5 by Martin von Gagern
Adjust copyright notice comments for bash_completion.
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
#
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
0.27.14 by Martin von Gagern
Added GPL 2 license document and copyright notice.
14
#
15
# You should have received a copy of the GNU General Public License
5147.5.5 by Martin von Gagern
Adjust copyright notice comments for bash_completion.
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.27.14 by Martin von Gagern
Added GPL 2 license document and copyright notice.
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
20
0.28.2 by Martin von Gagern
merge from trunk
21
from bzrlib import (
5245.1.1 by Andrew Bennetts
Fix deprecation warning in bash_completion plugin.
22
    cmdline,
0.28.2 by Martin von Gagern
merge from trunk
23
    commands,
24
    config,
25
    help_topics,
26
    option,
27
    plugin,
28
)
0.27.36 by Martin von Gagern
List versions of bzr and plugins.
29
import bzrlib
0.27.18 by Martin von Gagern
Add global options in all cases
30
import re
6386.1.2 by Jelmer Vernooij
Move sys import.
31
import sys
0.27.2 by Martin von Gagern
First programmatic generation of completions.
32
0.32.8 by Martin von Gagern
Refactor to increase modularity.
33
34
class BashCodeGen(object):
35
    """Generate a bash script for given completion data."""
36
37
    def __init__(self, data, function_name='_bzr', debug=False):
38
        self.data = data
39
        self.function_name = function_name
40
        self.debug = debug
41
42
    def script(self):
43
        return ("""\
0.30.3 by Martin von Gagern
Lazy initialization
44
# Programmable completion for the Bazaar-NG bzr command under bash.
45
# Known to work with bash 2.05a as well as bash 4.1.2, and probably
46
# all versions in between as well.
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
47
48
# Based originally on the svn bash completition script.
49
# Customized by Sven Wilhelm/Icecrash.com
0.27.2 by Martin von Gagern
First programmatic generation of completions.
50
# Adjusted for automatic generation by Martin von Gagern
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
51
5147.5.12 by Martin von Gagern
Use version of bzrlib. Drop meta.py.
52
# Generated using the bash_completion plugin.
0.27.17 by Martin von Gagern
Mention version and homepage in generated shell code comment.
53
# See https://launchpad.net/bzr-bash-completion for details.
54
0.27.36 by Martin von Gagern
List versions of bzr and plugins.
55
# Commands and options of bzr %(bzr_version)s
56
0.27.20 by Martin von Gagern
More flexible handling of fixed word lists.
57
shopt -s progcomp
0.32.8 by Martin von Gagern
Refactor to increase modularity.
58
%(function)s
59
complete -F %(function_name)s -o default bzr
60
"""     % {
61
            "function_name": self.function_name,
62
            "function": self.function(),
63
            "bzr_version": self.bzr_version(),
64
        })
65
66
    def function(self):
67
        return ("""\
0.27.4 by Martin von Gagern
Introduce --function-name switch. (LP #439829)
68
%(function_name)s ()
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
69
{
0.27.20 by Martin von Gagern
More flexible handling of fixed word lists.
70
	local cur cmds cmdIdx cmd cmdOpts fixedWords i globalOpts
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
71
	local curOpt optEnums
0.32.16 by Martin von Gagern
Ensure proper quoting of spaces in tag names.
72
	local IFS=$' \\n'
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
73
74
	COMPREPLY=()
75
	cur=${COMP_WORDS[COMP_CWORD]}
76
0.27.2 by Martin von Gagern
First programmatic generation of completions.
77
	cmds='%(cmds)s'
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
78
	globalOpts=( %(global_options)s )
0.27.19 by Martin von Gagern
Take global options preceding the command into account.
79
80
	# do ordinary expansion if we are anywhere after a -- argument
81
	for ((i = 1; i < COMP_CWORD; ++i)); do
82
		[[ ${COMP_WORDS[i]} == "--" ]] && return 0
83
	done
84
85
	# find the command; it's the first word not starting in -
86
	cmd=
87
	for ((cmdIdx = 1; cmdIdx < ${#COMP_WORDS[@]}; ++cmdIdx)); do
88
		if [[ ${COMP_WORDS[cmdIdx]} != -* ]]; then
89
			cmd=${COMP_WORDS[cmdIdx]}
90
			break
91
		fi
92
	done
93
94
	# complete command name if we are not already past the command
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
95
	if [[ $COMP_CWORD -le cmdIdx ]]; then
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
96
		COMPREPLY=( $( compgen -W "$cmds ${globalOpts[*]}" -- $cur ) )
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
97
		return 0
98
	fi
99
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
100
	# find the option for which we want to complete a value
101
	curOpt=
102
	if [[ $cur != -* ]] && [[ $COMP_CWORD -gt 1 ]]; then
103
		curOpt=${COMP_WORDS[COMP_CWORD - 1]}
104
		if [[ $curOpt == = ]]; then
105
			curOpt=${COMP_WORDS[COMP_CWORD - 2]}
0.32.1 by Martin von Gagern
Complete tag names.
106
		elif [[ $cur == : ]]; then
107
			cur=
108
			curOpt="$curOpt:"
109
		elif [[ $curOpt == : ]]; then
110
			curOpt=${COMP_WORDS[COMP_CWORD - 2]}:
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
111
		fi
112
	fi
0.27.31 by Martin von Gagern
Introduce --debug switch to enable some debugging code.
113
%(debug)s
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
114
	cmdOpts=( )
115
	optEnums=( )
116
	fixedWords=( )
0.27.19 by Martin von Gagern
Take global options preceding the command into account.
117
	case $cmd in
0.27.2 by Martin von Gagern
First programmatic generation of completions.
118
%(cases)s\
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
119
	*)
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
120
		cmdOpts=(--help -h)
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
121
		;;
122
	esac
123
0.32.16 by Martin von Gagern
Ensure proper quoting of spaces in tag names.
124
	IFS=$'\\n'
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
125
	if [[ ${#fixedWords[@]} -eq 0 ]] && [[ ${#optEnums[@]} -eq 0 ]] && [[ $cur != -* ]]; then
0.32.1 by Martin von Gagern
Complete tag names.
126
		case $curOpt in
0.32.20 by Martin von Gagern
Allow completion of tags at end of revision range.
127
			tag:|*..tag:)
0.32.16 by Martin von Gagern
Ensure proper quoting of spaces in tag names.
128
				fixedWords=( $(bzr tags 2>/dev/null | sed 's/  *[^ ]*$//; s/ /\\\\\\\\ /g;') )
129
				;;
130
		esac
131
		case $cur in
132
			[\\"\\']tag:*)
133
				fixedWords=( $(bzr tags 2>/dev/null | sed 's/  *[^ ]*$//; s/^/tag:/') )
0.32.1 by Martin von Gagern
Complete tag names.
134
				;;
0.32.20 by Martin von Gagern
Allow completion of tags at end of revision range.
135
			[\\"\\']*..tag:*)
136
				fixedWords=( $(bzr tags 2>/dev/null | sed 's/  *[^ ]*$//') )
0.36.1 by Martin von Gagern
Fix test_revspec_tag_endrange on Mac OS X 10.5.8.
137
				fixedWords=( $(for i in "${fixedWords[@]}"; do echo "${cur%%..tag:*}..tag:${i}"; done) )
0.32.20 by Martin von Gagern
Allow completion of tags at end of revision range.
138
				;;
0.32.1 by Martin von Gagern
Complete tag names.
139
		esac
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
140
	elif [[ $cur == = ]] && [[ ${#optEnums[@]} -gt 0 ]]; then
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
141
		# complete directly after "--option=", list all enum values
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
142
		COMPREPLY=( "${optEnums[@]}" )
0.32.3 by Martin von Gagern
Restore completion of registry options immediately after =.
143
		return 0
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
144
	else
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
145
		fixedWords=( "${cmdOpts[@]}"
146
		             "${globalOpts[@]}"
147
		             "${optEnums[@]}"
148
		             "${fixedWords[@]}" )
0.32.1 by Martin von Gagern
Complete tag names.
149
	fi
150
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
151
	if [[ ${#fixedWords[@]} -gt 0 ]]; then
152
		COMPREPLY=( $( compgen -W "${fixedWords[*]}" -- $cur ) )
0.27.30 by Martin von Gagern
Complete values for enum_switch of RegistryOptions.
153
	fi
0.27.1 by Martin von Gagern
Original script from bzr.dev/contrib/bash/bzr
154
155
	return 0
156
}
0.32.8 by Martin von Gagern
Refactor to increase modularity.
157
"""     % {
158
            "cmds": self.command_names(),
159
            "function_name": self.function_name,
160
            "cases": self.command_cases(),
161
            "global_options": self.global_options(),
162
            "debug": self.debug_output(),
163
        })
0.32.20 by Martin von Gagern
Allow completion of tags at end of revision range.
164
        # Help Emacs terminate strings: "
0.32.8 by Martin von Gagern
Refactor to increase modularity.
165
166
    def command_names(self):
167
        return " ".join(self.data.all_command_aliases())
168
169
    def debug_output(self):
170
        if not self.debug:
171
            return ''
172
        else:
173
            return (r"""
0.27.31 by Martin von Gagern
Introduce --debug switch to enable some debugging code.
174
	# Debugging code enabled using the --debug command line switch.
175
	# Will dump some variables to the top portion of the terminal.
176
	echo -ne '\e[s\e[H'
177
	for (( i=0; i < ${#COMP_WORDS[@]}; ++i)); do
178
		echo "\$COMP_WORDS[$i]='${COMP_WORDS[i]}'"$'\e[K'
179
	done
180
	for i in COMP_CWORD COMP_LINE COMP_POINT COMP_TYPE COMP_KEY cur curOpt; do
181
		echo "\$${i}=\"${!i}\""$'\e[K'
182
	done
183
	echo -ne '---\e[K\e[u'
0.32.8 by Martin von Gagern
Refactor to increase modularity.
184
""")
185
186
    def bzr_version(self):
187
        bzr_version = bzrlib.version_string
188
        if not self.data.plugins:
189
            bzr_version += "."
190
        else:
191
            bzr_version += " and the following plugins:"
192
            for name, plugin in sorted(self.data.plugins.iteritems()):
193
                bzr_version += "\n# %s" % plugin
0.32.9 by Martin von Gagern
Added test cases for DataCollector and BashCodeGen.
194
        return bzr_version
0.32.8 by Martin von Gagern
Refactor to increase modularity.
195
196
    def global_options(self):
197
        return " ".join(sorted(self.data.global_options))
198
199
    def command_cases(self):
200
        cases = ""
201
        for command in self.data.commands:
202
            cases += self.command_case(command)
203
        return cases
204
205
    def command_case(self, command):
206
        case = "\t%s)\n" % "|".join(command.aliases)
207
        if command.plugin:
208
            case += "\t\t# plugin \"%s\"\n" % command.plugin
209
        options = []
210
        enums = []
211
        for option in command.options:
212
            for message in option.error_messages:
213
                case += "\t\t# %s\n" % message
214
            if option.registry_keys:
215
                for key in option.registry_keys:
216
                    options.append("%s=%s" % (option, key))
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
217
                enums.append("%s) optEnums=( %s ) ;;" %
0.32.8 by Martin von Gagern
Refactor to increase modularity.
218
                             (option, ' '.join(option.registry_keys)))
219
            else:
220
                options.append(str(option))
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
221
        case += "\t\tcmdOpts=( %s )\n" % " ".join(options)
0.32.8 by Martin von Gagern
Refactor to increase modularity.
222
        if command.fixed_words:
223
            fixed_words = command.fixed_words
224
            if isinstance(fixed_words, list):
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
225
                fixed_words = "( %s )" + ' '.join(fixed_words)
0.32.8 by Martin von Gagern
Refactor to increase modularity.
226
            case += "\t\tfixedWords=%s\n" % fixed_words
227
        if enums:
228
            case += "\t\tcase $curOpt in\n\t\t\t"
229
            case += "\n\t\t\t".join(enums)
230
            case += "\n\t\tesac\n"
231
        case += "\t\t;;\n"
232
        return case
233
234
235
class CompletionData(object):
236
237
    def __init__(self):
238
        self.plugins = {}
239
        self.global_options = set()
240
        self.commands = []
241
242
    def all_command_aliases(self):
243
        for c in self.commands:
244
            for a in c.aliases:
245
                yield a
246
247
248
class CommandData(object):
249
250
    def __init__(self, name):
251
        self.name = name
252
        self.aliases = [name]
253
        self.plugin = None
254
        self.options = []
255
        self.fixed_words = None
256
257
258
class PluginData(object):
259
260
    def __init__(self, name, version=None):
261
        if version is None:
0.32.20 by Martin von Gagern
Allow completion of tags at end of revision range.
262
            try:
263
                version = bzrlib.plugin.plugins()[name].__version__
264
            except:
265
                version = 'unknown'
0.32.8 by Martin von Gagern
Refactor to increase modularity.
266
        self.name = name
267
        self.version = version
268
269
    def __str__(self):
270
        if self.version == 'unknown':
271
            return self.name
272
        return '%s %s' % (self.name, self.version)
273
274
275
class OptionData(object):
276
277
    def __init__(self, name):
278
        self.name = name
279
        self.registry_keys = None
280
        self.error_messages = []
281
282
    def __str__(self):
283
        return self.name
284
285
    def __cmp__(self, other):
286
        return cmp(self.name, other.name)
287
288
289
class DataCollector(object):
290
291
    def __init__(self, no_plugins=False, selected_plugins=None):
292
        self.data = CompletionData()
293
        self.user_aliases = {}
294
        if no_plugins:
295
            self.selected_plugins = set()
296
        elif selected_plugins is None:
297
            self.selected_plugins = None
298
        else:
299
            self.selected_plugins = set([x.replace('-', '_')
300
                                         for x in selected_plugins])
301
302
    def collect(self):
303
        self.global_options()
304
        self.aliases()
305
        self.commands()
306
        return self.data
307
308
    def global_options(self):
309
        re_switch = re.compile(r'\n(--[A-Za-z0-9-_]+)(?:, (-\S))?\s')
310
        help_text = help_topics.topic_registry.get_detail('global-options')
311
        for long, short in re_switch.findall(help_text):
312
            self.data.global_options.add(long)
313
            if short:
314
                self.data.global_options.add(short)
315
316
    def aliases(self):
317
        for alias, expansion in config.GlobalConfig().get_aliases().iteritems():
5245.1.1 by Andrew Bennetts
Fix deprecation warning in bash_completion plugin.
318
            for token in cmdline.split(expansion):
0.32.8 by Martin von Gagern
Refactor to increase modularity.
319
                if not token.startswith("-"):
320
                    self.user_aliases.setdefault(token, set()).add(alias)
321
                    break
322
323
    def commands(self):
324
        for name in sorted(commands.all_command_names()):
325
            self.command(name)
326
327
    def command(self, name):
328
        cmd = commands.get_cmd_object(name)
329
        cmd_data = CommandData(name)
330
331
        plugin_name = cmd.plugin_name()
332
        if plugin_name is not None:
333
            if (self.selected_plugins is not None and
334
                plugin not in self.selected_plugins):
0.32.9 by Martin von Gagern
Added test cases for DataCollector and BashCodeGen.
335
                return None
0.32.8 by Martin von Gagern
Refactor to increase modularity.
336
            plugin_data = self.data.plugins.get(plugin_name)
337
            if plugin_data is None:
338
                plugin_data = PluginData(plugin_name)
339
                self.data.plugins[plugin_name] = plugin_data
340
            cmd_data.plugin = plugin_data
341
        self.data.commands.append(cmd_data)
0.27.12 by Martin von Gagern
Take user-configured aliases into account.
342
343
        # Find all aliases to the command; both cmd-defined and user-defined.
344
        # We assume a user won't override one command with a different one,
345
        # but will choose completely new names or add options to existing
346
        # ones while maintaining the actual command name unchanged.
0.32.8 by Martin von Gagern
Refactor to increase modularity.
347
        cmd_data.aliases.extend(cmd.aliases)
348
        cmd_data.aliases.extend(sorted([useralias
349
            for cmdalias in cmd_data.aliases
350
            if cmdalias in self.user_aliases
351
            for useralias in self.user_aliases[cmdalias]
352
            if useralias not in cmd_data.aliases]))
353
0.27.2 by Martin von Gagern
First programmatic generation of completions.
354
        opts = cmd.options()
0.32.8 by Martin von Gagern
Refactor to increase modularity.
355
        for optname, opt in sorted(opts.iteritems()):
356
            cmd_data.options.extend(self.option(opt))
357
358
        if 'help' == name or 'help' in cmd.aliases:
0.32.15 by Martin von Gagern
Allow spaces in tag names. Use bash arrays more extensively.
359
            cmd_data.fixed_words = ('($cmds %s)' %
0.32.8 by Martin von Gagern
Refactor to increase modularity.
360
                " ".join(sorted(help_topics.topic_registry.keys())))
361
0.32.9 by Martin von Gagern
Added test cases for DataCollector and BashCodeGen.
362
        return cmd_data
363
0.32.8 by Martin von Gagern
Refactor to increase modularity.
364
    def option(self, opt):
365
        optswitches = {}
366
        parser = option.get_optparser({opt.name: opt})
367
        parser = self.wrap_parser(optswitches, parser)
368
        optswitches.clear()
369
        opt.add_option(parser, opt.short_name())
370
        if isinstance(opt, option.RegistryOption) and opt.enum_switch:
371
            enum_switch = '--%s' % opt.name
372
            enum_data = optswitches.get(enum_switch)
373
            if enum_data:
0.27.41 by Martin von Gagern
Recover from ImportError when loading a registry.
374
                try:
0.32.8 by Martin von Gagern
Refactor to increase modularity.
375
                    enum_data.registry_keys = opt.registry.keys()
0.27.41 by Martin von Gagern
Recover from ImportError when loading a registry.
376
                except ImportError, e:
0.32.8 by Martin von Gagern
Refactor to increase modularity.
377
                    enum_data.error_messages.append(
378
                        "ERROR getting registry keys for '--%s': %s"
379
                        % (opt.name, str(e).split('\n')[0]))
380
        return sorted(optswitches.values())
381
382
    def wrap_container(self, optswitches, parser):
383
        def tweaked_add_option(*opts, **attrs):
384
            for name in opts:
385
                optswitches[name] = OptionData(name)
386
        parser.add_option = tweaked_add_option
387
        return parser
388
389
    def wrap_parser(self, optswitches, parser):
390
        orig_add_option_group = parser.add_option_group
391
        def tweaked_add_option_group(*opts, **attrs):
392
            return self.wrap_container(optswitches,
393
                orig_add_option_group(*opts, **attrs))
394
        parser.add_option_group = tweaked_add_option_group
395
        return self.wrap_container(optswitches, parser)
396
397
398
def bash_completion_function(out, function_name="_bzr", function_only=False,
399
                             debug=False,
400
                             no_plugins=False, selected_plugins=None):
401
    dc = DataCollector(no_plugins=no_plugins, selected_plugins=selected_plugins)
402
    data = dc.collect()
403
    cg = BashCodeGen(data, function_name=function_name, debug=debug)
0.27.7 by Martin von Gagern
Introduce --function-only option
404
    if function_only:
0.32.8 by Martin von Gagern
Refactor to increase modularity.
405
        res = cg.function()
406
    else:
407
        res = cg.script()
408
    out.write(res)
409
0.27.2 by Martin von Gagern
First programmatic generation of completions.
410
5147.5.11 by Martin von Gagern
Register command lazily.
411
class cmd_bash_completion(commands.Command):
5147.5.14 by Martin von Gagern
Assign user-visible docstrings to __doc__.
412
    __doc__ = """Generate a shell function for bash command line completion.
5147.5.11 by Martin von Gagern
Register command lazily.
413
414
    This command generates a shell function which can be used by bash to
415
    automatically complete the currently typed command when the user presses
416
    the completion key (usually tab).
417
    
418
    Commonly used like this:
419
        eval "`bzr bash-completion`"
420
    """
421
422
    takes_options = [
423
        option.Option("function-name", short_name="f", type=str, argname="name",
424
               help="Name of the generated function (default: _bzr)"),
425
        option.Option("function-only", short_name="o", type=None,
426
               help="Generate only the shell function, don't enable it"),
427
        option.Option("debug", type=None, hidden=True,
428
               help="Enable shell code useful for debugging"),
429
        option.ListOption("plugin", type=str, argname="name",
430
                # param_name="selected_plugins", # doesn't work, bug #387117
431
                help="Enable completions for the selected plugin"
432
                + " (default: all plugins)"),
433
        ]
434
435
    def run(self, **kwargs):
436
        if 'plugin' in kwargs:
437
            # work around bug #387117 which prevents us from using param_name
5147.5.18 by Martin von Gagern
Include all plugins if --plugins isn't specified (fixes regression).
438
            if len(kwargs['plugin']) > 0:
439
                kwargs['selected_plugins'] = kwargs['plugin']
5147.5.11 by Martin von Gagern
Register command lazily.
440
            del kwargs['plugin']
441
        bash_completion_function(sys.stdout, **kwargs)
442
443
0.27.2 by Martin von Gagern
First programmatic generation of completions.
444
if __name__ == '__main__':
445
446
    import locale
0.27.32 by Martin von Gagern
Added OptionParser for script usage.
447
    import optparse
448
0.27.38 by Martin von Gagern
Add --plugin switch to selectively include plugins.
449
    def plugin_callback(option, opt, value, parser):
450
        values = parser.values.selected_plugins
451
        if value == '-':
452
            del values[:]
453
        else:
454
            values.append(value)
455
5147.5.12 by Martin von Gagern
Use version of bzrlib. Drop meta.py.
456
    parser = optparse.OptionParser(usage="%prog [-f NAME] [-o]")
0.27.32 by Martin von Gagern
Added OptionParser for script usage.
457
    parser.add_option("--function-name", "-f", metavar="NAME",
458
                      help="Name of the generated function (default: _bzr)")
459
    parser.add_option("--function-only", "-o", action="store_true",
460
                      help="Generate only the shell function, don't enable it")
461
    parser.add_option("--debug", action="store_true",
462
                      help=optparse.SUPPRESS_HELP)
0.27.37 by Martin von Gagern
Introduce --no-plugins option to script execution mode.
463
    parser.add_option("--no-plugins", action="store_true",
464
                      help="Don't load any bzr plugins")
0.27.38 by Martin von Gagern
Add --plugin switch to selectively include plugins.
465
    parser.add_option("--plugin", metavar="NAME", type="string",
466
                      dest="selected_plugins", default=[],
467
                      action="callback", callback=plugin_callback,
468
                      help="Enable completions for the selected plugin"
469
                      + " (default: all plugins)")
0.27.32 by Martin von Gagern
Added OptionParser for script usage.
470
    (opts, args) = parser.parse_args()
471
    if args:
472
        parser.error("script does not take positional arguments")
473
    kwargs = dict()
474
    for name, value in opts.__dict__.iteritems():
475
        if value is not None:
476
            kwargs[name] = value
0.27.2 by Martin von Gagern
First programmatic generation of completions.
477
478
    locale.setlocale(locale.LC_ALL, '')
0.27.37 by Martin von Gagern
Introduce --no-plugins option to script execution mode.
479
    if not kwargs.get('no_plugins', False):
480
        plugin.load_plugins()
0.27.2 by Martin von Gagern
First programmatic generation of completions.
481
    commands.install_bzr_command_hooks()
0.27.32 by Martin von Gagern
Added OptionParser for script usage.
482
    bash_completion_function(sys.stdout, **kwargs)