~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Jelmer Vernooij
  • Date: 2011-06-16 11:57:36 UTC
  • mto: This revision was merged to the branch mainline in revision 5987.
  • Revision ID: jelmer@samba.org-20110616115736-5xuzwdf87qb81su4
Use iter_ancestry rather than get_ancestry.

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
    cmdline,
37
37
    debug,
38
38
    errors,
39
 
    i18n,
40
39
    option,
41
40
    osutils,
42
41
    trace,
45
44
""")
46
45
 
47
46
from bzrlib.hooks import Hooks
48
 
from bzrlib.i18n import gettext
49
47
# Compatibility - Option used to be in commands.
50
48
from bzrlib.option import Option
51
49
from bzrlib.plugin import disable_plugins, load_plugins
164
162
    return cmd[4:].replace('_','-')
165
163
 
166
164
 
 
165
@deprecated_function(deprecated_in((2, 2, 0)))
 
166
def _builtin_commands():
 
167
    """Return a dict of {name: cmd_class} for builtin commands.
 
168
 
 
169
    :deprecated: Use the builtin_command_registry registry instead
 
170
    """
 
171
    # return dict(name: cmd_class)
 
172
    return dict(builtin_command_registry.items())
 
173
 
 
174
 
167
175
def _register_builtin_commands():
168
176
    if builtin_command_registry.keys():
169
177
        # only load once
229
237
    try:
230
238
        return _get_cmd_object(cmd_name, plugins_override)
231
239
    except KeyError:
232
 
        raise errors.BzrCommandError(gettext('unknown command "%s"') % cmd_name)
 
240
        raise errors.BzrCommandError('unknown command "%s"' % cmd_name)
233
241
 
234
242
 
235
243
def _get_cmd_object(cmd_name, plugins_override=True, check_missing=True):
400
408
    takes_options = []
401
409
    encoding_type = 'strict'
402
410
    invoked_as = None
403
 
    l10n = True
404
411
 
405
412
    hidden = False
406
413
 
432
439
        """
433
440
        self._operation.cleanup_now()
434
441
 
 
442
    @deprecated_method(deprecated_in((2, 1, 0)))
 
443
    def _maybe_expand_globs(self, file_list):
 
444
        """Glob expand file_list if the platform does not do that itself.
 
445
 
 
446
        Not used anymore, now that the bzr command-line parser globs on
 
447
        Windows.
 
448
 
 
449
        :return: A possibly empty list of unicode paths.
 
450
 
 
451
        Introduced in bzrlib 0.18.
 
452
        """
 
453
        return file_list
 
454
 
435
455
    def _usage(self):
436
456
        """Return single-line grammar for this command.
437
457
 
465
485
            usage help (e.g. Purpose, Usage, Options) with a
466
486
            message explaining how to obtain full help.
467
487
        """
468
 
        if self.l10n:
469
 
            i18n.install()  # Install i18n only for get_help_text for now.
470
488
        doc = self.help()
471
 
        if doc:
472
 
            # Note: If self.gettext() translates ':Usage:\n', the section will
473
 
            # be shown after "Description" section and we don't want to
474
 
            # translate the usage string.
475
 
            # Though, bzr export-pot don't exports :Usage: section and it must
476
 
            # not be translated.
477
 
            doc = self.gettext(doc)
478
 
        else:
479
 
            doc = gettext("No help for this command.")
 
489
        if not doc:
 
490
            doc = "No help for this command."
480
491
 
481
492
        # Extract the summary (purpose) and sections out from the text
482
493
        purpose,sections,order = self._get_help_parts(doc)
489
500
 
490
501
        # The header is the purpose and usage
491
502
        result = ""
492
 
        result += gettext(':Purpose: %s\n') % (purpose,)
 
503
        result += ':Purpose: %s\n' % purpose
493
504
        if usage.find('\n') >= 0:
494
 
            result += gettext(':Usage:\n%s\n') % (usage,)
 
505
            result += ':Usage:\n%s\n' % usage
495
506
        else:
496
 
            result += gettext(':Usage:   %s\n') % (usage,)
 
507
            result += ':Usage:   %s\n' % usage
497
508
        result += '\n'
498
509
 
499
510
        # Add the options
501
512
        # XXX: optparse implicitly rewraps the help, and not always perfectly,
502
513
        # so we get <https://bugs.launchpad.net/bzr/+bug/249908>.  -- mbp
503
514
        # 20090319
504
 
        parser = option.get_optparser(self.options())
505
 
        options = parser.format_option_help()
 
515
        options = option.get_optparser(self.options()).format_option_help()
506
516
        # FIXME: According to the spec, ReST option lists actually don't
507
517
        # support options like --1.14 so that causes syntax errors (in Sphinx
508
518
        # at least).  As that pattern always appears in the commands that
512
522
        if not plain and options.find('  --1.14  ') != -1:
513
523
            options = options.replace(' format:\n', ' format::\n\n', 1)
514
524
        if options.startswith('Options:'):
515
 
            result += gettext(':Options:%s') % (options[len('options:'):],)
 
525
            result += ':' + options
 
526
        elif options.startswith('options:'):
 
527
            # Python 2.4 version of optparse
 
528
            result += ':Options:' + options[len('options:'):]
516
529
        else:
517
530
            result += options
518
531
        result += '\n'
523
536
            if sections.has_key(None):
524
537
                text = sections.pop(None)
525
538
                text = '\n  '.join(text.splitlines())
526
 
                result += gettext(':Description:\n  %s\n\n') % (text,)
 
539
                result += ':%s:\n  %s\n\n' % ('Description',text)
527
540
 
528
541
            # Add the custom sections (e.g. Examples). Note that there's no need
529
542
            # to indent these as they must be indented already in the source.
530
543
            if sections:
531
544
                for label in order:
532
 
                    if label in sections:
533
 
                        result += ':%s:\n%s\n' % (label, sections[label])
 
545
                    if sections.has_key(label):
 
546
                        result += ':%s:\n%s\n' % (label,sections[label])
534
547
                result += '\n'
535
548
        else:
536
 
            result += (gettext("See bzr help %s for more details and examples.\n\n")
 
549
            result += ("See bzr help %s for more details and examples.\n\n"
537
550
                % self.name())
538
551
 
539
552
        # Add the aliases, source (plug-in) and see also links, if any
540
553
        if self.aliases:
541
 
            result += gettext(':Aliases:  ')
 
554
            result += ':Aliases:  '
542
555
            result += ', '.join(self.aliases) + '\n'
543
556
        plugin_name = self.plugin_name()
544
557
        if plugin_name is not None:
545
 
            result += gettext(':From:     plugin "%s"\n') % plugin_name
 
558
            result += ':From:     plugin "%s"\n' % plugin_name
546
559
        see_also = self.get_see_also(additional_see_also)
547
560
        if see_also:
548
561
            if not plain and see_also_as_links:
554
567
                        see_also_links.append(item)
555
568
                    else:
556
569
                        # Use a Sphinx link for this entry
557
 
                        link_text = gettext(":doc:`{0} <{1}-help>`").format(
558
 
                                                                    item, item)
 
570
                        link_text = ":doc:`%s <%s-help>`" % (item, item)
559
571
                        see_also_links.append(link_text)
560
572
                see_also = see_also_links
561
 
            result += gettext(':See also: %s') % ', '.join(see_also) + '\n'
 
573
            result += ':See also: '
 
574
            result += ', '.join(see_also) + '\n'
562
575
 
563
576
        # If this will be rendered as plain text, convert it
564
577
        if plain:
645
658
    def run_argv_aliases(self, argv, alias_argv=None):
646
659
        """Parse the command line and run with extra aliases in alias_argv."""
647
660
        args, opts = parse_args(self, argv, alias_argv)
648
 
        self._setup_outf()
649
661
 
650
662
        # Process the standard options
651
663
        if 'help' in opts:  # e.g. bzr add --help
652
 
            self.outf.write(self.get_help_text())
 
664
            sys.stdout.write(self.get_help_text())
653
665
            return 0
654
666
        if 'usage' in opts:  # e.g. bzr add --usage
655
 
            self.outf.write(self.get_help_text(verbose=False))
 
667
            sys.stdout.write(self.get_help_text(verbose=False))
656
668
            return 0
657
669
        trace.set_verbosity_level(option._verbosity_level)
658
670
        if 'verbose' in self.supported_std_options:
663
675
            opts['quiet'] = trace.is_quiet()
664
676
        elif opts.has_key('quiet'):
665
677
            del opts['quiet']
 
678
 
666
679
        # mix arguments and options into one dictionary
667
680
        cmdargs = _match_argform(self.name(), self.takes_args, args)
668
681
        cmdopts = {}
672
685
        all_cmd_args = cmdargs.copy()
673
686
        all_cmd_args.update(cmdopts)
674
687
 
 
688
        self._setup_outf()
 
689
 
675
690
        try:
676
691
            return self.run(**all_cmd_args)
677
692
        finally:
700
715
                del self._operation
701
716
        self.run = run
702
717
 
 
718
    @deprecated_method(deprecated_in((2, 2, 0)))
 
719
    def run_direct(self, *args, **kwargs):
 
720
        """Deprecated thunk from bzrlib 2.1."""
 
721
        return self.run(*args, **kwargs)
 
722
 
703
723
    def run(self):
704
724
        """Actually run the command.
705
725
 
731
751
            return None
732
752
        return getdoc(self)
733
753
 
734
 
    def gettext(self, message):
735
 
        """Returns the gettext function used to translate this command's help.
736
 
 
737
 
        Commands provided by plugins should override this to use their
738
 
        own i18n system.
739
 
        """
740
 
        return i18n.gettext_per_paragraph(message)
741
 
 
742
754
    def name(self):
743
755
        """Return the canonical name for this command.
744
756
 
815
827
    try:
816
828
        options, args = parser.parse_args(args)
817
829
    except UnicodeEncodeError,e:
818
 
        raise errors.BzrCommandError(
819
 
            gettext('Only ASCII permitted in option names'))
 
830
        raise errors.BzrCommandError('Only ASCII permitted in option names')
820
831
 
821
832
    opts = dict([(k, v) for k, v in options.__dict__.iteritems() if
822
833
                 v is not option.OptionParser.DEFAULT_VALUE])
840
851
                argdict[argname + '_list'] = None
841
852
        elif ap[-1] == '+':
842
853
            if not args:
843
 
                raise errors.BzrCommandError(gettext(
844
 
                      "command {0!r} needs one or more {1}").format(
845
 
                      cmd, argname.upper()))
 
854
                raise errors.BzrCommandError("command %r needs one or more %s"
 
855
                                             % (cmd, argname.upper()))
846
856
            else:
847
857
                argdict[argname + '_list'] = args[:]
848
858
                args = []
849
859
        elif ap[-1] == '$': # all but one
850
860
            if len(args) < 2:
851
 
                raise errors.BzrCommandError(
852
 
                      gettext("command {0!r} needs one or more {1}").format(
853
 
                                             cmd, argname.upper()))
 
861
                raise errors.BzrCommandError("command %r needs one or more %s"
 
862
                                             % (cmd, argname.upper()))
854
863
            argdict[argname + '_list'] = args[:-1]
855
864
            args[:-1] = []
856
865
        else:
857
866
            # just a plain arg
858
867
            argname = ap
859
868
            if not args:
860
 
                raise errors.BzrCommandError(
861
 
                     gettext("command {0!r} requires argument {1}").format(
862
 
                               cmd, argname.upper()))
 
869
                raise errors.BzrCommandError("command %r requires argument %s"
 
870
                               % (cmd, argname.upper()))
863
871
            else:
864
872
                argdict[argname] = args.pop(0)
865
873
 
866
874
    if args:
867
 
        raise errors.BzrCommandError( gettext(
868
 
                              "extra argument to command {0}: {1}").format(
869
 
                                       cmd, args[0]) )
 
875
        raise errors.BzrCommandError("extra argument to command %s: %s"
 
876
                                     % (cmd, args[0]))
870
877
 
871
878
    return argdict
872
879
 
955
962
 
956
963
def apply_lsprofiled(filename, the_callable, *args, **kwargs):
957
964
    from bzrlib.lsprof import profile
958
 
    ret, stats = profile(exception_to_return_code, the_callable,
959
 
                         *args, **kwargs)
 
965
    ret, stats = profile(exception_to_return_code, the_callable, *args, **kwargs)
960
966
    stats.sort()
961
967
    if filename is None:
962
968
        stats.pprint()
963
969
    else:
964
970
        stats.save(filename)
965
 
        trace.note(gettext('Profile data written to "%s".'), filename)
 
971
        trace.note('Profile data written to "%s".', filename)
966
972
    return ret
967
973
 
968
974
 
 
975
@deprecated_function(deprecated_in((2, 2, 0)))
 
976
def shlex_split_unicode(unsplit):
 
977
    return cmdline.split(unsplit)
 
978
 
 
979
 
969
980
def get_alias(cmd, config=None):
970
981
    """Return an expanded alias, or None if no alias exists.
971
982
 
1030
1041
    argv = _specified_or_unicode_argv(argv)
1031
1042
    trace.mutter("bzr arguments: %r", argv)
1032
1043
 
1033
 
    opt_lsprof = opt_profile = opt_no_plugins = opt_builtin = \
1034
 
            opt_no_l10n = opt_no_aliases = False
 
1044
    opt_lsprof = opt_profile = opt_no_plugins = opt_builtin =  \
 
1045
                opt_no_aliases = False
1035
1046
    opt_lsprof_file = opt_coverage_dir = None
1036
1047
 
1037
1048
    # --no-plugins is handled specially at a very early stage. We need
1040
1051
 
1041
1052
    argv_copy = []
1042
1053
    i = 0
1043
 
    override_config = []
1044
1054
    while i < len(argv):
1045
1055
        a = argv[i]
1046
1056
        if a == '--profile':
1055
1065
            opt_no_plugins = True
1056
1066
        elif a == '--no-aliases':
1057
1067
            opt_no_aliases = True
1058
 
        elif a == '--no-l10n':
1059
 
            opt_no_l10n = True
1060
1068
        elif a == '--builtin':
1061
1069
            opt_builtin = True
1062
1070
        elif a == '--concurrency':
1069
1077
            pass # already handled in startup script Bug #588277
1070
1078
        elif a.startswith('-D'):
1071
1079
            debug.debug_flags.add(a[2:])
1072
 
        elif a.startswith('-O'):
1073
 
            override_config.append(a[2:])
1074
1080
        else:
1075
1081
            argv_copy.append(a)
1076
1082
        i += 1
1077
1083
 
1078
 
    bzrlib.global_state.cmdline_overrides._from_cmdline(override_config)
1079
 
 
1080
1084
    debug.set_debug_flags_from_config()
1081
1085
 
1082
1086
    if not opt_no_plugins:
1102
1106
 
1103
1107
    cmd = argv.pop(0)
1104
1108
    cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin)
1105
 
    if opt_no_l10n:
1106
 
        cmd.l10n = False
1107
1109
    run = cmd_obj.run_argv_aliases
1108
1110
    run_argv = [argv, alias_argv]
1109
1111
 
1134
1136
        if 'memory' in debug.debug_flags:
1135
1137
            trace.debug_memory('Process status after command:', short=False)
1136
1138
        option._verbosity_level = saved_verbosity_level
1137
 
        # Reset the overrides 
1138
 
        bzrlib.global_state.cmdline_overrides._reset()
1139
1139
 
1140
1140
 
1141
1141
def display_command(func):
1170
1170
        "bzr plugin commands")
1171
1171
    Command.hooks.install_named_hook("get_command", _get_external_command,
1172
1172
        "bzr external command lookup")
1173
 
    Command.hooks.install_named_hook("get_missing_command",
1174
 
                                     _try_plugin_provider,
1175
 
                                     "bzr plugin-provider-db check")
 
1173
    Command.hooks.install_named_hook("get_missing_command", _try_plugin_provider,
 
1174
        "bzr plugin-provider-db check")
1176
1175
 
1177
1176
 
1178
1177