~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-09-01 11:08:57 UTC
  • Revision ID: mbp@sourcefrog.net-20050901110857-adbfafb391be0084
- move parsing of argv into arguments and options into Command.run_argv

  This makes the run_bzr logic smaller, which is nice.  It also makes
  handling external commands, where we don't know what arguments or
  options they take, rather simpler.

Show diffs side-by-side

added added

removed removed

Lines of Context:
272
272
        if self.__doc__ == Command.__doc__:
273
273
            warn("No help message set for %r" % self)
274
274
 
 
275
 
 
276
    def run_argv(self, argv):
 
277
        """Parse command line and run."""
 
278
        args, opts = parse_args(argv)
 
279
 
 
280
        if 'help' in opts:  # e.g. bzr add --help
 
281
            from bzrlib.help import help_on_command
 
282
            help_on_command(self.name())
 
283
            return 0
 
284
 
 
285
        # check options are reasonable
 
286
        allowed = self.takes_options
 
287
        for oname in opts:
 
288
            if oname not in allowed:
 
289
                raise BzrCommandError("option '--%s' is not allowed for command %r"
 
290
                                      % (oname, self.name()))
 
291
 
 
292
        # mix arguments and options into one dictionary
 
293
        cmdargs = _match_argform(self.name(), self.takes_args, args)
 
294
        cmdopts = {}
 
295
        for k, v in opts.items():
 
296
            cmdopts[k.replace('-', '_')] = v
 
297
 
 
298
        all_cmd_args = cmdargs.copy()
 
299
        all_cmd_args.update(cmdopts)
 
300
 
 
301
        return self.run(**all_cmd_args)
 
302
 
275
303
    
276
304
    def run(self):
277
305
        """Actually run the command.
577
605
    # to load plugins before doing other command parsing so that they
578
606
    # can override commands, but this needs to happen first.
579
607
 
580
 
    for a in argv[:]:
 
608
    for a in argv:
581
609
        if a == '--profile':
582
610
            opt_profile = True
583
611
        elif a == '--no-plugins':
588
616
            break
589
617
        argv.remove(a)
590
618
 
 
619
    if (not argv) or (argv[0] == '--help'):
 
620
        from bzrlib.help import help
 
621
        if len(argv) > 1:
 
622
            help(argv[1])
 
623
        else:
 
624
            help()
 
625
        return 0
 
626
 
 
627
    if argv[0] == '--version':
 
628
        from bzrlib.builtins import show_version
 
629
        show_version()
 
630
        return 0
 
631
        
591
632
    if not opt_no_plugins:
592
633
        from bzrlib.plugin import load_plugins
593
634
        load_plugins()
594
635
 
595
 
    args, opts = parse_args(argv)
596
 
 
597
 
    if 'help' in opts:
598
 
        from bzrlib.help import help
599
 
        if args:
600
 
            help(args[0])
601
 
        else:
602
 
            help()
603
 
        return 0            
604
 
        
605
 
    if 'version' in opts:
606
 
        from bzrlib.builtins import show_version
607
 
        show_version()
608
 
        return 0
609
 
    
610
 
    if not args:
611
 
        from bzrlib.help import help
612
 
        help(None)
613
 
        return 0
614
 
    
615
 
    cmd = str(args.pop(0))
 
636
    cmd = str(argv.pop(0))
616
637
 
617
638
    cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin)
618
639
 
619
 
    # check options are reasonable
620
 
    allowed = cmd_obj.takes_options
621
 
    for oname in opts:
622
 
        if oname not in allowed:
623
 
            raise BzrCommandError("option '--%s' is not allowed for command %r"
624
 
                                  % (oname, cmd))
625
 
 
626
 
    # mix arguments and options into one dictionary
627
 
    cmdargs = _match_argform(cmd, cmd_obj.takes_args, args)
628
 
    cmdopts = {}
629
 
    for k, v in opts.items():
630
 
        cmdopts[k.replace('-', '_')] = v
631
 
 
632
 
    all_cmd_args = cmdargs.copy()
633
 
    all_cmd_args.update(cmdopts)
634
 
 
635
640
    if opt_profile:
636
 
        ret = apply_profiled(cmd_obj.run, **all_cmd_args)
 
641
        ret = apply_profiled(cmd_obj.run_argv, argv)
637
642
    else:
638
 
        ret = cmd_obj.run(**all_cmd_args)
639
 
 
640
 
    if ret is None:
641
 
        ret = 0
642
 
    return ret
 
643
        ret = cmd_obj.run_argv(argv)
 
644
    return ret or 0
643
645
 
644
646
 
645
647
def main(argv):