39
38
import bzrlib.errors as errors
40
39
from bzrlib.errors import (BzrError,
40
BzrCommandError, BzrCheckError,
42
from bzrlib import option
44
43
from bzrlib.option import Option
45
44
import bzrlib.osutils
46
45
from bzrlib.revisionspec import RevisionSpec
345
class OptionParser(optparse.OptionParser):
346
"""OptionParser that raises exceptions instead of exiting"""
348
DEFAULT_VALUE = "DEFAULT"
350
def error(self, message):
351
raise BzrCommandError(message)
354
def get_optparser(options):
355
"""Generate an optparse parser for bzrlib-style options"""
356
def type_callback(option, opt, value, parser, name, optargfn):
357
setattr(parser.values, name, optargfn(value))
359
parser = OptionParser()
360
parser.remove_option('--help')
361
short_options = dict((k.name, (v, k)) for v, k in
362
Option.SHORT_OPTIONS.iteritems())
363
for name, option in options.iteritems():
364
option_strings = ['--%s' % name]
365
if name in short_options:
366
short_name, short_option = short_options[name]
367
option_strings.append('-%s' % short_name)
368
optargfn = option.type
370
parser.add_option(action='store_true', dest=name, help=option.help,
371
default=OptionParser.DEFAULT_VALUE,
374
parser.add_option(action='callback', callback=type_callback,
375
type='string', help=option.help,
376
default=OptionParser.DEFAULT_VALUE,
377
callback_args=(name, optargfn), *option_strings)
381
344
def parse_args(command, argv, alias_argv=None):
382
345
"""Parse command line.
387
350
they take, and which commands will accept them.
389
352
# TODO: make it a method of the Command?
390
parser = get_optparser(command.options())
353
parser = option.get_optparser(command.options())
392
355
if alias_argv is not None:
393
356
args = alias_argv + argv
397
360
options, args = parser.parse_args(args)
398
361
opts = dict([(k, v) for k, v in options.__dict__.iteritems() if
399
v is not OptionParser.DEFAULT_VALUE])
362
v is not option.OptionParser.DEFAULT_VALUE])
400
363
return args, opts