bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 3785.1.4
by Aaron Bentley Enable lazy-loading of commands | 1 | # Copyright (C) 2006, 2008 Canonical Ltd
 | 
| 1610.1.4
by Martin Pool Doc | 2 | #
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 3 | # This program is free software; you can redistribute it and/or modify
 | 
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 1610.1.4
by Martin Pool Doc | 7 | #
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 8 | # This program is distributed in the hope that it will be useful,
 | 
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 1610.1.4
by Martin Pool Doc | 12 | #
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 13 | # You should have received a copy of the GNU General Public License
 | 
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 17 | ||
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 18 | # TODO: probably should say which arguments are candidates for glob
 | 
| 19 | # expansion on windows and do that at the command level.
 | |
| 20 | ||
| 1095
by Martin Pool todo | 21 | # TODO: Define arguments by objects, rather than just using names.
 | 
| 22 | # Those objects can specify the expected type of the argument, which
 | |
| 1610.1.4
by Martin Pool Doc | 23 | # would help with validation and shell completion.  They could also provide
 | 
| 24 | # help/explanation for that argument in a structured way.
 | |
| 25 | ||
| 26 | # TODO: Specific "examples" property on commands for consistent formatting.
 | |
| 1095
by Martin Pool todo | 27 | |
| 1393.1.27
by Martin Pool - clean up profile code and change default sort order | 28 | # TODO: "--profile=cum", to change sort order.  Is there any value in leaving
 | 
| 29 | # the profile output behind so it can be interactively examined?
 | |
| 30 | ||
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 31 | import os | 
| 32 | import sys | |
| 33 | ||
| 34 | from bzrlib.lazy_import import lazy_import | |
| 35 | lazy_import(globals(), """ | |
| 1857.1.1
by Aaron Bentley Use optparse for parsing options | 36 | import codecs
 | 
| 37 | import errno
 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 38 | from warnings import warn
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 39 | |
| 40 | import bzrlib
 | |
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 41 | from bzrlib import (
 | 
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 42 |     debug,
 | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 43 |     errors,
 | 
| 44 |     option,
 | |
| 45 |     osutils,
 | |
| 46 |     trace,
 | |
| 2568.2.2
by Robert Collins * New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class | 47 |     win32utils,
 | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 48 |     )
 | 
| 49 | """) | |
| 50 | ||
| 3224.5.22
by Andrew Bennetts More minor import tidying suggested by pyflakes. | 51 | from bzrlib import registry | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 52 | # Compatibility
 | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 53 | from bzrlib.option import Option | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 54 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 55 | |
| 3785.1.2
by Aaron Bentley Avoid getting plugins unnecessarily | 56 | class CommandInfo(object): | 
| 57 | """Information about a command.""" | |
| 58 | ||
| 59 | def __init__(self, aliases): | |
| 60 | """The list of aliases for the command.""" | |
| 61 | self.aliases = aliases | |
| 62 | ||
| 63 |     @classmethod
 | |
| 64 | def from_command(klass, command): | |
| 65 | """Factory to construct a CommandInfo from a command.""" | |
| 66 | return klass(command.aliases) | |
| 67 | ||
| 68 | ||
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 69 | class CommandRegistry(registry.Registry): | 
| 70 | ||
| 3785.1.4
by Aaron Bentley Enable lazy-loading of commands | 71 |     @staticmethod
 | 
| 72 | def _get_name(command_name): | |
| 73 | if command_name.startswith("cmd_"): | |
| 74 | return _unsquish_command_name(command_name) | |
| 75 | else: | |
| 76 | return command_name | |
| 77 | ||
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 78 | def register(self, cmd, decorate=False): | 
| 79 | """Utility function to help register a command | |
| 80 | ||
| 81 |         :param cmd: Command subclass to register
 | |
| 82 |         :param decorate: If true, allow overriding an existing command
 | |
| 83 |             of the same name; the old command is returned by this function.
 | |
| 84 |             Otherwise it is an error to try to override an existing command.
 | |
| 85 |         """
 | |
| 86 | k = cmd.__name__ | |
| 3785.1.4
by Aaron Bentley Enable lazy-loading of commands | 87 | k_unsquished = self._get_name(k) | 
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 88 | try: | 
| 89 | previous = self.get(k_unsquished) | |
| 90 | except KeyError: | |
| 91 | previous = _builtin_commands().get(k_unsquished) | |
| 3785.1.2
by Aaron Bentley Avoid getting plugins unnecessarily | 92 | info = CommandInfo.from_command(cmd) | 
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 93 | try: | 
| 94 | registry.Registry.register(self, k_unsquished, cmd, | |
| 3785.1.2
by Aaron Bentley Avoid getting plugins unnecessarily | 95 | override_existing=decorate, info=info) | 
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 96 | except KeyError: | 
| 97 | trace.log_error('Two plugins defined the same command: %r' % k) | |
| 98 | trace.log_error('Not loading the one in %r' % | |
| 99 | sys.modules[cmd.__module__]) | |
| 100 | trace.log_error('Previously this command was registered from %r' % | |
| 101 | sys.modules[previous.__module__]) | |
| 102 | return previous | |
| 103 | ||
| 3785.1.4
by Aaron Bentley Enable lazy-loading of commands | 104 | def register_lazy(self, command_name, aliases, module_name): | 
| 105 | """Register a command without loading its module. | |
| 106 | ||
| 107 |         :param command_name: The primary name of the command.
 | |
| 108 |         :param aliases: A list of aliases for the command.
 | |
| 109 |         :module_name: The module that the command lives in.
 | |
| 110 |         """
 | |
| 111 | key = self._get_name(command_name) | |
| 112 | registry.Registry.register_lazy(self, key, module_name, command_name, | |
| 113 | info=CommandInfo(aliases)) | |
| 114 | ||
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 115 | |
| 116 | plugin_cmds = CommandRegistry() | |
| 731
by Martin Pool - merge plugin patch from john | 117 | |
| 118 | ||
| 1492
by Robert Collins Support decoration of commands. | 119 | def register_command(cmd, decorate=False): | 
| 731
by Martin Pool - merge plugin patch from john | 120 | global plugin_cmds | 
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 121 | return plugin_cmds.register(cmd, decorate) | 
| 731
by Martin Pool - merge plugin patch from john | 122 | |
| 123 | ||
| 350
by Martin Pool - refactor command aliases into command classes | 124 | def _squish_command_name(cmd): | 
| 125 | return 'cmd_' + cmd.replace('-', '_') | |
| 126 | ||
| 127 | ||
| 128 | def _unsquish_command_name(cmd): | |
| 129 | return cmd[4:].replace('_','-') | |
| 130 | ||
| 914
by Martin Pool - fix up breakage of 'bzr log -v' by root_id patch | 131 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 132 | def _builtin_commands(): | 
| 1147
by Martin Pool - split builtin commands into separate module bzrlib.builtins; | 133 | import bzrlib.builtins | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 134 | r = {} | 
| 1147
by Martin Pool - split builtin commands into separate module bzrlib.builtins; | 135 | builtins = bzrlib.builtins.__dict__ | 
| 136 | for name in builtins: | |
| 137 | if name.startswith("cmd_"): | |
| 1616.1.6
by Martin Pool doc | 138 | real_name = _unsquish_command_name(name) | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 139 | r[real_name] = builtins[name] | 
| 140 | return r | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 141 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 142 | |
| 143 | def builtin_command_names(): | |
| 144 | """Return list of builtin command names.""" | |
| 145 | return _builtin_commands().keys() | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 146 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 147 | |
| 148 | def plugin_command_names(): | |
| 149 | return plugin_cmds.keys() | |
| 150 | ||
| 151 | ||
| 152 | def _get_cmd_dict(plugins_override=True): | |
| 153 | """Return name->class mapping for all commands.""" | |
| 154 | d = _builtin_commands() | |
| 731
by Martin Pool - merge plugin patch from john | 155 | if plugins_override: | 
| 3785.1.1
by Aaron Bentley Switch from dict to Registry for plugin_cmds | 156 | d.update(plugin_cmds.iteritems()) | 
| 641
by Martin Pool - improved external-command patch from john | 157 | return d | 
| 731
by Martin Pool - merge plugin patch from john | 158 | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 159 | |
| 731
by Martin Pool - merge plugin patch from john | 160 | def get_all_cmds(plugins_override=True): | 
| 641
by Martin Pool - improved external-command patch from john | 161 | """Return canonical name and class for all registered commands.""" | 
| 731
by Martin Pool - merge plugin patch from john | 162 | for k, v in _get_cmd_dict(plugins_override=plugins_override).iteritems(): | 
| 641
by Martin Pool - improved external-command patch from john | 163 | yield k,v | 
| 164 | ||
| 165 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 166 | def get_cmd_object(cmd_name, plugins_override=True): | 
| 350
by Martin Pool - refactor command aliases into command classes | 167 | """Return the canonical name and command class for a command. | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 168 | |
| 169 |     plugins_override
 | |
| 170 |         If true, plugin commands can override builtins.
 | |
| 350
by Martin Pool - refactor command aliases into command classes | 171 |     """
 | 
| 2432.1.13
by Robert Collins HelpCommandContext now implementes get_topics. | 172 | try: | 
| 173 | return _get_cmd_object(cmd_name, plugins_override) | |
| 174 | except KeyError: | |
| 175 | raise errors.BzrCommandError('unknown command "%s"' % cmd_name) | |
| 176 | ||
| 177 | ||
| 178 | def _get_cmd_object(cmd_name, plugins_override=True): | |
| 179 | """Worker for get_cmd_object which raises KeyError rather than BzrCommandError.""" | |
| 1163
by Martin Pool - split ExternalCommand class into its own file | 180 | from bzrlib.externalcommand import ExternalCommand | 
| 181 | ||
| 1948.1.10
by John Arbash Meinel Simplify changes to command.py | 182 |     # We want only 'ascii' command names, but the user may have typed
 | 
| 183 |     # in a Unicode name. In that case, they should just get a
 | |
| 184 |     # 'command not found' error later.
 | |
| 185 |     # In the future, we may actually support Unicode command names.
 | |
| 350
by Martin Pool - refactor command aliases into command classes | 186 | |
| 187 |     # first look up this command under the specified name
 | |
| 3785.1.2
by Aaron Bentley Avoid getting plugins unnecessarily | 188 | if plugins_override: | 
| 189 | try: | |
| 190 | return plugin_cmds.get(cmd_name)() | |
| 191 | except KeyError: | |
| 192 |             pass
 | |
| 193 | cmds = _get_cmd_dict(plugins_override=False) | |
| 272
by Martin Pool - Add command aliases | 194 | try: | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 195 | return cmds[cmd_name]() | 
| 272
by Martin Pool - Add command aliases | 196 | except KeyError: | 
| 350
by Martin Pool - refactor command aliases into command classes | 197 |         pass
 | 
| 3785.1.2
by Aaron Bentley Avoid getting plugins unnecessarily | 198 | if plugins_override: | 
| 199 | for key in plugin_cmds.keys(): | |
| 200 | info = plugin_cmds.get_info(key) | |
| 201 | if cmd_name in info.aliases: | |
| 202 | return plugin_cmds.get(key)() | |
| 350
by Martin Pool - refactor command aliases into command classes | 203 |     # look for any command which claims this as an alias
 | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 204 | for real_cmd_name, cmd_class in cmds.iteritems(): | 
| 205 | if cmd_name in cmd_class.aliases: | |
| 206 | return cmd_class() | |
| 207 | ||
| 208 | cmd_obj = ExternalCommand.find_command(cmd_name) | |
| 209 | if cmd_obj: | |
| 210 | return cmd_obj | |
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 211 | |
| 212 |     # look for plugins that provide this command but aren't installed
 | |
| 213 | for provider in command_providers_registry: | |
| 214 | try: | |
| 215 | plugin_metadata = provider.plugin_for_command(cmd_name) | |
| 216 | except errors.NoPluginAvailable: | |
| 217 |             pass
 | |
| 218 | else: | |
| 3246.7.3
by Martin Albisetti Code cleanup and documentation | 219 | raise errors.CommandAvailableInPlugin(cmd_name, | 
| 3246.7.6
by Martin Albisetti * Change to module imports to alphabetical order | 220 | plugin_metadata, provider) | 
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 221 | |
| 2432.1.13
by Robert Collins HelpCommandContext now implementes get_topics. | 222 | raise KeyError | 
| 272
by Martin Pool - Add command aliases | 223 | |
| 329
by Martin Pool - refactor command functions into command classes | 224 | |
| 558
by Martin Pool - All top-level classes inherit from object | 225 | class Command(object): | 
| 329
by Martin Pool - refactor command functions into command classes | 226 | """Base class for commands. | 
| 227 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 228 |     Commands are the heart of the command-line bzr interface.
 | 
| 229 | ||
| 230 |     The command object mostly handles the mapping of command-line
 | |
| 231 |     parameters into one or more bzrlib operations, and of the results
 | |
| 232 |     into textual output.
 | |
| 233 | ||
| 234 |     Commands normally don't have any state.  All their arguments are
 | |
| 235 |     passed in to the run method.  (Subclasses may take a different
 | |
| 236 |     policy if the behaviour of the instance needs to depend on e.g. a
 | |
| 237 |     shell plugin and not just its Python class.)
 | |
| 238 | ||
| 329
by Martin Pool - refactor command functions into command classes | 239 |     The docstring for an actual command should give a single-line
 | 
| 240 |     summary, then a complete description of the command.  A grammar
 | |
| 241 |     description will be inserted.
 | |
| 242 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 243 |     aliases
 | 
| 244 |         Other accepted names for this command.
 | |
| 245 | ||
| 329
by Martin Pool - refactor command functions into command classes | 246 |     takes_args
 | 
| 247 |         List of argument forms, marked with whether they are optional,
 | |
| 248 |         repeated, etc.
 | |
| 249 | ||
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 250 |                 Examples:
 | 
| 251 | ||
| 252 |                 ['to_location', 'from_branch?', 'file*']
 | |
| 253 | ||
| 254 |                 'to_location' is required
 | |
| 255 |                 'from_branch' is optional
 | |
| 256 |                 'file' can be specified 0 or more times
 | |
| 1185.37.4
by Jamie Wilkinson add some examples to the documentation for Command.takes_args | 257 | |
| 329
by Martin Pool - refactor command functions into command classes | 258 |     takes_options
 | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 259 |         List of options that may be given for this command.  These can
 | 
| 260 |         be either strings, referring to globally-defined options,
 | |
| 261 |         or option objects.  Retrieve through options().
 | |
| 329
by Martin Pool - refactor command functions into command classes | 262 | |
| 263 |     hidden
 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 264 |         If true, this command isn't advertised.  This is typically
 | 
| 265 |         for commands intended for expert users.
 | |
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 266 | |
| 267 |     encoding_type
 | |
| 268 |         Command objects will get a 'outf' attribute, which has been
 | |
| 269 |         setup to properly handle encoding of unicode strings.
 | |
| 270 |         encoding_type determines what will happen when characters cannot
 | |
| 271 |         be encoded
 | |
| 272 |             strict - abort if we cannot decode
 | |
| 273 |             replace - put in a bogus character (typically '?')
 | |
| 274 |             exact - do not encode sys.stdout
 | |
| 275 | ||
| 2178.4.5
by Alexander Belchenko Spell-checking (thanks to Aaron) | 276 |             NOTE: by default on Windows, sys.stdout is opened as a text
 | 
| 277 |             stream, therefore LF line-endings are converted to CRLF.
 | |
| 278 |             When a command uses encoding_type = 'exact', then
 | |
| 279 |             sys.stdout is forced to be a binary stream, and line-endings
 | |
| 2178.4.4
by Alexander Belchenko encoding_type = 'exact' force sys.stdout to be binary stream on win32 | 280 |             will not mangled.
 | 
| 2178.4.5
by Alexander Belchenko Spell-checking (thanks to Aaron) | 281 | |
| 329
by Martin Pool - refactor command functions into command classes | 282 |     """
 | 
| 283 | aliases = [] | |
| 284 | takes_args = [] | |
| 285 | takes_options = [] | |
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 286 | encoding_type = 'strict' | 
| 329
by Martin Pool - refactor command functions into command classes | 287 | |
| 288 | hidden = False | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 289 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 290 | def __init__(self): | 
| 291 | """Construct an instance of this command.""" | |
| 973
by Martin Pool - various refactorings of command interpreter | 292 | if self.__doc__ == Command.__doc__: | 
| 293 | warn("No help message set for %r" % self) | |
| 2768.1.4
by Ian Clatworthy Process --verbose and --quiet standard options | 294 |         # List of standard options directly supported
 | 
| 295 | self.supported_std_options = [] | |
| 329
by Martin Pool - refactor command functions into command classes | 296 | |
| 2568.2.6
by Robert Collins Review feedback. | 297 | def _maybe_expand_globs(self, file_list): | 
| 2568.2.2
by Robert Collins * New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class | 298 | """Glob expand file_list if the platform does not do that itself. | 
| 299 |         
 | |
| 300 |         :return: A possibly empty list of unicode paths.
 | |
| 301 | ||
| 302 |         Introduced in bzrlib 0.18.
 | |
| 303 |         """
 | |
| 304 | if not file_list: | |
| 305 | file_list = [] | |
| 306 | if sys.platform == 'win32': | |
| 307 | file_list = win32utils.glob_expand(file_list) | |
| 308 | return list(file_list) | |
| 309 | ||
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 310 | def _usage(self): | 
| 311 | """Return single-line grammar for this command. | |
| 312 | ||
| 313 |         Only describes arguments, not options.
 | |
| 314 |         """
 | |
| 315 | s = 'bzr ' + self.name() + ' ' | |
| 316 | for aname in self.takes_args: | |
| 317 | aname = aname.upper() | |
| 318 | if aname[-1] in ['$', '+']: | |
| 319 | aname = aname[:-1] + '...' | |
| 320 | elif aname[-1] == '?': | |
| 321 | aname = '[' + aname[:-1] + ']' | |
| 322 | elif aname[-1] == '*': | |
| 323 | aname = '[' + aname[:-1] + '...]' | |
| 324 | s += aname + ' ' | |
| 3376.2.4
by Martin Pool Remove every assert statement from bzrlib! | 325 | s = s[:-1] # remove last space | 
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 326 | return s | 
| 327 | ||
| 2677.1.2
by Alexander Belchenko bzr_man: see also topics as cross-reference links | 328 | def get_help_text(self, additional_see_also=None, plain=True, | 
| 329 | see_also_as_links=False): | |
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 330 | """Return a text string with help for this command. | 
| 331 |         
 | |
| 332 |         :param additional_see_also: Additional help topics to be
 | |
| 333 |             cross-referenced.
 | |
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 334 |         :param plain: if False, raw help (reStructuredText) is
 | 
| 335 |             returned instead of plain text.
 | |
| 2677.1.2
by Alexander Belchenko bzr_man: see also topics as cross-reference links | 336 |         :param see_also_as_links: if True, convert items in 'See also'
 | 
| 2677.1.4
by Alexander Belchenko fixes after John's review | 337 |             list to internal links (used by bzr_man rstx generator)
 | 
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 338 |         """
 | 
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 339 | doc = self.help() | 
| 340 | if doc is None: | |
| 341 | raise NotImplementedError("sorry, no detailed help yet for %r" % self.name()) | |
| 342 | ||
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 343 |         # Extract the summary (purpose) and sections out from the text
 | 
| 344 | purpose,sections = self._get_help_parts(doc) | |
| 345 | ||
| 346 |         # If a custom usage section was provided, use it
 | |
| 347 | if sections.has_key('Usage'): | |
| 348 | usage = sections.pop('Usage') | |
| 349 | else: | |
| 350 | usage = self._usage() | |
| 351 | ||
| 352 |         # The header is the purpose and usage
 | |
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 353 | result = "" | 
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 354 | result += ':Purpose: %s\n' % purpose | 
| 355 | if usage.find('\n') >= 0: | |
| 356 | result += ':Usage:\n%s\n' % usage | |
| 357 | else: | |
| 358 | result += ':Usage: %s\n' % usage | |
| 359 | result += '\n' | |
| 360 | ||
| 361 |         # Add the options
 | |
| 362 | options = option.get_optparser(self.options()).format_option_help() | |
| 363 | if options.startswith('Options:'): | |
| 364 | result += ':' + options | |
| 2666.1.9
by Ian Clatworthy Fix case of Options in help under Python 2.4 | 365 | elif options.startswith('options:'): | 
| 366 |             # Python 2.4 version of optparse
 | |
| 367 | result += ':Options:' + options[len('options:'):] | |
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 368 | else: | 
| 369 | result += options | |
| 370 | result += '\n' | |
| 371 | ||
| 372 |         # Add the description, indenting it 2 spaces
 | |
| 373 |         # to match the indentation of the options
 | |
| 374 | if sections.has_key(None): | |
| 375 | text = sections.pop(None) | |
| 376 | text = '\n '.join(text.splitlines()) | |
| 377 | result += ':%s:\n %s\n\n' % ('Description',text) | |
| 378 | ||
| 379 |         # Add the custom sections (e.g. Examples). Note that there's no need
 | |
| 380 |         # to indent these as they must be indented already in the source.
 | |
| 381 | if sections: | |
| 382 | labels = sorted(sections.keys()) | |
| 383 | for label in labels: | |
| 384 | result += ':%s:\n%s\n\n' % (label,sections[label]) | |
| 385 | ||
| 386 |         # Add the aliases, source (plug-in) and see also links, if any
 | |
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 387 | if self.aliases: | 
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 388 | result += ':Aliases: ' | 
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 389 | result += ', '.join(self.aliases) + '\n' | 
| 390 | plugin_name = self.plugin_name() | |
| 391 | if plugin_name is not None: | |
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 392 | result += ':From: plugin "%s"\n' % plugin_name | 
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 393 | see_also = self.get_see_also(additional_see_also) | 
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 394 | if see_also: | 
| 2677.1.4
by Alexander Belchenko fixes after John's review | 395 | if not plain and see_also_as_links: | 
| 396 | see_also_links = [] | |
| 397 | for item in see_also: | |
| 398 | if item == 'topics': | |
| 399 |                         # topics doesn't have an independent section
 | |
| 400 |                         # so don't create a real link
 | |
| 401 | see_also_links.append(item) | |
| 402 | else: | |
| 403 |                         # Use a reST link for this entry
 | |
| 404 | see_also_links.append("`%s`_" % (item,)) | |
| 405 | see_also = see_also_links | |
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 406 | result += ':See also: ' | 
| 407 | result += ', '.join(see_also) + '\n' | |
| 408 | ||
| 3668.2.1
by Vincent Ladeuil Fix bug #263249 by setting valid default _param_name. | 409 |         # If this will be rendered as plain text, convert it
 | 
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 410 | if plain: | 
| 411 | import bzrlib.help_topics | |
| 412 | result = bzrlib.help_topics.help_as_plain_text(result) | |
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 413 | return result | 
| 414 | ||
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 415 |     @staticmethod
 | 
| 416 | def _get_help_parts(text): | |
| 417 | """Split help text into a summary and named sections. | |
| 418 | ||
| 419 |         :return: (summary,sections) where summary is the top line and
 | |
| 420 |             sections is a dictionary of the rest indexed by section name.
 | |
| 421 |             A section starts with a heading line of the form ":xxx:".
 | |
| 422 |             Indented text on following lines is the section value.
 | |
| 423 |             All text found outside a named section is assigned to the
 | |
| 424 |             default section which is given the key of None.
 | |
| 425 |         """
 | |
| 426 | def save_section(sections, label, section): | |
| 427 | if len(section) > 0: | |
| 428 | if sections.has_key(label): | |
| 429 | sections[label] += '\n' + section | |
| 430 | else: | |
| 431 | sections[label] = section | |
| 3668.2.1
by Vincent Ladeuil Fix bug #263249 by setting valid default _param_name. | 432 | |
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 433 | lines = text.rstrip().splitlines() | 
| 434 | summary = lines.pop(0) | |
| 435 | sections = {} | |
| 436 | label,section = None,'' | |
| 437 | for line in lines: | |
| 438 | if line.startswith(':') and line.endswith(':') and len(line) > 2: | |
| 439 | save_section(sections, label, section) | |
| 440 | label,section = line[1:-1],'' | |
| 3376.2.11
by Martin Pool Compare to None using is/is not not == | 441 | elif (label is not None) and len(line) > 1 and not line[0].isspace(): | 
| 2666.1.1
by Ian Clatworthy Bazaar User Reference generated from online help | 442 | save_section(sections, label, section) | 
| 443 | label,section = None,line | |
| 444 | else: | |
| 445 | if len(section) > 0: | |
| 446 | section += '\n' + line | |
| 447 | else: | |
| 448 | section = line | |
| 449 | save_section(sections, label, section) | |
| 450 | return summary, sections | |
| 451 | ||
| 2432.1.28
by Robert Collins Add a get_help_topic method to commands.Command. | 452 | def get_help_topic(self): | 
| 453 | """Return the commands help topic - its name.""" | |
| 454 | return self.name() | |
| 455 | ||
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 456 | def get_see_also(self, additional_terms=None): | 
| 2677.1.2
by Alexander Belchenko bzr_man: see also topics as cross-reference links | 457 | """Return a list of help topics that are related to this command. | 
| 2425.2.1
by Robert Collins Command objects can now declare related help topics by having _see_also | 458 |         
 | 
| 459 |         The list is derived from the content of the _see_also attribute. Any
 | |
| 460 |         duplicates are removed and the result is in lexical order.
 | |
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 461 |         :param additional_terms: Additional help topics to cross-reference.
 | 
| 2425.2.1
by Robert Collins Command objects can now declare related help topics by having _see_also | 462 |         :return: A list of help topics.
 | 
| 463 |         """
 | |
| 2432.1.21
by Robert Collins Teach Command.get_help_text to show additional help cross references when supplied. | 464 | see_also = set(getattr(self, '_see_also', [])) | 
| 465 | if additional_terms: | |
| 466 | see_also.update(additional_terms) | |
| 467 | return sorted(see_also) | |
| 2425.2.1
by Robert Collins Command objects can now declare related help topics by having _see_also | 468 | |
| 1185.16.43
by Martin Pool - clean up handling of option objects | 469 | def options(self): | 
| 470 | """Return dict of valid options for this command. | |
| 471 | ||
| 472 |         Maps from long option name to option object."""
 | |
| 2768.1.4
by Ian Clatworthy Process --verbose and --quiet standard options | 473 | r = Option.STD_OPTIONS.copy() | 
| 474 | std_names = r.keys() | |
| 1185.16.43
by Martin Pool - clean up handling of option objects | 475 | for o in self.takes_options: | 
| 1857.1.8
by Aaron Bentley Group enum options and add enum options to init and init-repo | 476 | if isinstance(o, basestring): | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 477 | o = option.Option.OPTIONS[o] | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 478 | r[o.name] = o | 
| 2768.1.4
by Ian Clatworthy Process --verbose and --quiet standard options | 479 | if o.name in std_names: | 
| 480 | self.supported_std_options.append(o.name) | |
| 1185.16.43
by Martin Pool - clean up handling of option objects | 481 | return r | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 482 | |
| 1685.1.80
by Wouter van Heyst more code cleanup | 483 | def _setup_outf(self): | 
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 484 | """Return a file linked to stdout, which has proper encoding.""" | 
| 485 |         # Originally I was using self.stdout, but that looks
 | |
| 486 |         # *way* too much like sys.stdout
 | |
| 487 | if self.encoding_type == 'exact': | |
| 2178.4.4
by Alexander Belchenko encoding_type = 'exact' force sys.stdout to be binary stream on win32 | 488 |             # force sys.stdout to be binary stream on win32
 | 
| 489 | if sys.platform == 'win32': | |
| 490 | fileno = getattr(sys.stdout, 'fileno', None) | |
| 491 | if fileno: | |
| 492 | import msvcrt | |
| 493 | msvcrt.setmode(fileno(), os.O_BINARY) | |
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 494 | self.outf = sys.stdout | 
| 495 |             return
 | |
| 496 | ||
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 497 | output_encoding = osutils.get_terminal_encoding() | 
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 498 | |
| 2785.1.2
by bialix at ukr bugfix for #131100 | 499 | self.outf = codecs.getwriter(output_encoding)(sys.stdout, | 
| 2785.1.4
by Alexander Belchenko tweak identation (review from Ian C.) | 500 | errors=self.encoding_type) | 
| 1711.2.40
by John Arbash Meinel codecs.getwriter() doesn't set '.encoding' properly, so do the work for it. | 501 |         # For whatever reason codecs.getwriter() does not advertise its encoding
 | 
| 502 |         # it just returns the encoding of the wrapped file, which is completely
 | |
| 503 |         # bogus. So set the attribute, so we can find the correct encoding later.
 | |
| 504 | self.outf.encoding = output_encoding | |
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 505 | |
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 506 | def run_argv_aliases(self, argv, alias_argv=None): | 
| 507 | """Parse the command line and run with extra aliases in alias_argv.""" | |
| 1857.1.21
by Aaron Bentley Fix bug from cmd_shelf passing Non to run_argv_aliases | 508 | if argv is None: | 
| 2155.2.1
by Marius Kruger * Get command aliases to respect quoted arguments. | 509 | warn("Passing None for [] is deprecated from bzrlib 0.10", | 
| 1857.1.21
by Aaron Bentley Fix bug from cmd_shelf passing Non to run_argv_aliases | 510 | DeprecationWarning, stacklevel=2) | 
| 511 | argv = [] | |
| 1553.6.8
by Erik BÃ¥gfors support for overrides | 512 | args, opts = parse_args(self, argv, alias_argv) | 
| 2768.1.4
by Ian Clatworthy Process --verbose and --quiet standard options | 513 | |
| 514 |         # Process the standard options
 | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 515 | if 'help' in opts: # e.g. bzr add --help | 
| 2432.1.12
by Robert Collins Relocate command help onto Command. | 516 | sys.stdout.write(self.get_help_text()) | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 517 | return 0 | 
| 2768.1.4
by Ian Clatworthy Process --verbose and --quiet standard options | 518 | trace.set_verbosity_level(option._verbosity_level) | 
| 519 | if 'verbose' in self.supported_std_options: | |
| 520 | opts['verbose'] = trace.is_verbose() | |
| 521 | elif opts.has_key('verbose'): | |
| 522 | del opts['verbose'] | |
| 523 | if 'quiet' in self.supported_std_options: | |
| 524 | opts['quiet'] = trace.is_quiet() | |
| 525 | elif opts.has_key('quiet'): | |
| 526 | del opts['quiet'] | |
| 527 | ||
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 528 |         # mix arguments and options into one dictionary
 | 
| 529 | cmdargs = _match_argform(self.name(), self.takes_args, args) | |
| 530 | cmdopts = {} | |
| 531 | for k, v in opts.items(): | |
| 532 | cmdopts[k.replace('-', '_')] = v | |
| 533 | ||
| 534 | all_cmd_args = cmdargs.copy() | |
| 535 | all_cmd_args.update(cmdopts) | |
| 536 | ||
| 1685.1.80
by Wouter van Heyst more code cleanup | 537 | self._setup_outf() | 
| 1185.85.22
by John Arbash Meinel Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() | 538 | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 539 | return self.run(**all_cmd_args) | 
| 3668.2.1
by Vincent Ladeuil Fix bug #263249 by setting valid default _param_name. | 540 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 541 | def run(self): | 
| 542 | """Actually run the command. | |
| 329
by Martin Pool - refactor command functions into command classes | 543 | |
| 544 |         This is invoked with the options and arguments bound to
 | |
| 545 |         keyword parameters.
 | |
| 546 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 547 |         Return 0 or None if the command was successful, or a non-zero
 | 
| 548 |         shell error code if not.  It's OK for this method to allow
 | |
| 549 |         an exception to raise up.
 | |
| 329
by Martin Pool - refactor command functions into command classes | 550 |         """
 | 
| 2155.2.1
by Marius Kruger * Get command aliases to respect quoted arguments. | 551 | raise NotImplementedError('no implementation of command %r' | 
| 1610.1.3
by Martin Pool Better error message for Command.run() not implemented | 552 | % self.name()) | 
| 329
by Martin Pool - refactor command functions into command classes | 553 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 554 | def help(self): | 
| 555 | """Return help message for this class.""" | |
| 1610.1.2
by Martin Pool Move rarely-used import into Command.help() | 556 | from inspect import getdoc | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 557 | if self.__doc__ is Command.__doc__: | 
| 558 | return None | |
| 559 | return getdoc(self) | |
| 560 | ||
| 561 | def name(self): | |
| 562 | return _unsquish_command_name(self.__class__.__name__) | |
| 563 | ||
| 1733.2.5
by Michael Ellerman Show which plugin (if any) provides a command. | 564 | def plugin_name(self): | 
| 565 | """Get the name of the plugin that provides this command. | |
| 566 | ||
| 567 |         :return: The name of the plugin or None if the command is builtin.
 | |
| 568 |         """
 | |
| 569 | mod_parts = self.__module__.split('.') | |
| 570 | if len(mod_parts) >= 3 and mod_parts[1] == 'plugins': | |
| 571 | return mod_parts[2] | |
| 572 | else: | |
| 573 | return None | |
| 574 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 575 | |
| 1553.6.11
by Erik BÃ¥gfors small bugfixes, all tests pass now | 576 | def parse_args(command, argv, alias_argv=None): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 577 | """Parse command line. | 
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 578 |     
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 579 |     Arguments and options are parsed at this level before being passed
 | 
| 580 |     down to specific command handlers.  This routine knows, from a
 | |
| 581 |     lookup table, something about the available options, what optargs
 | |
| 582 |     they take, and which commands will accept them.
 | |
| 583 |     """
 | |
| 1857.1.1
by Aaron Bentley Use optparse for parsing options | 584 |     # TODO: make it a method of the Command?
 | 
| 1857.1.3
by Aaron Bentley Make option adding depend on Option type | 585 | parser = option.get_optparser(command.options()) | 
| 1857.1.1
by Aaron Bentley Use optparse for parsing options | 586 | if alias_argv is not None: | 
| 587 | args = alias_argv + argv | |
| 588 | else: | |
| 589 | args = argv | |
| 683
by Martin Pool - short option stacking patch from John A Meinel | 590 | |
| 1857.1.1
by Aaron Bentley Use optparse for parsing options | 591 | options, args = parser.parse_args(args) | 
| 2155.2.1
by Marius Kruger * Get command aliases to respect quoted arguments. | 592 | opts = dict([(k, v) for k, v in options.__dict__.iteritems() if | 
| 1857.1.3
by Aaron Bentley Make option adding depend on Option type | 593 | v is not option.OptionParser.DEFAULT_VALUE]) | 
| 1
by mbp at sourcefrog import from baz patch-364 | 594 | return args, opts | 
| 595 | ||
| 596 | ||
| 329
by Martin Pool - refactor command functions into command classes | 597 | def _match_argform(cmd, takes_args, args): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 598 | argdict = {} | 
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 599 | |
| 329
by Martin Pool - refactor command functions into command classes | 600 |     # step through args and takes_args, allowing appropriate 0-many matches
 | 
| 601 | for ap in takes_args: | |
| 1
by mbp at sourcefrog import from baz patch-364 | 602 | argname = ap[:-1] | 
| 603 | if ap[-1] == '?': | |
| 62
by mbp at sourcefrog - new find_branch_root function; based on suggestion from aaron | 604 | if args: | 
| 605 | argdict[argname] = args.pop(0) | |
| 196
by mbp at sourcefrog selected-file diff | 606 | elif ap[-1] == '*': # all remaining arguments | 
| 607 | if args: | |
| 608 | argdict[argname + '_list'] = args[:] | |
| 609 | args = [] | |
| 610 | else: | |
| 611 | argdict[argname + '_list'] = None | |
| 1
by mbp at sourcefrog import from baz patch-364 | 612 | elif ap[-1] == '+': | 
| 613 | if not args: | |
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 614 | raise errors.BzrCommandError("command %r needs one or more %s" | 
| 615 | % (cmd, argname.upper())) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 616 | else: | 
| 617 | argdict[argname + '_list'] = args[:] | |
| 618 | args = [] | |
| 160
by mbp at sourcefrog - basic support for moving files to different directories - have not done support for renaming them yet, but should be straightforward - some tests, but many cases are not handled yet i think | 619 | elif ap[-1] == '$': # all but one | 
| 620 | if len(args) < 2: | |
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 621 | raise errors.BzrCommandError("command %r needs one or more %s" | 
| 622 | % (cmd, argname.upper())) | |
| 160
by mbp at sourcefrog - basic support for moving files to different directories - have not done support for renaming them yet, but should be straightforward - some tests, but many cases are not handled yet i think | 623 | argdict[argname + '_list'] = args[:-1] | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 624 | args[:-1] = [] | 
| 1
by mbp at sourcefrog import from baz patch-364 | 625 | else: | 
| 626 |             # just a plain arg
 | |
| 627 | argname = ap | |
| 628 | if not args: | |
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 629 | raise errors.BzrCommandError("command %r requires argument %s" | 
| 630 | % (cmd, argname.upper())) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 631 | else: | 
| 632 | argdict[argname] = args.pop(0) | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 633 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 634 | if args: | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 635 | raise errors.BzrCommandError("extra argument to command %s: %s" | 
| 636 | % (cmd, args[0])) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 637 | |
| 638 | return argdict | |
| 639 | ||
| 3169.3.1
by Andrew Bennetts Make --coverage a global option. | 640 | def apply_coveraged(dirname, the_callable, *args, **kwargs): | 
| 641 |     # Cannot use "import trace", as that would import bzrlib.trace instead of
 | |
| 642 |     # the standard library's trace.
 | |
| 643 | trace = __import__('trace') | |
| 644 | ||
| 645 | tracer = trace.Trace(count=1, trace=0) | |
| 646 | sys.settrace(tracer.globaltrace) | |
| 647 | ||
| 648 | ret = the_callable(*args, **kwargs) | |
| 649 | ||
| 650 | sys.settrace(None) | |
| 651 | results = tracer.results() | |
| 652 | results.write_results(show_missing=1, summary=False, | |
| 653 | coverdir=dirname) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 654 | |
| 655 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 656 | def apply_profiled(the_callable, *args, **kwargs): | 
| 657 | import hotshot | |
| 658 | import tempfile | |
| 1393.1.27
by Martin Pool - clean up profile code and change default sort order | 659 | import hotshot.stats | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 660 | pffileno, pfname = tempfile.mkstemp() | 
| 661 | try: | |
| 662 | prof = hotshot.Profile(pfname) | |
| 663 | try: | |
| 664 | ret = prof.runcall(the_callable, *args, **kwargs) or 0 | |
| 665 | finally: | |
| 666 | prof.close() | |
| 667 | stats = hotshot.stats.load(pfname) | |
| 1393.1.27
by Martin Pool - clean up profile code and change default sort order | 668 | stats.strip_dirs() | 
| 669 | stats.sort_stats('cum') # 'time' | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 670 |         ## XXX: Might like to write to stderr or the trace file instead but
 | 
| 671 |         ## print_stats seems hardcoded to stdout
 | |
| 672 | stats.print_stats(20) | |
| 673 | return ret | |
| 674 | finally: | |
| 675 | os.close(pffileno) | |
| 676 | os.remove(pfname) | |
| 677 | ||
| 678 | ||
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 679 | def apply_lsprofiled(filename, the_callable, *args, **kwargs): | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 680 | from bzrlib.lsprof import profile | 
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 681 | ret, stats = profile(the_callable, *args, **kwargs) | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 682 | stats.sort() | 
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 683 | if filename is None: | 
| 684 | stats.pprint() | |
| 685 | else: | |
| 2654.2.2
by Ian Clatworthy Put all format detection stuff in one spot as requested by John Arbash Meinel | 686 | stats.save(filename) | 
| 1551.15.30
by Aaron Bentley Write lsprof file name to stderr, not stdout | 687 | trace.note('Profile data written to "%s".', filename) | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 688 | return ret | 
| 689 | ||
| 1553.6.9
by Erik BÃ¥gfors PEP8-ify | 690 | |
| 3123.6.2
by Aaron Bentley Implement diff --using natively | 691 | def shlex_split_unicode(unsplit): | 
| 692 | import shlex | |
| 693 | return [u.decode('utf-8') for u in shlex.split(unsplit.encode('utf-8'))] | |
| 694 | ||
| 695 | ||
| 2155.2.1
by Marius Kruger * Get command aliases to respect quoted arguments. | 696 | def get_alias(cmd, config=None): | 
| 697 | """Return an expanded alias, or None if no alias exists. | |
| 698 | ||
| 699 |     cmd
 | |
| 700 |         Command to be checked for an alias.
 | |
| 701 |     config
 | |
| 702 |         Used to specify an alternative config to use,
 | |
| 2155.2.3
by Marius Kruger * commands.py | 703 |         which is especially useful for testing.
 | 
| 2155.2.1
by Marius Kruger * Get command aliases to respect quoted arguments. | 704 |         If it is unspecified, the global config will be used.
 | 
| 705 |     """
 | |
| 706 | if config is None: | |
| 707 | import bzrlib.config | |
| 708 | config = bzrlib.config.GlobalConfig() | |
| 709 | alias = config.get_alias(cmd) | |
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 710 | if (alias): | 
| 3123.6.3
by Aaron Bentley Fix typo | 711 | return shlex_split_unicode(alias) | 
| 1553.6.8
by Erik BÃ¥gfors support for overrides | 712 | return None | 
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 713 | |
| 1553.6.9
by Erik BÃ¥gfors PEP8-ify | 714 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 715 | def run_bzr(argv): | 
| 716 | """Execute a command. | |
| 717 | ||
| 973
by Martin Pool - various refactorings of command interpreter | 718 |     argv
 | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 719 |        The command-line arguments, without the program name from argv[0]
 | 
| 1185.85.4
by John Arbash Meinel currently broken, trying to fix things up. | 720 |        These should already be decoded. All library/test code calling
 | 
| 721 |        run_bzr should be passing valid strings (don't need decoding).
 | |
| 2172.1.1
by Aaron Bentley Merge shell-like quote handling for aliases | 722 |     
 | 
| 973
by Martin Pool - various refactorings of command interpreter | 723 |     Returns a command status or raises an exception.
 | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 724 | |
| 725 |     Special master options: these must come before the command because
 | |
| 726 |     they control how the command is interpreted.
 | |
| 727 | ||
| 728 |     --no-plugins
 | |
| 729 |         Do not load plugin modules at all
 | |
| 730 | ||
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 731 |     --no-aliases
 | 
| 732 |         Do not allow aliases
 | |
| 733 | ||
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 734 |     --builtin
 | 
| 735 |         Only use builtin commands.  (Plugins are still allowed to change
 | |
| 736 |         other behaviour.)
 | |
| 737 | ||
| 738 |     --profile
 | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 739 |         Run under the Python hotshot profiler.
 | 
| 740 | ||
| 741 |     --lsprof
 | |
| 742 |         Run under the Python lsprof profiler.
 | |
| 3169.3.1
by Andrew Bennetts Make --coverage a global option. | 743 | |
| 744 |     --coverage
 | |
| 745 |         Generate line coverage report in the specified directory.
 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 746 |     """
 | 
| 1185.85.4
by John Arbash Meinel currently broken, trying to fix things up. | 747 | argv = list(argv) | 
| 2127.5.1
by mbp at sourcefrog record command-line arguments in .bzr.log, drop some mutter statements | 748 | trace.mutter("bzr arguments: %r", argv) | 
| 907.1.21
by John Arbash Meinel Adding http transport as a valid transport protocol. | 749 | |
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 750 | opt_lsprof = opt_profile = opt_no_plugins = opt_builtin = \ | 
| 751 | opt_no_aliases = False | |
| 3169.3.1
by Andrew Bennetts Make --coverage a global option. | 752 | opt_lsprof_file = opt_coverage_dir = None | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 753 | |
| 754 |     # --no-plugins is handled specially at a very early stage. We need
 | |
| 755 |     # to load plugins before doing other command parsing so that they
 | |
| 756 |     # can override commands, but this needs to happen first.
 | |
| 757 | ||
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 758 | argv_copy = [] | 
| 759 | i = 0 | |
| 760 | while i < len(argv): | |
| 761 | a = argv[i] | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 762 | if a == '--profile': | 
| 763 | opt_profile = True | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 764 | elif a == '--lsprof': | 
| 765 | opt_lsprof = True | |
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 766 | elif a == '--lsprof-file': | 
| 1706.2.6
by Robey Pointer when giving --lsprof-file, assume --lsprof | 767 | opt_lsprof = True | 
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 768 | opt_lsprof_file = argv[i + 1] | 
| 769 | i += 1 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 770 | elif a == '--no-plugins': | 
| 771 | opt_no_plugins = True | |
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 772 | elif a == '--no-aliases': | 
| 773 | opt_no_aliases = True | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 774 | elif a == '--builtin': | 
| 775 | opt_builtin = True | |
| 3169.3.1
by Andrew Bennetts Make --coverage a global option. | 776 | elif a == '--coverage': | 
| 777 | opt_coverage_dir = argv[i + 1] | |
| 778 | i += 1 | |
| 2095.5.1
by Martin Pool Add new -Derror global option to always display tracebacks | 779 | elif a.startswith('-D'): | 
| 2095.5.2
by Martin Pool save commit message if commit fails (#32054) | 780 | debug.debug_flags.add(a[2:]) | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 781 | else: | 
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 782 | argv_copy.append(a) | 
| 783 | i += 1 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 784 | |
| 1553.7.1
by Robey Pointer add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) | 785 | argv = argv_copy | 
| 1616.1.15
by Martin Pool Handle 'bzr ?', etc. | 786 | if (not argv): | 
| 787 | from bzrlib.builtins import cmd_help | |
| 1558.14.2
by Aaron Bentley Removed deprecation warning when bzr invoked with no arguments | 788 | cmd_help().run_argv_aliases([]) | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 789 | return 0 | 
| 790 | ||
| 791 | if argv[0] == '--version': | |
| 2785.1.2
by bialix at ukr bugfix for #131100 | 792 | from bzrlib.builtins import cmd_version | 
| 793 | cmd_version().run_argv_aliases([]) | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 794 | return 0 | 
| 3755.1.1
by Vincent Ladeuil Fix --verbose leaking into blackbox tests. | 795 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 796 | if not opt_no_plugins: | 
| 973
by Martin Pool - various refactorings of command interpreter | 797 | from bzrlib.plugin import load_plugins | 
| 798 | load_plugins() | |
| 1551.3.11
by Aaron Bentley Merge from Robert | 799 | else: | 
| 800 | from bzrlib.plugin import disable_plugins | |
| 801 | disable_plugins() | |
| 973
by Martin Pool - various refactorings of command interpreter | 802 | |
| 1553.6.17
by Erik BÃ¥gfors fix for broken --no-aliases | 803 | alias_argv = None | 
| 804 | ||
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 805 | if not opt_no_aliases: | 
| 1553.6.8
by Erik BÃ¥gfors support for overrides | 806 | alias_argv = get_alias(argv[0]) | 
| 807 | if alias_argv: | |
| 3224.5.1
by Andrew Bennetts Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop. | 808 | user_encoding = osutils.get_user_encoding() | 
| 809 | alias_argv = [a.decode(user_encoding) for a in alias_argv] | |
| 1553.6.8
by Erik BÃ¥gfors support for overrides | 810 | argv[0] = alias_argv.pop(0) | 
| 1553.6.1
by Erik BÃ¥gfors support for aliases in bazaar.conf | 811 | |
| 1948.1.1
by John Arbash Meinel Raise a reasonable error when a command is non-ascii | 812 | cmd = argv.pop(0) | 
| 1948.1.10
by John Arbash Meinel Simplify changes to command.py | 813 |     # We want only 'ascii' command names, but the user may have typed
 | 
| 814 |     # in a Unicode name. In that case, they should just get a
 | |
| 815 |     # 'command not found' error later.
 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 816 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 817 | cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin) | 
| 2367.2.1
by Robert Collins Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins) | 818 | run = cmd_obj.run_argv_aliases | 
| 819 | run_argv = [argv, alias_argv] | |
| 1534.7.154
by Aaron Bentley Removed changes from bzr.ab 1529..1536 | 820 | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 821 | try: | 
| 3755.1.1
by Vincent Ladeuil Fix --verbose leaking into blackbox tests. | 822 |         # We can be called recursively (tests for example), but we don't want
 | 
| 823 |         # the verbosity level to propagate.
 | |
| 824 | saved_verbosity_level = option._verbosity_level | |
| 825 | option._verbosity_level = 0 | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 826 | if opt_lsprof: | 
| 3169.3.4
by Andrew Bennetts Warn if --coverage is used with a conflicting global option. | 827 | if opt_coverage_dir: | 
| 828 | trace.warning( | |
| 829 | '--coverage ignored, because --lsprof is in use.') | |
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 830 | ret = apply_lsprofiled(opt_lsprof_file, run, *run_argv) | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 831 | elif opt_profile: | 
| 3169.3.4
by Andrew Bennetts Warn if --coverage is used with a conflicting global option. | 832 | if opt_coverage_dir: | 
| 833 | trace.warning( | |
| 834 | '--coverage ignored, because --profile is in use.') | |
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 835 | ret = apply_profiled(run, *run_argv) | 
| 3169.3.1
by Andrew Bennetts Make --coverage a global option. | 836 | elif opt_coverage_dir: | 
| 837 | ret = apply_coveraged(opt_coverage_dir, run, *run_argv) | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 838 | else: | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 839 | ret = run(*run_argv) | 
| 3698.1.4
by John Arbash Meinel Restore the 'if memory in debug.debug_flags' check for commands.py | 840 | if 'memory' in debug.debug_flags: | 
| 841 | trace.debug_memory('Process status after command:', short=False) | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 842 | return ret or 0 | 
| 843 | finally: | |
| 3755.1.1
by Vincent Ladeuil Fix --verbose leaking into blackbox tests. | 844 |         # reset, in case we may do other commands later within the same
 | 
| 845 |         # process. Commands that want to execute sub-commands must propagate
 | |
| 846 |         # --verbose in their own way.
 | |
| 847 | option._verbosity_level = saved_verbosity_level | |
| 267
by Martin Pool - better reporting of errors | 848 | |
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 849 | def display_command(func): | 
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 850 | """Decorator that suppresses pipe/interrupt errors.""" | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 851 | def ignore_pipe(*args, **kwargs): | 
| 852 | try: | |
| 1185.35.22
by Aaron Bentley Handled more pipe errors for display commands. | 853 | result = func(*args, **kwargs) | 
| 854 | sys.stdout.flush() | |
| 855 | return result | |
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 856 | except IOError, e: | 
| 1963.2.6
by Robey Pointer pychecker is on crack; go back to using 'is None'. | 857 | if getattr(e, 'errno', None) is None: | 
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 858 |                 raise
 | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 859 | if e.errno != errno.EPIPE: | 
| 1711.4.31
by John Arbash Meinel Catch proper error instead of EPIPE on win32, also don't double flush | 860 |                 # Win32 raises IOError with errno=0 on a broken pipe
 | 
| 2304.2.1
by Alexander Belchenko Suppress IOError with errno=22 (Invalid argument) on win32 when pipe is broken | 861 | if sys.platform != 'win32' or (e.errno not in (0, errno.EINVAL)): | 
| 1711.4.31
by John Arbash Meinel Catch proper error instead of EPIPE on win32, also don't double flush | 862 |                     raise
 | 
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 863 |             pass
 | 
| 1185.12.69
by Aaron Bentley Ignored ^C in display commands | 864 | except KeyboardInterrupt: | 
| 1490
by Robert Collins Implement a 'bzr push' command, with saved locations; update diff to return 1. | 865 |             pass
 | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 866 | return ignore_pipe | 
| 267
by Martin Pool - better reporting of errors | 867 | |
| 1185.43.6
by Martin Pool Enable logging early enough to save argv | 868 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 869 | def main(argv): | 
| 1104
by Martin Pool - Add a simple UIFactory | 870 | import bzrlib.ui | 
| 1185.49.21
by John Arbash Meinel Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms. | 871 | from bzrlib.ui.text import TextUIFactory | 
| 872 | bzrlib.ui.ui_factory = TextUIFactory() | |
| 3755.1.1
by Vincent Ladeuil Fix --verbose leaking into blackbox tests. | 873 | |
| 3427.5.1
by John Arbash Meinel Have the bzrlib.commands.main() function suppress deprecation warnings when running a final release. | 874 |     # Is this a final release version? If so, we should suppress warnings
 | 
| 875 | if bzrlib.version_info[3] == 'final': | |
| 876 | from bzrlib import symbol_versioning | |
| 3427.5.7
by John Arbash Meinel Bring back always in the form of 'override'. | 877 | symbol_versioning.suppress_deprecation_warnings(override=False) | 
| 2625.9.1
by Daniel Watkins Fixed command-line commit message to die cleanly if a UnicodeDecodeError is thrown. | 878 | try: | 
| 3224.5.1
by Andrew Bennetts Lots of assorted hackery to reduce the number of imports for common operations. Improves 'rocks', 'st' and 'help' times by ~50ms on my laptop. | 879 | user_encoding = osutils.get_user_encoding() | 
| 880 | argv = [a.decode(user_encoding) for a in argv[1:]] | |
| 2625.9.1
by Daniel Watkins Fixed command-line commit message to die cleanly if a UnicodeDecodeError is thrown. | 881 | except UnicodeDecodeError: | 
| 2625.9.8
by Daniel Watkins Updated as per poolie's !tweak. | 882 | raise errors.BzrError(("Parameter '%r' is unsupported by the current " | 
| 2625.9.1
by Daniel Watkins Fixed command-line commit message to die cleanly if a UnicodeDecodeError is thrown. | 883 | "encoding." % a)) | 
| 1185.85.4
by John Arbash Meinel currently broken, trying to fix things up. | 884 | ret = run_bzr_catch_errors(argv) | 
| 1996.3.1
by John Arbash Meinel Demandloading builtins.py drops our load time from 350ms to 291ms | 885 | trace.mutter("return code %d", ret) | 
| 1185.43.6
by Martin Pool Enable logging early enough to save argv | 886 | return ret | 
| 1185.3.19
by Martin Pool - split out commandline error reporting for ease of testing | 887 | |
| 888 | ||
| 889 | def run_bzr_catch_errors(argv): | |
| 2805.7.1
by Ian Clatworthy Dump profiling data even when exceptions are encountered | 890 |     # Note: The except clause logic below should be kept in sync with the
 | 
| 891 |     # profile() routine in lsprof.py.
 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 892 | try: | 
| 2548.1.1
by Aaron Bentley Don't suppress pipe errors for non-display commaneds (Belchenko, #87178) | 893 | return run_bzr(argv) | 
| 2027.2.3
by Marien Zwart Fix another python 2.5 issue. | 894 | except (KeyboardInterrupt, Exception), e: | 
| 1185.33.19
by Martin Pool Run postmortem debugger if BZR_PDB is set | 895 |         # used to handle AssertionError and KeyboardInterrupt
 | 
| 896 |         # specially here, but hopefully they're handled ok by the logger now
 | |
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 897 | exitcode = trace.report_exception(sys.exc_info(), sys.stderr) | 
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 898 | if os.environ.get('BZR_PDB'): | 
| 899 | print '**** entering debugger' | |
| 900 | import pdb | |
| 901 | pdb.post_mortem(sys.exc_traceback) | |
| 2713.2.1
by Martin Pool Return exitcode 4 if an internal error occurs | 902 | return exitcode | 
| 1
by mbp at sourcefrog import from baz patch-364 | 903 | |
| 2432.1.2
by Robert Collins Add a HelpCommandContext class for help from commands. | 904 | |
| 2830.2.1
by Martin Pool If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite | 905 | def run_bzr_catch_user_errors(argv): | 
| 906 | """Run bzr and report user errors, but let internal errors propagate. | |
| 907 | ||
| 908 |     This is used for the test suite, and might be useful for other programs
 | |
| 909 |     that want to wrap the commandline interface.
 | |
| 910 |     """
 | |
| 911 | try: | |
| 912 | return run_bzr(argv) | |
| 913 | except Exception, e: | |
| 914 | if (isinstance(e, (OSError, IOError)) | |
| 915 | or not getattr(e, 'internal_error', True)): | |
| 916 | trace.report_exception(sys.exc_info(), sys.stderr) | |
| 917 | return 3 | |
| 918 | else: | |
| 919 |             raise
 | |
| 920 | ||
| 921 | ||
| 2432.1.15
by Robert Collins Rename Context (in bzrlib.help) to Index, for a clearer name. | 922 | class HelpCommandIndex(object): | 
| 923 | """A index for bzr help that returns commands.""" | |
| 2432.1.2
by Robert Collins Add a HelpCommandContext class for help from commands. | 924 | |
| 2432.1.17
by Robert Collins Add prefixes to HelpIndexes. | 925 | def __init__(self): | 
| 926 | self.prefix = 'commands/' | |
| 927 | ||
| 2432.1.13
by Robert Collins HelpCommandContext now implementes get_topics. | 928 | def get_topics(self, topic): | 
| 929 | """Search for topic amongst commands. | |
| 930 | ||
| 931 |         :param topic: A topic to search for.
 | |
| 932 |         :return: A list which is either empty or contains a single
 | |
| 933 |             Command entry.
 | |
| 934 |         """
 | |
| 2432.1.18
by Robert Collins Add support for doing bzr help commands/COMMANDNAME. | 935 | if topic and topic.startswith(self.prefix): | 
| 936 | topic = topic[len(self.prefix):] | |
| 2432.1.13
by Robert Collins HelpCommandContext now implementes get_topics. | 937 | try: | 
| 938 | cmd = _get_cmd_object(topic) | |
| 939 | except KeyError: | |
| 940 | return [] | |
| 941 | else: | |
| 942 | return [cmd] | |
| 943 | ||
| 2432.1.2
by Robert Collins Add a HelpCommandContext class for help from commands. | 944 | |
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 945 | class Provider(object): | 
| 3246.7.3
by Martin Albisetti Code cleanup and documentation | 946 | '''Generic class to be overriden by plugins''' | 
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 947 | |
| 948 | def plugin_for_command(self, cmd_name): | |
| 3246.7.3
by Martin Albisetti Code cleanup and documentation | 949 | '''Takes a command and returns the information for that plugin | 
| 950 |         
 | |
| 951 |         :return: A dictionary with all the available information 
 | |
| 952 |         for the requested plugin
 | |
| 953 |         '''
 | |
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 954 | raise NotImplementedError | 
| 955 | ||
| 956 | ||
| 957 | class ProvidersRegistry(registry.Registry): | |
| 958 | '''This registry exists to allow other providers to exist''' | |
| 3246.7.3
by Martin Albisetti Code cleanup and documentation | 959 | |
| 3246.7.1
by Martin Albisetti Core code for automatic plugin suggestion | 960 | def __iter__(self): | 
| 961 | for key, provider in self.iteritems(): | |
| 962 | yield provider | |
| 963 | ||
| 964 | command_providers_registry = ProvidersRegistry() | |
| 965 | ||
| 966 | ||
| 1
by mbp at sourcefrog import from baz patch-364 | 967 | if __name__ == '__main__': | 
| 968 | sys.exit(main(sys.argv)) |