bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1610.1.4
by Martin Pool Doc | 1 | # Copyright (C) 2006 by Canonical Ltd
 | 
| 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 | ||
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 31 | import sys | 
| 32 | import os | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 33 | from warnings import warn | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 34 | import errno | 
| 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() | 35 | import codecs | 
| 1
by mbp at sourcefrog import from baz patch-364 | 36 | |
| 37 | import bzrlib | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 38 | import bzrlib.errors as errors | 
| 1616.1.15
by Martin Pool Handle 'bzr ?', etc. | 39 | from bzrlib.errors import (BzrError, | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 40 | BzrCommandError, | 
| 1495
by Robert Collins Add a --create-prefix to the new push command. | 41 | BzrCheckError, | 
| 1534.7.154
by Aaron Bentley Removed changes from bzr.ab 1529..1536 | 42 | NotBranchError) | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 43 | from bzrlib.option import Option | 
| 1711.4.10
by John Arbash Meinel Pull out sys.stdout.encoding handling into a separate function so it can be tested, and used elsewhere. | 44 | import bzrlib.osutils | 
| 1185.11.5
by John Arbash Meinel Merged up-to-date against mainline, still broken. | 45 | from bzrlib.revisionspec import RevisionSpec | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 46 | from bzrlib.symbol_versioning import (deprecated_method, zero_eight) | 
| 1852.2.1
by Robert Collins General cleanups - status, add a status test with two revision trees, and commands.py importing of bzrlib.trace. | 47 | import bzrlib.trace | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 48 | from bzrlib.trace import mutter, note, log_error, warning, be_quiet | 
| 1
by mbp at sourcefrog import from baz patch-364 | 49 | |
| 731
by Martin Pool - merge plugin patch from john | 50 | plugin_cmds = {} | 
| 51 | ||
| 52 | ||
| 1492
by Robert Collins Support decoration of commands. | 53 | def register_command(cmd, decorate=False): | 
| 1616.1.6
by Martin Pool doc | 54 | """Utility function to help register a command | 
| 55 | ||
| 56 |     :param cmd: Command subclass to register
 | |
| 57 |     :param decorate: If true, allow overriding an existing command
 | |
| 58 |         of the same name; the old command is returned by this function.
 | |
| 59 |         Otherwise it is an error to try to override an existing command.
 | |
| 60 |     """
 | |
| 731
by Martin Pool - merge plugin patch from john | 61 | global plugin_cmds | 
| 62 | k = cmd.__name__ | |
| 63 | if k.startswith("cmd_"): | |
| 64 | k_unsquished = _unsquish_command_name(k) | |
| 65 | else: | |
| 66 | k_unsquished = k | |
| 67 | if not plugin_cmds.has_key(k_unsquished): | |
| 68 | plugin_cmds[k_unsquished] = cmd | |
| 1616.1.6
by Martin Pool doc | 69 | mutter('registered plugin command %s', k_unsquished) | 
| 1492
by Robert Collins Support decoration of commands. | 70 | if decorate and k_unsquished in builtin_command_names(): | 
| 71 | return _builtin_commands()[k_unsquished] | |
| 72 | elif decorate: | |
| 73 | result = plugin_cmds[k_unsquished] | |
| 74 | plugin_cmds[k_unsquished] = cmd | |
| 75 | return result | |
| 731
by Martin Pool - merge plugin patch from john | 76 | else: | 
| 77 | log_error('Two plugins defined the same command: %r' % k) | |
| 78 | log_error('Not loading the one in %r' % sys.modules[cmd.__module__]) | |
| 79 | ||
| 80 | ||
| 350
by Martin Pool - refactor command aliases into command classes | 81 | def _squish_command_name(cmd): | 
| 82 | return 'cmd_' + cmd.replace('-', '_') | |
| 83 | ||
| 84 | ||
| 85 | def _unsquish_command_name(cmd): | |
| 86 | assert cmd.startswith("cmd_") | |
| 87 | return cmd[4:].replace('_','-') | |
| 88 | ||
| 914
by Martin Pool - fix up breakage of 'bzr log -v' by root_id patch | 89 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 90 | def _builtin_commands(): | 
| 1147
by Martin Pool - split builtin commands into separate module bzrlib.builtins; | 91 | import bzrlib.builtins | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 92 | r = {} | 
| 1147
by Martin Pool - split builtin commands into separate module bzrlib.builtins; | 93 | builtins = bzrlib.builtins.__dict__ | 
| 94 | for name in builtins: | |
| 95 | if name.startswith("cmd_"): | |
| 1616.1.6
by Martin Pool doc | 96 | real_name = _unsquish_command_name(name) | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 97 | r[real_name] = builtins[name] | 
| 98 | return r | |
| 99 | ||
| 100 | ||
| 101 | def builtin_command_names(): | |
| 102 | """Return list of builtin command names.""" | |
| 103 | return _builtin_commands().keys() | |
| 104 | ||
| 105 | ||
| 106 | def plugin_command_names(): | |
| 107 | return plugin_cmds.keys() | |
| 108 | ||
| 109 | ||
| 110 | def _get_cmd_dict(plugins_override=True): | |
| 111 | """Return name->class mapping for all commands.""" | |
| 112 | d = _builtin_commands() | |
| 731
by Martin Pool - merge plugin patch from john | 113 | if plugins_override: | 
| 114 | d.update(plugin_cmds) | |
| 641
by Martin Pool - improved external-command patch from john | 115 | return d | 
| 731
by Martin Pool - merge plugin patch from john | 116 | |
| 641
by Martin Pool - improved external-command patch from john | 117 | |
| 731
by Martin Pool - merge plugin patch from john | 118 | def get_all_cmds(plugins_override=True): | 
| 641
by Martin Pool - improved external-command patch from john | 119 | """Return canonical name and class for all registered commands.""" | 
| 731
by Martin Pool - merge plugin patch from john | 120 | for k, v in _get_cmd_dict(plugins_override=plugins_override).iteritems(): | 
| 641
by Martin Pool - improved external-command patch from john | 121 | yield k,v | 
| 122 | ||
| 123 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 124 | def get_cmd_object(cmd_name, plugins_override=True): | 
| 350
by Martin Pool - refactor command aliases into command classes | 125 | """Return the canonical name and command class for a command. | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 126 | |
| 127 |     plugins_override
 | |
| 128 |         If true, plugin commands can override builtins.
 | |
| 350
by Martin Pool - refactor command aliases into command classes | 129 |     """
 | 
| 1163
by Martin Pool - split ExternalCommand class into its own file | 130 | from bzrlib.externalcommand import ExternalCommand | 
| 131 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 132 | cmd_name = str(cmd_name) # not unicode | 
| 350
by Martin Pool - refactor command aliases into command classes | 133 | |
| 134 |     # first look up this command under the specified name
 | |
| 731
by Martin Pool - merge plugin patch from john | 135 | cmds = _get_cmd_dict(plugins_override=plugins_override) | 
| 272
by Martin Pool - Add command aliases | 136 | try: | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 137 | return cmds[cmd_name]() | 
| 272
by Martin Pool - Add command aliases | 138 | except KeyError: | 
| 350
by Martin Pool - refactor command aliases into command classes | 139 |         pass
 | 
| 140 | ||
| 141 |     # look for any command which claims this as an alias
 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 142 | for real_cmd_name, cmd_class in cmds.iteritems(): | 
| 143 | if cmd_name in cmd_class.aliases: | |
| 144 | return cmd_class() | |
| 145 | ||
| 146 | cmd_obj = ExternalCommand.find_command(cmd_name) | |
| 147 | if cmd_obj: | |
| 148 | return cmd_obj | |
| 149 | ||
| 1740.5.6
by Martin Pool Clean up many exception classes. | 150 | raise BzrCommandError('unknown command "%s"' % cmd_name) | 
| 272
by Martin Pool - Add command aliases | 151 | |
| 329
by Martin Pool - refactor command functions into command classes | 152 | |
| 558
by Martin Pool - All top-level classes inherit from object | 153 | class Command(object): | 
| 329
by Martin Pool - refactor command functions into command classes | 154 | """Base class for commands. | 
| 155 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 156 |     Commands are the heart of the command-line bzr interface.
 | 
| 157 | ||
| 158 |     The command object mostly handles the mapping of command-line
 | |
| 159 |     parameters into one or more bzrlib operations, and of the results
 | |
| 160 |     into textual output.
 | |
| 161 | ||
| 162 |     Commands normally don't have any state.  All their arguments are
 | |
| 163 |     passed in to the run method.  (Subclasses may take a different
 | |
| 164 |     policy if the behaviour of the instance needs to depend on e.g. a
 | |
| 165 |     shell plugin and not just its Python class.)
 | |
| 166 | ||
| 329
by Martin Pool - refactor command functions into command classes | 167 |     The docstring for an actual command should give a single-line
 | 
| 168 |     summary, then a complete description of the command.  A grammar
 | |
| 169 |     description will be inserted.
 | |
| 170 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 171 |     aliases
 | 
| 172 |         Other accepted names for this command.
 | |
| 173 | ||
| 329
by Martin Pool - refactor command functions into command classes | 174 |     takes_args
 | 
| 175 |         List of argument forms, marked with whether they are optional,
 | |
| 176 |         repeated, etc.
 | |
| 177 | ||
| 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. | 178 |                 Examples:
 | 
| 179 | ||
| 180 |                 ['to_location', 'from_branch?', 'file*']
 | |
| 181 | ||
| 182 |                 'to_location' is required
 | |
| 183 |                 'from_branch' is optional
 | |
| 184 |                 'file' can be specified 0 or more times
 | |
| 1185.37.4
by Jamie Wilkinson add some examples to the documentation for Command.takes_args | 185 | |
| 329
by Martin Pool - refactor command functions into command classes | 186 |     takes_options
 | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 187 |         List of options that may be given for this command.  These can
 | 
| 188 |         be either strings, referring to globally-defined options,
 | |
| 189 |         or option objects.  Retrieve through options().
 | |
| 329
by Martin Pool - refactor command functions into command classes | 190 | |
| 191 |     hidden
 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 192 |         If true, this command isn't advertised.  This is typically
 | 
| 193 |         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() | 194 | |
| 195 |     encoding_type
 | |
| 196 |         Command objects will get a 'outf' attribute, which has been
 | |
| 197 |         setup to properly handle encoding of unicode strings.
 | |
| 198 |         encoding_type determines what will happen when characters cannot
 | |
| 199 |         be encoded
 | |
| 200 |             strict - abort if we cannot decode
 | |
| 201 |             replace - put in a bogus character (typically '?')
 | |
| 202 |             exact - do not encode sys.stdout
 | |
| 203 | ||
| 329
by Martin Pool - refactor command functions into command classes | 204 |     """
 | 
| 205 | aliases = [] | |
| 206 | takes_args = [] | |
| 207 | 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() | 208 | encoding_type = 'strict' | 
| 329
by Martin Pool - refactor command functions into command classes | 209 | |
| 210 | hidden = False | |
| 211 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 212 | def __init__(self): | 
| 213 | """Construct an instance of this command.""" | |
| 973
by Martin Pool - various refactorings of command interpreter | 214 | if self.__doc__ == Command.__doc__: | 
| 215 | warn("No help message set for %r" % self) | |
| 329
by Martin Pool - refactor command functions into command classes | 216 | |
| 1185.16.43
by Martin Pool - clean up handling of option objects | 217 | def options(self): | 
| 218 | """Return dict of valid options for this command. | |
| 219 | ||
| 220 |         Maps from long option name to option object."""
 | |
| 221 | r = dict() | |
| 1185.16.48
by mbp at sourcefrog - more refactoring of and tests for option parsing | 222 | r['help'] = Option.OPTIONS['help'] | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 223 | for o in self.takes_options: | 
| 224 | if not isinstance(o, Option): | |
| 225 | o = Option.OPTIONS[o] | |
| 226 | r[o.name] = o | |
| 227 | return r | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 228 | |
| 1685.1.80
by Wouter van Heyst more code cleanup | 229 | 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() | 230 | """Return a file linked to stdout, which has proper encoding.""" | 
| 231 | assert self.encoding_type in ['strict', 'exact', 'replace'] | |
| 232 | ||
| 233 |         # Originally I was using self.stdout, but that looks
 | |
| 234 |         # *way* too much like sys.stdout
 | |
| 235 | if self.encoding_type == 'exact': | |
| 236 | self.outf = sys.stdout | |
| 237 |             return
 | |
| 238 | ||
| 1711.4.10
by John Arbash Meinel Pull out sys.stdout.encoding handling into a separate function so it can be tested, and used elsewhere. | 239 | output_encoding = bzrlib.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() | 240 | |
| 241 |         # use 'replace' so that we don't abort if trying to write out
 | |
| 242 |         # in e.g. the default C locale.
 | |
| 243 | self.outf = codecs.getwriter(output_encoding)(sys.stdout, errors=self.encoding_type) | |
| 1711.2.40
by John Arbash Meinel codecs.getwriter() doesn't set '.encoding' properly, so do the work for it. | 244 |         # For whatever reason codecs.getwriter() does not advertise its encoding
 | 
| 245 |         # it just returns the encoding of the wrapped file, which is completely
 | |
| 246 |         # bogus. So set the attribute, so we can find the correct encoding later.
 | |
| 247 | 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() | 248 | |
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 249 | @deprecated_method(zero_eight) | 
| 250 | def run_argv(self, argv): | |
| 251 | """Parse command line and run. | |
| 252 |         
 | |
| 253 |         See run_argv_aliases for the 0.8 and beyond api.
 | |
| 254 |         """
 | |
| 255 | return self.run_argv_aliases(argv) | |
| 256 | ||
| 257 | def run_argv_aliases(self, argv, alias_argv=None): | |
| 258 | """Parse the command line and run with extra aliases in alias_argv.""" | |
| 1553.6.8
by Erik Bågfors support for overrides | 259 | args, opts = parse_args(self, argv, alias_argv) | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 260 | if 'help' in opts: # e.g. bzr add --help | 
| 261 | from bzrlib.help import help_on_command | |
| 262 | help_on_command(self.name()) | |
| 263 | return 0 | |
| 1185.16.48
by mbp at sourcefrog - more refactoring of and tests for option parsing | 264 |         # XXX: This should be handled by the parser
 | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 265 | allowed_names = self.options().keys() | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 266 | for oname in opts: | 
| 1185.16.43
by Martin Pool - clean up handling of option objects | 267 | if oname not in allowed_names: | 
| 1740.5.8
by Martin Pool Review cleanups: better error reporting, put back report_exception. | 268 | raise BzrOptionError("option '--%s' is not allowed for" | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 269 | " command %r" % (oname, self.name())) | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 270 |         # mix arguments and options into one dictionary
 | 
| 271 | cmdargs = _match_argform(self.name(), self.takes_args, args) | |
| 272 | cmdopts = {} | |
| 273 | for k, v in opts.items(): | |
| 274 | cmdopts[k.replace('-', '_')] = v | |
| 275 | ||
| 276 | all_cmd_args = cmdargs.copy() | |
| 277 | all_cmd_args.update(cmdopts) | |
| 278 | ||
| 1685.1.80
by Wouter van Heyst more code cleanup | 279 | 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() | 280 | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 281 | return self.run(**all_cmd_args) | 
| 329
by Martin Pool - refactor command functions into command classes | 282 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 283 | def run(self): | 
| 284 | """Actually run the command. | |
| 329
by Martin Pool - refactor command functions into command classes | 285 | |
| 286 |         This is invoked with the options and arguments bound to
 | |
| 287 |         keyword parameters.
 | |
| 288 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 289 |         Return 0 or None if the command was successful, or a non-zero
 | 
| 290 |         shell error code if not.  It's OK for this method to allow
 | |
| 291 |         an exception to raise up.
 | |
| 329
by Martin Pool - refactor command functions into command classes | 292 |         """
 | 
| 1610.1.3
by Martin Pool Better error message for Command.run() not implemented | 293 | raise NotImplementedError('no implementation of command %r' | 
| 294 | % self.name()) | |
| 329
by Martin Pool - refactor command functions into command classes | 295 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 296 | def help(self): | 
| 297 | """Return help message for this class.""" | |
| 1610.1.2
by Martin Pool Move rarely-used import into Command.help() | 298 | from inspect import getdoc | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 299 | if self.__doc__ is Command.__doc__: | 
| 300 | return None | |
| 301 | return getdoc(self) | |
| 302 | ||
| 303 | def name(self): | |
| 304 | return _unsquish_command_name(self.__class__.__name__) | |
| 305 | ||
| 1733.2.5
by Michael Ellerman Show which plugin (if any) provides a command. | 306 | def plugin_name(self): | 
| 307 | """Get the name of the plugin that provides this command. | |
| 308 | ||
| 309 |         :return: The name of the plugin or None if the command is builtin.
 | |
| 310 |         """
 | |
| 311 | mod_parts = self.__module__.split('.') | |
| 312 | if len(mod_parts) >= 3 and mod_parts[1] == 'plugins': | |
| 313 | return mod_parts[2] | |
| 314 | else: | |
| 315 | return None | |
| 316 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 317 | |
| 493
by Martin Pool - Merge aaron's merge command | 318 | def parse_spec(spec): | 
| 622
by Martin Pool Updated merge patch from Aaron | 319 | """ | 
| 320 |     >>> parse_spec(None)
 | |
| 321 |     [None, None]
 | |
| 322 |     >>> parse_spec("./")
 | |
| 323 |     ['./', None]
 | |
| 324 |     >>> parse_spec("../@")
 | |
| 325 |     ['..', -1]
 | |
| 326 |     >>> parse_spec("../f/@35")
 | |
| 327 |     ['../f', 35]
 | |
| 897
by Martin Pool - merge john's revision-naming code | 328 |     >>> parse_spec('./@revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67')
 | 
| 329 |     ['.', 'revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67']
 | |
| 622
by Martin Pool Updated merge patch from Aaron | 330 |     """
 | 
| 331 | if spec is None: | |
| 332 | return [None, None] | |
| 493
by Martin Pool - Merge aaron's merge command | 333 | if '/@' in spec: | 
| 334 | parsed = spec.split('/@') | |
| 335 | assert len(parsed) == 2 | |
| 336 | if parsed[1] == "": | |
| 337 | parsed[1] = -1 | |
| 338 | else: | |
| 897
by Martin Pool - merge john's revision-naming code | 339 | try: | 
| 340 | parsed[1] = int(parsed[1]) | |
| 341 | except ValueError: | |
| 342 | pass # We can allow stuff like ./@revid:blahblahblah | |
| 343 | else: | |
| 344 | assert parsed[1] >=0 | |
| 493
by Martin Pool - Merge aaron's merge command | 345 | else: | 
| 346 | parsed = [spec, None] | |
| 347 | return parsed | |
| 348 | ||
| 1553.6.11
by Erik Bågfors small bugfixes, all tests pass now | 349 | def parse_args(command, argv, alias_argv=None): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 350 | """Parse command line. | 
| 351 |     
 | |
| 352 |     Arguments and options are parsed at this level before being passed
 | |
| 353 |     down to specific command handlers.  This routine knows, from a
 | |
| 354 |     lookup table, something about the available options, what optargs
 | |
| 355 |     they take, and which commands will accept them.
 | |
| 356 |     """
 | |
| 1185.16.49
by mbp at sourcefrog - more refactoring and tests of commandline | 357 |     # TODO: chop up this beast; make it a method of the Command
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 358 | args = [] | 
| 359 | opts = {} | |
| 1553.6.8
by Erik Bågfors support for overrides | 360 | alias_opts = {} | 
| 1
by mbp at sourcefrog import from baz patch-364 | 361 | |
| 1185.16.48
by mbp at sourcefrog - more refactoring of and tests for option parsing | 362 | cmd_options = command.options() | 
| 1144
by Martin Pool - accept -- to terminate options | 363 | argsover = False | 
| 1553.6.8
by Erik Bågfors support for overrides | 364 | proc_aliasarg = True # Are we processing alias_argv now? | 
| 365 | for proc_argv in alias_argv, argv: | |
| 366 | while proc_argv: | |
| 367 | a = proc_argv.pop(0) | |
| 368 | if argsover: | |
| 369 | args.append(a) | |
| 370 |                 continue
 | |
| 1852.1.1
by John Arbash Meinel Allow a plain '-' to be supplied as an argument. bug #50984 | 371 | elif a == '-': | 
| 372 | args.append(a) | |
| 373 |                 continue
 | |
| 1553.6.8
by Erik Bågfors support for overrides | 374 | elif a == '--': | 
| 375 |                 # We've received a standalone -- No more flags
 | |
| 376 | argsover = True | |
| 377 |                 continue
 | |
| 378 | if a[0] == '-': | |
| 379 |                 # option names must not be unicode
 | |
| 380 | a = str(a) | |
| 381 | optarg = None | |
| 382 | if a[1] == '-': | |
| 383 | mutter(" got option %r", a) | |
| 384 | if '=' in a: | |
| 385 | optname, optarg = a[2:].split('=', 1) | |
| 386 | else: | |
| 387 | optname = a[2:] | |
| 388 | if optname not in cmd_options: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 389 | raise BzrCommandError('unknown option "%s"' % a) | 
| 1553.6.8
by Erik Bågfors support for overrides | 390 | else: | 
| 391 | shortopt = a[1:] | |
| 392 | if shortopt in Option.SHORT_OPTIONS: | |
| 393 |                         # Multi-character options must have a space to delimit
 | |
| 394 |                         # their value
 | |
| 395 |                         # ^^^ what does this mean? mbp 20051014
 | |
| 396 | optname = Option.SHORT_OPTIONS[shortopt].name | |
| 397 | else: | |
| 398 |                         # Single character short options, can be chained,
 | |
| 399 |                         # and have their value appended to their name
 | |
| 400 | shortopt = a[1:2] | |
| 401 | if shortopt not in Option.SHORT_OPTIONS: | |
| 402 |                             # We didn't find the multi-character name, and we
 | |
| 403 |                             # didn't find the single char name
 | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 404 | raise BzrCommandError('unknown option "%s"' % a) | 
| 1553.6.8
by Erik Bågfors support for overrides | 405 | optname = Option.SHORT_OPTIONS[shortopt].name | 
| 683
by Martin Pool - short option stacking patch from John A Meinel | 406 | |
| 1553.6.8
by Erik Bågfors support for overrides | 407 | if a[2:]: | 
| 408 |                             # There are extra things on this option
 | |
| 409 |                             # see if it is the value, or if it is another
 | |
| 410 |                             # short option
 | |
| 411 | optargfn = Option.OPTIONS[optname].type | |
| 412 | if optargfn is None: | |
| 413 |                                 # This option does not take an argument, so the
 | |
| 1558.1.10
by Aaron Bentley Cleaned up some long lines | 414 |                                 # next entry is another short option, pack it
 | 
| 415 |                                 # back into the list
 | |
| 1553.6.8
by Erik Bågfors support for overrides | 416 | proc_argv.insert(0, '-' + a[2:]) | 
| 417 | else: | |
| 418 |                                 # This option takes an argument, so pack it
 | |
| 419 |                                 # into the array
 | |
| 420 | optarg = a[2:] | |
| 421 | if optname not in cmd_options: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 422 | raise BzrCommandError('unknown option "%s"' % shortopt) | 
| 1553.6.8
by Erik Bågfors support for overrides | 423 | if optname in opts: | 
| 424 |                     # XXX: Do we ever want to support this, e.g. for -r?
 | |
| 425 | if proc_aliasarg: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 426 | raise BzrCommandError('repeated option %r' % a) | 
| 1553.6.8
by Erik Bågfors support for overrides | 427 | elif optname in alias_opts: | 
| 1558.1.10
by Aaron Bentley Cleaned up some long lines | 428 |                         # Replace what's in the alias with what's in the real
 | 
| 429 |                         # argument
 | |
| 1553.6.8
by Erik Bågfors support for overrides | 430 | del alias_opts[optname] | 
| 431 | del opts[optname] | |
| 432 | proc_argv.insert(0, a) | |
| 433 |                         continue
 | |
| 434 | else: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 435 | raise BzrCommandError('repeated option %r' % a) | 
| 1553.6.8
by Erik Bågfors support for overrides | 436 | |
| 437 | option_obj = cmd_options[optname] | |
| 438 | optargfn = option_obj.type | |
| 439 | if optargfn: | |
| 440 | if optarg == None: | |
| 441 | if not proc_argv: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 442 | raise BzrCommandError('option %r needs an argument' % a) | 
| 683
by Martin Pool - short option stacking patch from John A Meinel | 443 | else: | 
| 1553.6.8
by Erik Bågfors support for overrides | 444 | optarg = proc_argv.pop(0) | 
| 445 | opts[optname] = optargfn(optarg) | |
| 446 | if proc_aliasarg: | |
| 447 | alias_opts[optname] = optargfn(optarg) | |
| 448 | else: | |
| 449 | if optarg != None: | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 450 | raise BzrCommandError('option %r takes no argument' % optname) | 
| 1553.6.8
by Erik Bågfors support for overrides | 451 | opts[optname] = True | 
| 452 | if proc_aliasarg: | |
| 453 | alias_opts[optname] = True | |
| 1
by mbp at sourcefrog import from baz patch-364 | 454 | else: | 
| 1553.6.8
by Erik Bågfors support for overrides | 455 | args.append(a) | 
| 456 | proc_aliasarg = False # Done with alias argv | |
| 1
by mbp at sourcefrog import from baz patch-364 | 457 | return args, opts | 
| 458 | ||
| 459 | ||
| 329
by Martin Pool - refactor command functions into command classes | 460 | def _match_argform(cmd, takes_args, args): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 461 | argdict = {} | 
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 462 | |
| 329
by Martin Pool - refactor command functions into command classes | 463 |     # step through args and takes_args, allowing appropriate 0-many matches
 | 
| 464 | for ap in takes_args: | |
| 1
by mbp at sourcefrog import from baz patch-364 | 465 | argname = ap[:-1] | 
| 466 | if ap[-1] == '?': | |
| 62
by mbp at sourcefrog - new find_branch_root function; based on suggestion from aaron | 467 | if args: | 
| 468 | argdict[argname] = args.pop(0) | |
| 196
by mbp at sourcefrog selected-file diff | 469 | elif ap[-1] == '*': # all remaining arguments | 
| 470 | if args: | |
| 471 | argdict[argname + '_list'] = args[:] | |
| 472 | args = [] | |
| 473 | else: | |
| 474 | argdict[argname + '_list'] = None | |
| 1
by mbp at sourcefrog import from baz patch-364 | 475 | elif ap[-1] == '+': | 
| 476 | if not args: | |
| 329
by Martin Pool - refactor command functions into command classes | 477 | raise BzrCommandError("command %r needs one or more %s" | 
| 1
by mbp at sourcefrog import from baz patch-364 | 478 | % (cmd, argname.upper())) | 
| 479 | else: | |
| 480 | argdict[argname + '_list'] = args[:] | |
| 481 | 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 | 482 | elif ap[-1] == '$': # all but one | 
| 483 | if len(args) < 2: | |
| 329
by Martin Pool - refactor command functions into command classes | 484 | raise BzrCommandError("command %r needs one or more %s" | 
| 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 | 485 | % (cmd, argname.upper())) | 
| 486 | argdict[argname + '_list'] = args[:-1] | |
| 1740.5.6
by Martin Pool Clean up many exception classes. | 487 | args[:-1] = [] | 
| 1
by mbp at sourcefrog import from baz patch-364 | 488 | else: | 
| 489 |             # just a plain arg
 | |
| 490 | argname = ap | |
| 491 | if not args: | |
| 329
by Martin Pool - refactor command functions into command classes | 492 | raise BzrCommandError("command %r requires argument %s" | 
| 1
by mbp at sourcefrog import from baz patch-364 | 493 | % (cmd, argname.upper())) | 
| 494 | else: | |
| 495 | argdict[argname] = args.pop(0) | |
| 496 | ||
| 497 | if args: | |
| 329
by Martin Pool - refactor command functions into command classes | 498 | raise BzrCommandError("extra argument to command %s: %s" | 
| 499 | % (cmd, args[0])) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 500 | |
| 501 | return argdict | |
| 502 | ||
| 503 | ||
| 504 | ||
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 505 | def apply_profiled(the_callable, *args, **kwargs): | 
| 506 | import hotshot | |
| 507 | import tempfile | |
| 1393.1.27
by Martin Pool - clean up profile code and change default sort order | 508 | import hotshot.stats | 
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 509 | pffileno, pfname = tempfile.mkstemp() | 
| 510 | try: | |
| 511 | prof = hotshot.Profile(pfname) | |
| 512 | try: | |
| 513 | ret = prof.runcall(the_callable, *args, **kwargs) or 0 | |
| 514 | finally: | |
| 515 | prof.close() | |
| 516 | stats = hotshot.stats.load(pfname) | |
| 1393.1.27
by Martin Pool - clean up profile code and change default sort order | 517 | stats.strip_dirs() | 
| 518 | stats.sort_stats('cum') # 'time' | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 519 |         ## XXX: Might like to write to stderr or the trace file instead but
 | 
| 520 |         ## print_stats seems hardcoded to stdout
 | |
| 521 | stats.print_stats(20) | |
| 522 | return ret | |
| 523 | finally: | |
| 524 | os.close(pffileno) | |
| 525 | os.remove(pfname) | |
| 526 | ||
| 527 | ||
| 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) | 528 | def apply_lsprofiled(filename, the_callable, *args, **kwargs): | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 529 | 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) | 530 | import cPickle | 
| 531 | ret, stats = profile(the_callable, *args, **kwargs) | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 532 | 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) | 533 | if filename is None: | 
| 534 | stats.pprint() | |
| 535 | else: | |
| 536 | stats.freeze() | |
| 537 | cPickle.dump(stats, open(filename, 'w'), 2) | |
| 538 | print 'Profile data written to %r.' % filename | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 539 | return ret | 
| 540 | ||
| 1553.6.9
by Erik Bågfors PEP8-ify | 541 | |
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 542 | def get_alias(cmd): | 
| 1553.6.14
by Erik Bågfors change get_alias summary to be shorter | 543 | """Return an expanded alias, or None if no alias exists""" | 
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 544 | import bzrlib.config | 
| 1553.6.12
by Erik Bågfors remove AliasConfig, based on input from abentley | 545 | alias = bzrlib.config.GlobalConfig().get_alias(cmd) | 
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 546 | if (alias): | 
| 547 | return alias.split(' ') | |
| 1553.6.8
by Erik Bågfors support for overrides | 548 | return None | 
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 549 | |
| 1553.6.9
by Erik Bågfors PEP8-ify | 550 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 551 | def run_bzr(argv): | 
| 552 | """Execute a command. | |
| 553 | ||
| 554 |     This is similar to main(), but without all the trappings for
 | |
| 245
by mbp at sourcefrog - control files always in utf-8-unix format | 555 |     logging and error handling.  
 | 
| 973
by Martin Pool - various refactorings of command interpreter | 556 |     
 | 
| 557 |     argv
 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 558 |        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. | 559 |        These should already be decoded. All library/test code calling
 | 
| 560 |        run_bzr should be passing valid strings (don't need decoding).
 | |
| 973
by Martin Pool - various refactorings of command interpreter | 561 |     
 | 
| 562 |     Returns a command status or raises an exception.
 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 563 | |
| 564 |     Special master options: these must come before the command because
 | |
| 565 |     they control how the command is interpreted.
 | |
| 566 | ||
| 567 |     --no-plugins
 | |
| 568 |         Do not load plugin modules at all
 | |
| 569 | ||
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 570 |     --no-aliases
 | 
| 571 |         Do not allow aliases
 | |
| 572 | ||
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 573 |     --builtin
 | 
| 574 |         Only use builtin commands.  (Plugins are still allowed to change
 | |
| 575 |         other behaviour.)
 | |
| 576 | ||
| 577 |     --profile
 | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 578 |         Run under the Python hotshot profiler.
 | 
| 579 | ||
| 580 |     --lsprof
 | |
| 581 |         Run under the Python lsprof profiler.
 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 582 |     """
 | 
| 1185.85.4
by John Arbash Meinel currently broken, trying to fix things up. | 583 | argv = list(argv) | 
| 907.1.21
by John Arbash Meinel Adding http transport as a valid transport protocol. | 584 | |
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 585 | opt_lsprof = opt_profile = opt_no_plugins = opt_builtin = \ | 
| 586 | opt_no_aliases = False | |
| 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) | 587 | opt_lsprof_file = None | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 588 | |
| 589 |     # --no-plugins is handled specially at a very early stage. We need
 | |
| 590 |     # to load plugins before doing other command parsing so that they
 | |
| 591 |     # can override commands, but this needs to happen first.
 | |
| 592 | ||
| 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) | 593 | argv_copy = [] | 
| 594 | i = 0 | |
| 595 | while i < len(argv): | |
| 596 | a = argv[i] | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 597 | if a == '--profile': | 
| 598 | opt_profile = True | |
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 599 | elif a == '--lsprof': | 
| 600 | 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) | 601 | elif a == '--lsprof-file': | 
| 1706.2.6
by Robey Pointer when giving --lsprof-file, assume --lsprof | 602 | 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) | 603 | opt_lsprof_file = argv[i + 1] | 
| 604 | i += 1 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 605 | elif a == '--no-plugins': | 
| 606 | opt_no_plugins = True | |
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 607 | elif a == '--no-aliases': | 
| 608 | opt_no_aliases = True | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 609 | elif a == '--builtin': | 
| 610 | opt_builtin = True | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 611 | elif a in ('--quiet', '-q'): | 
| 612 | be_quiet() | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 613 | 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) | 614 | argv_copy.append(a) | 
| 615 | i += 1 | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 616 | |
| 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) | 617 | argv = argv_copy | 
| 1616.1.15
by Martin Pool Handle 'bzr ?', etc. | 618 | if (not argv): | 
| 619 | from bzrlib.builtins import cmd_help | |
| 1558.14.2
by Aaron Bentley Removed deprecation warning when bzr invoked with no arguments | 620 | cmd_help().run_argv_aliases([]) | 
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 621 | return 0 | 
| 622 | ||
| 623 | if argv[0] == '--version': | |
| 624 | from bzrlib.builtins import show_version | |
| 625 | show_version() | |
| 626 | return 0 | |
| 627 | ||
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 628 | if not opt_no_plugins: | 
| 973
by Martin Pool - various refactorings of command interpreter | 629 | from bzrlib.plugin import load_plugins | 
| 630 | load_plugins() | |
| 1551.3.11
by Aaron Bentley Merge from Robert | 631 | else: | 
| 632 | from bzrlib.plugin import disable_plugins | |
| 633 | disable_plugins() | |
| 973
by Martin Pool - various refactorings of command interpreter | 634 | |
| 1553.6.17
by Erik Bågfors fix for broken --no-aliases | 635 | alias_argv = None | 
| 636 | ||
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 637 | if not opt_no_aliases: | 
| 1553.6.8
by Erik Bågfors support for overrides | 638 | alias_argv = get_alias(argv[0]) | 
| 639 | if alias_argv: | |
| 640 | alias_argv = [a.decode(bzrlib.user_encoding) for a in alias_argv] | |
| 641 | argv[0] = alias_argv.pop(0) | |
| 1553.6.1
by Erik Bågfors support for aliases in bazaar.conf | 642 | |
| 1165
by Martin Pool - move parsing of argv into arguments and options into Command.run_argv | 643 | cmd = str(argv.pop(0)) | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 644 | |
| 1162
by Martin Pool - change Command infrastructure to use (mostly stateless) objects to | 645 | cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin) | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 646 | if not getattr(cmd_obj.run_argv, 'is_deprecated', False): | 
| 647 | run = cmd_obj.run_argv | |
| 648 | run_argv = [argv] | |
| 649 | else: | |
| 650 | run = cmd_obj.run_argv_aliases | |
| 651 | run_argv = [argv, alias_argv] | |
| 1534.7.154
by Aaron Bentley Removed changes from bzr.ab 1529..1536 | 652 | |
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 653 | try: | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 654 | if opt_lsprof: | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 655 | ret = apply_lsprofiled(opt_lsprof_file, run, *run_argv) | 
| 1185.33.85
by Martin Pool New --lsprof option from Denys Duchier | 656 | elif opt_profile: | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 657 | ret = apply_profiled(run, *run_argv) | 
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 658 | else: | 
| 1581.1.1
by Robert Collins Bugfix aliases to be backwards compatible with plugins providing command.run_argv. | 659 | ret = run(*run_argv) | 
| 1185.33.42
by Martin Pool [patch] make --quiet a global option (robey) | 660 | return ret or 0 | 
| 661 | finally: | |
| 662 |         # reset, in case we may do other commands later within the same process
 | |
| 663 | be_quiet(False) | |
| 267
by Martin Pool - better reporting of errors | 664 | |
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 665 | def display_command(func): | 
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 666 | """Decorator that suppresses pipe/interrupt errors.""" | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 667 | def ignore_pipe(*args, **kwargs): | 
| 668 | try: | |
| 1185.35.22
by Aaron Bentley Handled more pipe errors for display commands. | 669 | result = func(*args, **kwargs) | 
| 670 | sys.stdout.flush() | |
| 671 | return result | |
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 672 | except IOError, e: | 
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 673 | if not hasattr(e, 'errno'): | 
| 674 |                 raise
 | |
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 675 | 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 | 676 |                 # Win32 raises IOError with errno=0 on a broken pipe
 | 
| 677 | if sys.platform != 'win32' or e.errno != 0: | |
| 678 |                     raise
 | |
| 1185.33.18
by Martin Pool [patch] handle bad IOError subclass raised by urlopen | 679 |             pass
 | 
| 1185.12.69
by Aaron Bentley Ignored ^C in display commands | 680 | except KeyboardInterrupt: | 
| 1490
by Robert Collins Implement a 'bzr push' command, with saved locations; update diff to return 1. | 681 |             pass
 | 
| 1185.12.56
by Aaron Bentley Prevented display commands from printing broken pipe errors | 682 | return ignore_pipe | 
| 267
by Martin Pool - better reporting of errors | 683 | |
| 1185.43.6
by Martin Pool Enable logging early enough to save argv | 684 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 685 | def main(argv): | 
| 1104
by Martin Pool - Add a simple UIFactory | 686 | import bzrlib.ui | 
| 1185.49.21
by John Arbash Meinel Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms. | 687 | from bzrlib.ui.text import TextUIFactory | 
| 688 | bzrlib.ui.ui_factory = TextUIFactory() | |
| 1185.85.4
by John Arbash Meinel currently broken, trying to fix things up. | 689 | argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]] | 
| 690 | ret = run_bzr_catch_errors(argv) | |
| 1185.43.6
by Martin Pool Enable logging early enough to save argv | 691 | mutter("return code %d", ret) | 
| 692 | return ret | |
| 1185.3.19
by Martin Pool - split out commandline error reporting for ease of testing | 693 | |
| 694 | ||
| 695 | def run_bzr_catch_errors(argv): | |
| 1
by mbp at sourcefrog import from baz patch-364 | 696 | try: | 
| 1711.4.31
by John Arbash Meinel Catch proper error instead of EPIPE on win32, also don't double flush | 697 | return run_bzr(argv) | 
| 698 |         # do this here inside the exception wrappers to catch EPIPE
 | |
| 699 | sys.stdout.flush() | |
| 1097
by Martin Pool - send trace messages out through python logging module | 700 | except Exception, e: | 
| 1185.33.19
by Martin Pool Run postmortem debugger if BZR_PDB is set | 701 |         # used to handle AssertionError and KeyboardInterrupt
 | 
| 702 |         # specially here, but hopefully they're handled ok by the logger now
 | |
| 1740.5.3
by Martin Pool Cleanup more exception-formatting code | 703 | bzrlib.trace.report_exception(sys.exc_info(), sys.stderr) | 
| 704 | if os.environ.get('BZR_PDB'): | |
| 705 | print '**** entering debugger' | |
| 706 | import pdb | |
| 707 | pdb.post_mortem(sys.exc_traceback) | |
| 708 | return 3 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 709 | |
| 710 | if __name__ == '__main__': | |
| 711 | sys.exit(main(sys.argv)) |