~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-05-16 17:33:27 UTC
  • mfrom: (5755.2.10 2.4-max-entries-gc-602614)
  • Revision ID: pqm@pqm.ubuntu.com-20110516173327-5ehst0ttceohsf5w
(jameinel) Add bzr.groupcompress.max_bytes_to_index to limit peak memory
 when delta-compressing large files (bug #602614) (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
27
27
 
28
28
from bzrlib.lazy_import import lazy_import
29
29
lazy_import(globals(), """
30
 
import codecs
31
30
import errno
32
31
import threading
33
 
from warnings import warn
34
32
 
35
33
import bzrlib
36
34
from bzrlib import (
42
40
    osutils,
43
41
    trace,
44
42
    ui,
45
 
    win32utils,
46
43
    )
47
44
""")
48
45
 
49
 
from bzrlib.hooks import HookPoint, Hooks
 
46
from bzrlib.hooks import Hooks
50
47
# Compatibility - Option used to be in commands.
51
48
from bzrlib.option import Option
52
49
from bzrlib.plugin import disable_plugins, load_plugins
276
273
    # Allow plugins to extend commands
277
274
    for hook in Command.hooks['extend_command']:
278
275
        hook(cmd)
 
276
    if getattr(cmd, 'invoked_as', None) is None:
 
277
        cmd.invoked_as = cmd_name
279
278
    return cmd
280
279
 
281
280
 
397
396
            sys.stdout is forced to be a binary stream, and line-endings
398
397
            will not mangled.
399
398
 
 
399
    :ivar invoked_as:
 
400
        A string indicating the real name under which this command was
 
401
        invoked, before expansion of aliases. 
 
402
        (This may be None if the command was constructed and run in-process.)
 
403
 
400
404
    :cvar hooks: An instance of CommandHooks.
 
405
 
401
406
    :ivar __doc__: The help shown by 'bzr help command' for this command.
402
407
        This is set by assigning explicitly to __doc__ so that -OO can
403
408
        be used::
409
414
    takes_args = []
410
415
    takes_options = []
411
416
    encoding_type = 'strict'
 
417
    invoked_as = None
412
418
 
413
419
    hidden = False
414
420
 
514
520
        # so we get <https://bugs.launchpad.net/bzr/+bug/249908>.  -- mbp
515
521
        # 20090319
516
522
        options = option.get_optparser(self.options()).format_option_help()
517
 
        # XXX: According to the spec, ReST option lists actually don't support 
518
 
        # options like --1.9 so that causes syntax errors (in Sphinx at least).
519
 
        # As that pattern always appears in the commands that break, we trap
520
 
        # on that and then format that block of 'format' options as a literal
521
 
        # block.
522
 
        if not plain and options.find('  --1.9  ') != -1:
 
523
        # FIXME: According to the spec, ReST option lists actually don't
 
524
        # support options like --1.14 so that causes syntax errors (in Sphinx
 
525
        # at least).  As that pattern always appears in the commands that
 
526
        # break, we trap on that and then format that block of 'format' options
 
527
        # as a literal block. We use the most recent format still listed so we
 
528
        # don't have to do that too often -- vila 20110514
 
529
        if not plain and options.find('  --1.14  ') != -1:
523
530
            options = options.replace(' format:\n', ' format::\n\n', 1)
524
531
        if options.startswith('Options:'):
525
532
            result += ':' + options
687
694
 
688
695
        self._setup_outf()
689
696
 
690
 
        return self.run(**all_cmd_args)
 
697
        try:
 
698
            return self.run(**all_cmd_args)
 
699
        finally:
 
700
            # reset it, so that other commands run in the same process won't
 
701
            # inherit state. Before we reset it, log any activity, so that it
 
702
            # gets properly tracked.
 
703
            ui.ui_factory.log_transport_activity(
 
704
                display=('bytes' in debug.debug_flags))
 
705
            trace.set_verbosity_level(0)
691
706
 
692
707
    def _setup_run(self):
693
708
        """Wrap the defined run method on self with a cleanup.
744
759
        return getdoc(self)
745
760
 
746
761
    def name(self):
 
762
        """Return the canonical name for this command.
 
763
 
 
764
        The name under which it was actually invoked is available in invoked_as.
 
765
        """
747
766
        return _unsquish_command_name(self.__class__.__name__)
748
767
 
749
768
    def plugin_name(self):
767
786
        These are all empty initially, because by default nothing should get
768
787
        notified.
769
788
        """
770
 
        Hooks.__init__(self)
771
 
        self.create_hook(HookPoint('extend_command',
 
789
        Hooks.__init__(self, "bzrlib.commands", "Command.hooks")
 
790
        self.add_hook('extend_command',
772
791
            "Called after creating a command object to allow modifications "
773
792
            "such as adding or removing options, docs etc. Called with the "
774
 
            "new bzrlib.commands.Command object.", (1, 13), None))
775
 
        self.create_hook(HookPoint('get_command',
 
793
            "new bzrlib.commands.Command object.", (1, 13))
 
794
        self.add_hook('get_command',
776
795
            "Called when creating a single command. Called with "
777
796
            "(cmd_or_None, command_name). get_command should either return "
778
797
            "the cmd_or_None parameter, or a replacement Command object that "
779
798
            "should be used for the command. Note that the Command.hooks "
780
799
            "hooks are core infrastructure. Many users will prefer to use "
781
800
            "bzrlib.commands.register_command or plugin_cmds.register_lazy.",
782
 
            (1, 17), None))
783
 
        self.create_hook(HookPoint('get_missing_command',
 
801
            (1, 17))
 
802
        self.add_hook('get_missing_command',
784
803
            "Called when creating a single command if no command could be "
785
804
            "found. Called with (command_name). get_missing_command should "
786
805
            "either return None, or a Command object to be used for the "
787
 
            "command.", (1, 17), None))
788
 
        self.create_hook(HookPoint('list_commands',
 
806
            "command.", (1, 17))
 
807
        self.add_hook('list_commands',
789
808
            "Called when enumerating commands. Called with a set of "
790
809
            "cmd_name strings for all the commands found so far. This set "
791
810
            " is safe to mutate - e.g. to remove a command. "
792
811
            "list_commands should return the updated set of command names.",
793
 
            (1, 17), None))
 
812
            (1, 17))
794
813
 
795
814
Command.hooks = CommandHooks()
796
815
 
810
829
    else:
811
830
        args = argv
812
831
 
813
 
    options, args = parser.parse_args(args)
 
832
    # for python 2.5 and later, optparse raises this exception if a non-ascii
 
833
    # option name is given.  See http://bugs.python.org/issue2931
 
834
    try:
 
835
        options, args = parser.parse_args(args)
 
836
    except UnicodeEncodeError,e:
 
837
        raise errors.BzrCommandError('Only ASCII permitted in option names')
 
838
 
814
839
    opts = dict([(k, v) for k, v in options.__dict__.iteritems() if
815
840
                 v is not option.OptionParser.DEFAULT_VALUE])
816
841
    return args, opts
1020
1045
        Specify the number of processes that can be run concurrently (selftest).
1021
1046
    """
1022
1047
    trace.mutter("bazaar version: " + bzrlib.__version__)
1023
 
    argv = list(argv)
 
1048
    argv = _specified_or_unicode_argv(argv)
1024
1049
    trace.mutter("bzr arguments: %r", argv)
1025
1050
 
1026
1051
    opt_lsprof = opt_profile = opt_no_plugins = opt_builtin =  \
1166
1191
        new_argv = []
1167
1192
        try:
1168
1193
            # ensure all arguments are unicode strings
1169
 
            for a in argv[1:]:
 
1194
            for a in argv:
1170
1195
                if isinstance(a, unicode):
1171
1196
                    new_argv.append(a)
1172
1197
                else:
1188
1213
 
1189
1214
    :return: exit code of bzr command.
1190
1215
    """
1191
 
    argv = _specified_or_unicode_argv(argv)
 
1216
    if argv is not None:
 
1217
        argv = argv[1:]
1192
1218
    _register_builtin_commands()
1193
1219
    ret = run_bzr_catch_errors(argv)
1194
 
    bzrlib.ui.ui_factory.log_transport_activity(
1195
 
        display=('bytes' in debug.debug_flags))
1196
1220
    trace.mutter("return code %d", ret)
1197
1221
    return ret
1198
1222