130
130
from bzrlib.externalcommand import ExternalCommand
132
cmd_name = str(cmd_name) # not unicode
132
# We want only 'ascii' command names, but the user may have typed
133
# in a Unicode name. In that case, they should just get a
134
# 'command not found' error later.
135
# In the future, we may actually support Unicode command names.
134
137
# first look up this command under the specified name
135
138
cmds = _get_cmd_dict(plugins_override=plugins_override)
257
260
def run_argv_aliases(self, argv, alias_argv=None):
258
261
"""Parse the command line and run with extra aliases in alias_argv."""
263
warn("Passing None for [] is deprecated from bzrlib 0.10",
264
DeprecationWarning, stacklevel=2)
259
266
args, opts = parse_args(self, argv, alias_argv)
260
267
if 'help' in opts: # e.g. bzr add --help
261
268
from bzrlib.help import help_on_command
262
269
help_on_command(self.name())
264
# XXX: This should be handled by the parser
265
allowed_names = self.options().keys()
267
if oname not in allowed_names:
268
raise BzrOptionError("option '--%s' is not allowed for"
269
" command %r" % (oname, self.name()))
270
271
# mix arguments and options into one dictionary
271
272
cmdargs = _match_argform(self.name(), self.takes_args, args)
354
355
lookup table, something about the available options, what optargs
355
356
they take, and which commands will accept them.
357
# TODO: chop up this beast; make it a method of the Command
362
cmd_options = command.options()
364
proc_aliasarg = True # Are we processing alias_argv now?
365
for proc_argv in alias_argv, argv:
375
# We've received a standalone -- No more flags
379
# option names must not be unicode
383
mutter(" got option %r", a)
385
optname, optarg = a[2:].split('=', 1)
388
if optname not in cmd_options:
389
raise BzrCommandError('unknown option "%s"' % a)
392
if shortopt in Option.SHORT_OPTIONS:
393
# Multi-character options must have a space to delimit
395
# ^^^ what does this mean? mbp 20051014
396
optname = Option.SHORT_OPTIONS[shortopt].name
398
# Single character short options, can be chained,
399
# and have their value appended to their name
401
if shortopt not in Option.SHORT_OPTIONS:
402
# We didn't find the multi-character name, and we
403
# didn't find the single char name
404
raise BzrCommandError('unknown option "%s"' % a)
405
optname = Option.SHORT_OPTIONS[shortopt].name
408
# There are extra things on this option
409
# see if it is the value, or if it is another
411
optargfn = Option.OPTIONS[optname].type
413
# This option does not take an argument, so the
414
# next entry is another short option, pack it
416
proc_argv.insert(0, '-' + a[2:])
418
# This option takes an argument, so pack it
421
if optname not in cmd_options:
422
raise BzrCommandError('unknown option "%s"' % shortopt)
424
# XXX: Do we ever want to support this, e.g. for -r?
426
raise BzrCommandError('repeated option %r' % a)
427
elif optname in alias_opts:
428
# Replace what's in the alias with what's in the real
430
del alias_opts[optname]
432
proc_argv.insert(0, a)
435
raise BzrCommandError('repeated option %r' % a)
437
option_obj = cmd_options[optname]
438
optargfn = option_obj.type
442
raise BzrCommandError('option %r needs an argument' % a)
444
optarg = proc_argv.pop(0)
445
opts[optname] = optargfn(optarg)
447
alias_opts[optname] = optargfn(optarg)
450
raise BzrCommandError('option %r takes no argument' % optname)
453
alias_opts[optname] = True
456
proc_aliasarg = False # Done with alias argv
358
# TODO: make it a method of the Command?
359
parser = option.get_optparser(command.options())
360
if alias_argv is not None:
361
args = alias_argv + argv
365
options, args = parser.parse_args(args)
366
opts = dict([(k, v) for k, v in options.__dict__.iteritems() if
367
v is not option.OptionParser.DEFAULT_VALUE])
457
368
return args, opts
640
551
alias_argv = [a.decode(bzrlib.user_encoding) for a in alias_argv]
641
552
argv[0] = alias_argv.pop(0)
643
cmd = str(argv.pop(0))
555
# We want only 'ascii' command names, but the user may have typed
556
# in a Unicode name. In that case, they should just get a
557
# 'command not found' error later.
645
559
cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin)
646
560
if not getattr(cmd_obj.run_argv, 'is_deprecated', False):