bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 329
by Martin Pool - refactor command functions into command classes | 1 | # Copyright (C) 2004, 2005 by Canonical Ltd
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 2 | |
| 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.
 | |
| 7 | ||
| 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.
 | |
| 12 | ||
| 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 | ||
| 18 | ||
| 572
by Martin Pool - trim imports | 19 | import sys, os | 
| 1
by mbp at sourcefrog import from baz patch-364 | 20 | |
| 21 | import bzrlib | |
| 22 | from bzrlib.trace import mutter, note, log_error | |
| 329
by Martin Pool - refactor command functions into command classes | 23 | from bzrlib.errors import bailout, BzrError, BzrCheckError, BzrCommandError | 
| 592
by Martin Pool - trim imports more | 24 | from bzrlib.osutils import quotefn | 
| 25 | from bzrlib import Branch, Inventory, InventoryEntry, BZRDIR, \ | |
| 1
by mbp at sourcefrog import from baz patch-364 | 26 |      format_date
 | 
| 27 | ||
| 28 | ||
| 350
by Martin Pool - refactor command aliases into command classes | 29 | def _squish_command_name(cmd): | 
| 30 | return 'cmd_' + cmd.replace('-', '_') | |
| 31 | ||
| 32 | ||
| 33 | def _unsquish_command_name(cmd): | |
| 34 | assert cmd.startswith("cmd_") | |
| 35 | return cmd[4:].replace('_','-') | |
| 36 | ||
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 37 | def _parse_revision_str(revstr): | 
| 38 | """This handles a revision string -> revno. | |
| 39 | ||
| 40 |     There are several possibilities:
 | |
| 41 | ||
| 42 |         '234'       -> 234
 | |
| 43 |         '234:345'   -> [234, 345]
 | |
| 44 |         ':234'      -> [None, 234]
 | |
| 45 |         '234:'      -> [234, None]
 | |
| 46 | ||
| 47 |     In the future we will also support:
 | |
| 48 |         'uuid:blah-blah-blah'   -> ?
 | |
| 49 |         'hash:blahblahblah'     -> ?
 | |
| 50 |         potentially:
 | |
| 51 |         'tag:mytag'             -> ?
 | |
| 52 |     """
 | |
| 53 | if revstr.find(':') != -1: | |
| 54 | revs = revstr.split(':') | |
| 55 | if len(revs) > 2: | |
| 56 | raise ValueError('More than 2 pieces not supported for --revision: %r' % revstr) | |
| 57 | ||
| 58 | if not revs[0]: | |
| 59 | revs[0] = None | |
| 60 | else: | |
| 61 | revs[0] = int(revs[0]) | |
| 62 | ||
| 63 | if not revs[1]: | |
| 64 | revs[1] = None | |
| 65 | else: | |
| 66 | revs[1] = int(revs[1]) | |
| 67 | else: | |
| 68 | revs = int(revstr) | |
| 69 | return revs | |
| 70 | ||
| 351
by Martin Pool - Split out help functions into bzrlib.help | 71 | def get_all_cmds(): | 
| 350
by Martin Pool - refactor command aliases into command classes | 72 | """Return canonical name and class for all registered commands.""" | 
| 73 | for k, v in globals().iteritems(): | |
| 74 | if k.startswith("cmd_"): | |
| 75 | yield _unsquish_command_name(k), v | |
| 76 | ||
| 351
by Martin Pool - Split out help functions into bzrlib.help | 77 | def get_cmd_class(cmd): | 
| 350
by Martin Pool - refactor command aliases into command classes | 78 | """Return the canonical name and command class for a command. | 
| 79 |     """
 | |
| 80 | cmd = str(cmd) # not unicode | |
| 81 | ||
| 82 |     # first look up this command under the specified name
 | |
| 272
by Martin Pool - Add command aliases | 83 | try: | 
| 350
by Martin Pool - refactor command aliases into command classes | 84 | return cmd, globals()[_squish_command_name(cmd)] | 
| 272
by Martin Pool - Add command aliases | 85 | except KeyError: | 
| 350
by Martin Pool - refactor command aliases into command classes | 86 |         pass
 | 
| 87 | ||
| 88 |     # look for any command which claims this as an alias
 | |
| 351
by Martin Pool - Split out help functions into bzrlib.help | 89 | for cmdname, cmdclass in get_all_cmds(): | 
| 350
by Martin Pool - refactor command aliases into command classes | 90 | if cmd in cmdclass.aliases: | 
| 91 | return cmdname, cmdclass | |
| 422
by Martin Pool - External-command patch from mpe | 92 | |
| 93 | cmdclass = ExternalCommand.find_command(cmd) | |
| 94 | if cmdclass: | |
| 95 | return cmd, cmdclass | |
| 96 | ||
| 97 | raise BzrCommandError("unknown command %r" % cmd) | |
| 272
by Martin Pool - Add command aliases | 98 | |
| 329
by Martin Pool - refactor command functions into command classes | 99 | |
| 558
by Martin Pool - All top-level classes inherit from object | 100 | class Command(object): | 
| 329
by Martin Pool - refactor command functions into command classes | 101 | """Base class for commands. | 
| 102 | ||
| 103 |     The docstring for an actual command should give a single-line
 | |
| 104 |     summary, then a complete description of the command.  A grammar
 | |
| 105 |     description will be inserted.
 | |
| 106 | ||
| 107 |     takes_args
 | |
| 108 |         List of argument forms, marked with whether they are optional,
 | |
| 109 |         repeated, etc.
 | |
| 110 | ||
| 111 |     takes_options
 | |
| 112 |         List of options that may be given for this command.
 | |
| 113 | ||
| 114 |     hidden
 | |
| 115 |         If true, this command isn't advertised.
 | |
| 116 |     """
 | |
| 117 | aliases = [] | |
| 118 | ||
| 119 | takes_args = [] | |
| 120 | takes_options = [] | |
| 121 | ||
| 122 | hidden = False | |
| 123 | ||
| 124 | def __init__(self, options, arguments): | |
| 125 | """Construct and run the command. | |
| 126 | ||
| 127 |         Sets self.status to the return value of run()."""
 | |
| 128 | assert isinstance(options, dict) | |
| 129 | assert isinstance(arguments, dict) | |
| 130 | cmdargs = options.copy() | |
| 131 | cmdargs.update(arguments) | |
| 132 | assert self.__doc__ != Command.__doc__, \ | |
| 133 | ("No help message set for %r" % self) | |
| 134 | self.status = self.run(**cmdargs) | |
| 135 | ||
| 136 | ||
| 137 | def run(self): | |
| 138 | """Override this in sub-classes. | |
| 139 | ||
| 140 |         This is invoked with the options and arguments bound to
 | |
| 141 |         keyword parameters.
 | |
| 142 | ||
| 337
by Martin Pool - Clarify return codes from command objects | 143 |         Return 0 or None if the command was successful, or a shell
 | 
| 144 |         error code if not.
 | |
| 329
by Martin Pool - refactor command functions into command classes | 145 |         """
 | 
| 337
by Martin Pool - Clarify return codes from command objects | 146 | return 0 | 
| 329
by Martin Pool - refactor command functions into command classes | 147 | |
| 148 | ||
| 422
by Martin Pool - External-command patch from mpe | 149 | class ExternalCommand(Command): | 
| 150 | """Class to wrap external commands. | |
| 151 | ||
| 152 |     We cheat a little here, when get_cmd_class() calls us we actually give it back
 | |
| 153 |     an object we construct that has the appropriate path, help, options etc for the
 | |
| 154 |     specified command.
 | |
| 155 | ||
| 156 |     When run_bzr() tries to instantiate that 'class' it gets caught by the __call__
 | |
| 157 |     method, which we override to call the Command.__init__ method. That then calls
 | |
| 158 |     our run method which is pretty straight forward.
 | |
| 159 | ||
| 160 |     The only wrinkle is that we have to map bzr's dictionary of options and arguments
 | |
| 161 |     back into command line options and arguments for the script.
 | |
| 162 |     """
 | |
| 163 | ||
| 164 | def find_command(cls, cmd): | |
| 572
by Martin Pool - trim imports | 165 | import os.path | 
| 422
by Martin Pool - External-command patch from mpe | 166 | bzrpath = os.environ.get('BZRPATH', '') | 
| 167 | ||
| 168 | for dir in bzrpath.split(':'): | |
| 169 | path = os.path.join(dir, cmd) | |
| 170 | if os.path.isfile(path): | |
| 171 | return ExternalCommand(path) | |
| 172 | ||
| 173 | return None | |
| 174 | ||
| 175 | find_command = classmethod(find_command) | |
| 176 | ||
| 177 | def __init__(self, path): | |
| 178 | self.path = path | |
| 179 | ||
| 424
by Martin Pool todo | 180 |         # TODO: If either of these fail, we should detect that and
 | 
| 181 |         # assume that path is not really a bzr plugin after all.
 | |
| 182 | ||
| 422
by Martin Pool - External-command patch from mpe | 183 | pipe = os.popen('%s --bzr-usage' % path, 'r') | 
| 184 | self.takes_options = pipe.readline().split() | |
| 185 | self.takes_args = pipe.readline().split() | |
| 186 | pipe.close() | |
| 187 | ||
| 188 | pipe = os.popen('%s --bzr-help' % path, 'r') | |
| 189 | self.__doc__ = pipe.read() | |
| 190 | pipe.close() | |
| 191 | ||
| 192 | def __call__(self, options, arguments): | |
| 193 | Command.__init__(self, options, arguments) | |
| 194 | return self | |
| 195 | ||
| 196 | def run(self, **kargs): | |
| 197 | opts = [] | |
| 198 | args = [] | |
| 199 | ||
| 200 | keys = kargs.keys() | |
| 201 | keys.sort() | |
| 202 | for name in keys: | |
| 203 | value = kargs[name] | |
| 204 | if OPTIONS.has_key(name): | |
| 205 |                 # it's an option
 | |
| 206 | opts.append('--%s' % name) | |
| 207 | if value is not None and value is not True: | |
| 208 | opts.append(str(value)) | |
| 209 | else: | |
| 210 |                 # it's an arg, or arg list
 | |
| 211 | if type(value) is not list: | |
| 212 | value = [value] | |
| 213 | for v in value: | |
| 214 | if v is not None: | |
| 215 | args.append(str(v)) | |
| 216 | ||
| 217 | self.status = os.spawnv(os.P_WAIT, self.path, [self.path] + opts + args) | |
| 218 | return self.status | |
| 219 | ||
| 329
by Martin Pool - refactor command functions into command classes | 220 | |
| 221 | class cmd_status(Command): | |
| 1
by mbp at sourcefrog import from baz patch-364 | 222 | """Display status summary. | 
| 223 | ||
| 466
by Martin Pool - doc for status command | 224 |     This reports on versioned and unknown files, reporting them
 | 
| 225 |     grouped by state.  Possible states are:
 | |
| 226 | ||
| 227 |     added
 | |
| 228 |         Versioned in the working copy but not in the previous revision.
 | |
| 229 | ||
| 230 |     removed
 | |
| 467
by Martin Pool - doc for status command | 231 |         Versioned in the previous revision but removed or deleted
 | 
| 466
by Martin Pool - doc for status command | 232 |         in the working copy.
 | 
| 233 | ||
| 234 |     renamed
 | |
| 235 |         Path of this file changed from the previous revision;
 | |
| 236 |         the text may also have changed.  This includes files whose
 | |
| 467
by Martin Pool - doc for status command | 237 |         parent directory was renamed.
 | 
| 466
by Martin Pool - doc for status command | 238 | |
| 239 |     modified
 | |
| 240 |         Text has changed since the previous revision.
 | |
| 241 | ||
| 242 |     unchanged
 | |
| 467
by Martin Pool - doc for status command | 243 |         Nothing about this file has changed since the previous revision.
 | 
| 244 |         Only shown with --all.
 | |
| 466
by Martin Pool - doc for status command | 245 | |
| 246 |     unknown
 | |
| 247 |         Not versioned and not matching an ignore pattern.
 | |
| 248 | ||
| 249 |     To see ignored files use 'bzr ignored'.  For details in the
 | |
| 250 |     changes to file texts, use 'bzr diff'.
 | |
| 468
by Martin Pool - Interpret arguments to bzr status | 251 | |
| 252 |     If no arguments are specified, the status of the entire working
 | |
| 253 |     directory is shown.  Otherwise, only the status of the specified
 | |
| 254 |     files or directories is reported.  If a directory is given, status
 | |
| 255 |     is reported for everything inside that directory.
 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 256 |     """
 | 
| 404
by Martin Pool - bzr status now optionally takes filenames to check | 257 | takes_args = ['file*'] | 
| 465
by Martin Pool - Move show_status() out of Branch into a new function in | 258 | takes_options = ['all', 'show-ids'] | 
| 350
by Martin Pool - refactor command aliases into command classes | 259 | aliases = ['st', 'stat'] | 
| 329
by Martin Pool - refactor command functions into command classes | 260 | |
| 465
by Martin Pool - Move show_status() out of Branch into a new function in | 261 | def run(self, all=False, show_ids=False, file_list=None): | 
| 468
by Martin Pool - Interpret arguments to bzr status | 262 | if file_list: | 
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 263 | b = Branch(file_list[0]) | 
| 468
by Martin Pool - Interpret arguments to bzr status | 264 | file_list = [b.relpath(x) for x in file_list] | 
| 265 |             # special case: only one path was given and it's the root
 | |
| 266 |             # of the branch
 | |
| 267 | if file_list == ['']: | |
| 268 | file_list = None | |
| 269 | else: | |
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 270 | b = Branch('.') | 
| 465
by Martin Pool - Move show_status() out of Branch into a new function in | 271 | import status | 
| 272 | status.show_status(b, show_unchanged=all, show_ids=show_ids, | |
| 483
by Martin Pool - change 'file_list' to more explanatory 'specific_files' | 273 | specific_files=file_list) | 
| 329
by Martin Pool - refactor command functions into command classes | 274 | |
| 275 | ||
| 276 | class cmd_cat_revision(Command): | |
| 277 | """Write out metadata for a revision.""" | |
| 278 | ||
| 279 | hidden = True | |
| 280 | takes_args = ['revision_id'] | |
| 281 | ||
| 282 | def run(self, revision_id): | |
| 283 | Branch('.').get_revision(revision_id).write_xml(sys.stdout) | |
| 284 | ||
| 285 | ||
| 286 | class cmd_revno(Command): | |
| 287 | """Show current revision number. | |
| 288 | ||
| 289 |     This is equal to the number of revisions on this branch."""
 | |
| 290 | def run(self): | |
| 291 | print Branch('.').revno() | |
| 292 | ||
| 293 | ||
| 294 | class cmd_add(Command): | |
| 70
by mbp at sourcefrog Prepare for smart recursive add. | 295 | """Add specified files or directories. | 
| 296 | ||
| 297 |     In non-recursive mode, all the named items are added, regardless
 | |
| 298 |     of whether they were previously ignored.  A warning is given if
 | |
| 299 |     any of the named files are already versioned.
 | |
| 300 | ||
| 301 |     In recursive mode (the default), files are treated the same way
 | |
| 302 |     but the behaviour for directories is different.  Directories that
 | |
| 303 |     are already versioned do not give a warning.  All directories,
 | |
| 304 |     whether already versioned or not, are searched for files or
 | |
| 305 |     subdirectories that are neither versioned or ignored, and these
 | |
| 306 |     are added.  This search proceeds recursively into versioned
 | |
| 307 |     directories.
 | |
| 308 | ||
| 309 |     Therefore simply saying 'bzr add .' will version all files that
 | |
| 310 |     are currently unknown.
 | |
| 279
by Martin Pool todo | 311 | |
| 312 |     TODO: Perhaps adding a file whose directly is not versioned should
 | |
| 313 |     recursively add that parent, rather than giving an error?
 | |
| 70
by mbp at sourcefrog Prepare for smart recursive add. | 314 |     """
 | 
| 329
by Martin Pool - refactor command functions into command classes | 315 | takes_args = ['file+'] | 
| 594
by Martin Pool - add --no-recurse option for add command | 316 | takes_options = ['verbose', 'no-recurse'] | 
| 329
by Martin Pool - refactor command functions into command classes | 317 | |
| 594
by Martin Pool - add --no-recurse option for add command | 318 | def run(self, file_list, verbose=False, no_recurse=False): | 
| 319 | bzrlib.add.smart_add(file_list, verbose, not no_recurse) | |
| 329
by Martin Pool - refactor command functions into command classes | 320 | |
| 321 | ||
| 386
by Martin Pool - Typo (reported by uws) | 322 | class cmd_relpath(Command): | 
| 329
by Martin Pool - refactor command functions into command classes | 323 | """Show path of a file relative to root""" | 
| 392
by Martin Pool - fix relpath and add tests | 324 | takes_args = ['filename'] | 
| 584
by Martin Pool - make relpath and revision-history hidden commands | 325 | hidden = True | 
| 329
by Martin Pool - refactor command functions into command classes | 326 | |
| 392
by Martin Pool - fix relpath and add tests | 327 | def run(self, filename): | 
| 328 | print Branch(filename).relpath(filename) | |
| 329
by Martin Pool - refactor command functions into command classes | 329 | |
| 330 | ||
| 331 | ||
| 332 | class cmd_inventory(Command): | |
| 333 | """Show inventory of the current working copy or a revision.""" | |
| 588
by Martin Pool - change inventory command to not show ids by default | 334 | takes_options = ['revision', 'show-ids'] | 
| 329
by Martin Pool - refactor command functions into command classes | 335 | |
| 588
by Martin Pool - change inventory command to not show ids by default | 336 | def run(self, revision=None, show_ids=False): | 
| 329
by Martin Pool - refactor command functions into command classes | 337 | b = Branch('.') | 
| 338 | if revision == None: | |
| 339 | inv = b.read_working_inventory() | |
| 340 | else: | |
| 341 | inv = b.get_revision_inventory(b.lookup_revision(revision)) | |
| 342 | ||
| 556
by Martin Pool - fix up Inventory.entries() | 343 | for path, entry in inv.entries(): | 
| 588
by Martin Pool - change inventory command to not show ids by default | 344 | if show_ids: | 
| 345 | print '%-50s %s' % (path, entry.file_id) | |
| 346 | else: | |
| 347 | print path | |
| 329
by Martin Pool - refactor command functions into command classes | 348 | |
| 349 | ||
| 350 | class cmd_move(Command): | |
| 351 | """Move files to a different directory. | |
| 352 | ||
| 353 |     examples:
 | |
| 354 |         bzr move *.txt doc
 | |
| 355 | ||
| 356 |     The destination must be a versioned directory in the same branch.
 | |
| 357 |     """
 | |
| 358 | takes_args = ['source$', 'dest'] | |
| 359 | def run(self, source_list, dest): | |
| 360 | b = Branch('.') | |
| 361 | ||
| 362 | b.move([b.relpath(s) for s in source_list], b.relpath(dest)) | |
| 363 | ||
| 364 | ||
| 365 | class cmd_rename(Command): | |
| 168
by mbp at sourcefrog new "rename" command | 366 | """Change the name of an entry. | 
| 367 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 368 |     examples:
 | 
| 369 |       bzr rename frob.c frobber.c
 | |
| 370 |       bzr rename src/frob.c lib/frob.c
 | |
| 371 | ||
| 372 |     It is an error if the destination name exists.
 | |
| 373 | ||
| 374 |     See also the 'move' command, which moves files into a different
 | |
| 375 |     directory without changing their name.
 | |
| 376 | ||
| 377 |     TODO: Some way to rename multiple files without invoking bzr for each
 | |
| 378 |     one?"""
 | |
| 329
by Martin Pool - refactor command functions into command classes | 379 | takes_args = ['from_name', 'to_name'] | 
| 168
by mbp at sourcefrog new "rename" command | 380 | |
| 329
by Martin Pool - refactor command functions into command classes | 381 | def run(self, from_name, to_name): | 
| 382 | b = Branch('.') | |
| 383 | b.rename_one(b.relpath(from_name), b.relpath(to_name)) | |
| 384 | ||
| 385 | ||
| 386 | ||
| 387 | class cmd_renames(Command): | |
| 164
by mbp at sourcefrog new 'renames' command | 388 | """Show list of renamed files. | 
| 389 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 390 |     TODO: Option to show renames between two historical versions.
 | 
| 391 | ||
| 392 |     TODO: Only show renames under dir, rather than in the whole branch.
 | |
| 393 |     """
 | |
| 329
by Martin Pool - refactor command functions into command classes | 394 | takes_args = ['dir?'] | 
| 395 | ||
| 396 | def run(self, dir='.'): | |
| 397 | b = Branch(dir) | |
| 398 | old_inv = b.basis_tree().inventory | |
| 399 | new_inv = b.read_working_inventory() | |
| 400 | ||
| 401 | renames = list(bzrlib.tree.find_renames(old_inv, new_inv)) | |
| 402 | renames.sort() | |
| 403 | for old_name, new_name in renames: | |
| 404 | print "%s => %s" % (old_name, new_name) | |
| 405 | ||
| 406 | ||
| 407 | class cmd_info(Command): | |
| 472
by Martin Pool - Optional branch parameter to info command | 408 | """Show statistical information about a branch.""" | 
| 409 | takes_args = ['branch?'] | |
| 410 | ||
| 411 | def run(self, branch=None): | |
| 329
by Martin Pool - refactor command functions into command classes | 412 | import info | 
| 472
by Martin Pool - Optional branch parameter to info command | 413 | |
| 414 | from branch import find_branch | |
| 415 | b = find_branch(branch) | |
| 416 | info.show_info(b) | |
| 329
by Martin Pool - refactor command functions into command classes | 417 | |
| 418 | ||
| 419 | class cmd_remove(Command): | |
| 420 | """Make a file unversioned. | |
| 421 | ||
| 422 |     This makes bzr stop tracking changes to a versioned file.  It does
 | |
| 423 |     not delete the working copy.
 | |
| 424 |     """
 | |
| 425 | takes_args = ['file+'] | |
| 426 | takes_options = ['verbose'] | |
| 427 | ||
| 428 | def run(self, file_list, verbose=False): | |
| 429 | b = Branch(file_list[0]) | |
| 430 | b.remove([b.relpath(f) for f in file_list], verbose=verbose) | |
| 431 | ||
| 432 | ||
| 433 | class cmd_file_id(Command): | |
| 178
by mbp at sourcefrog - Use a non-null file_id for the branch root directory. At the moment | 434 | """Print file_id of a particular file or directory. | 
| 435 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 436 |     The file_id is assigned when the file is first added and remains the
 | 
| 437 |     same through all revisions where the file exists, even when it is
 | |
| 438 |     moved or renamed.
 | |
| 439 |     """
 | |
| 329
by Martin Pool - refactor command functions into command classes | 440 | hidden = True | 
| 441 | takes_args = ['filename'] | |
| 442 | def run(self, filename): | |
| 443 | b = Branch(filename) | |
| 444 | i = b.inventory.path2id(b.relpath(filename)) | |
| 445 | if i == None: | |
| 446 | bailout("%r is not a versioned file" % filename) | |
| 447 | else: | |
| 448 | print i | |
| 449 | ||
| 450 | ||
| 451 | class cmd_file_path(Command): | |
| 178
by mbp at sourcefrog - Use a non-null file_id for the branch root directory. At the moment | 452 | """Print path of file_ids to a file or directory. | 
| 453 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 454 |     This prints one line for each directory down to the target,
 | 
| 455 |     starting at the branch root."""
 | |
| 329
by Martin Pool - refactor command functions into command classes | 456 | hidden = True | 
| 457 | takes_args = ['filename'] | |
| 458 | def run(self, filename): | |
| 459 | b = Branch(filename) | |
| 460 | inv = b.inventory | |
| 461 | fid = inv.path2id(b.relpath(filename)) | |
| 462 | if fid == None: | |
| 463 | bailout("%r is not a versioned file" % filename) | |
| 464 | for fip in inv.get_idpath(fid): | |
| 465 | print fip | |
| 466 | ||
| 467 | ||
| 468 | class cmd_revision_history(Command): | |
| 469 | """Display list of revision ids on this branch.""" | |
| 584
by Martin Pool - make relpath and revision-history hidden commands | 470 | hidden = True | 
| 329
by Martin Pool - refactor command functions into command classes | 471 | def run(self): | 
| 472 | for patchid in Branch('.').revision_history(): | |
| 473 | print patchid | |
| 474 | ||
| 475 | ||
| 476 | class cmd_directories(Command): | |
| 477 | """Display list of versioned directories in this branch.""" | |
| 478 | def run(self): | |
| 479 | for name, ie in Branch('.').read_working_inventory().directories(): | |
| 480 | if name == '': | |
| 481 | print '.' | |
| 482 | else: | |
| 483 | print name | |
| 484 | ||
| 485 | ||
| 486 | class cmd_init(Command): | |
| 487 | """Make a directory into a versioned branch. | |
| 488 | ||
| 489 |     Use this to create an empty branch, or before importing an
 | |
| 490 |     existing project.
 | |
| 491 | ||
| 492 |     Recipe for importing a tree of files:
 | |
| 493 |         cd ~/project
 | |
| 494 |         bzr init
 | |
| 495 |         bzr add -v .
 | |
| 496 |         bzr status
 | |
| 497 |         bzr commit -m 'imported project'
 | |
| 498 |     """
 | |
| 499 | def run(self): | |
| 500 | Branch('.', init=True) | |
| 501 | ||
| 502 | ||
| 503 | class cmd_diff(Command): | |
| 504 | """Show differences in working tree. | |
| 505 |     
 | |
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 506 |     If files are listed, only the changes in those files are listed.
 | 
| 507 |     Otherwise, all changes for the tree are listed.
 | |
| 508 | ||
| 509 |     TODO: Given two revision arguments, show the difference between them.
 | |
| 510 | ||
| 511 |     TODO: Allow diff across branches.
 | |
| 512 | ||
| 513 |     TODO: Option to use external diff command; could be GNU diff, wdiff,
 | |
| 514 |           or a graphical diff.
 | |
| 515 | ||
| 276
by Martin Pool Doc | 516 |     TODO: Python difflib is not exactly the same as unidiff; should
 | 
| 517 |           either fix it up or prefer to use an external diff.
 | |
| 518 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 519 |     TODO: If a directory is given, diff everything under that.
 | 
| 520 | ||
| 276
by Martin Pool Doc | 521 |     TODO: Selected-file diff is inefficient and doesn't show you
 | 
| 522 |           deleted files.
 | |
| 278
by Martin Pool - Better workaround for trailing newlines in diffs | 523 | |
| 524 |     TODO: This probably handles non-Unix newlines poorly.
 | |
| 329
by Martin Pool - refactor command functions into command classes | 525 |     """
 | 
| 526 | ||
| 527 | takes_args = ['file*'] | |
| 571
by Martin Pool - new --diff-options to pass options through to external | 528 | takes_options = ['revision', 'diff-options'] | 
| 350
by Martin Pool - refactor command aliases into command classes | 529 | aliases = ['di'] | 
| 329
by Martin Pool - refactor command functions into command classes | 530 | |
| 571
by Martin Pool - new --diff-options to pass options through to external | 531 | def run(self, revision=None, file_list=None, diff_options=None): | 
| 329
by Martin Pool - refactor command functions into command classes | 532 | from bzrlib.diff import show_diff | 
| 547
by Martin Pool - bzr diff finds a branch from the first parameter, | 533 | from bzrlib import find_branch | 
| 534 | ||
| 535 | if file_list: | |
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 536 | b = find_branch(file_list[0]) | 
| 547
by Martin Pool - bzr diff finds a branch from the first parameter, | 537 | file_list = [b.relpath(f) for f in file_list] | 
| 538 | if file_list == ['']: | |
| 539 |                 # just pointing to top-of-tree
 | |
| 540 | file_list = None | |
| 541 | else: | |
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 542 | b = Branch('.') | 
| 329
by Martin Pool - refactor command functions into command classes | 543 | |
| 571
by Martin Pool - new --diff-options to pass options through to external | 544 | show_diff(b, revision, specific_files=file_list, | 
| 545 | external_diff_options=diff_options) | |
| 329
by Martin Pool - refactor command functions into command classes | 546 | |
| 547 | ||
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 548 | |
| 549 | ||
| 550 | ||
| 329
by Martin Pool - refactor command functions into command classes | 551 | class cmd_deleted(Command): | 
| 135
by mbp at sourcefrog Simple new 'deleted' command | 552 | """List files deleted in the working tree. | 
| 553 | ||
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 554 |     TODO: Show files deleted since a previous revision, or between two revisions.
 | 
| 135
by mbp at sourcefrog Simple new 'deleted' command | 555 |     """
 | 
| 329
by Martin Pool - refactor command functions into command classes | 556 | def run(self, show_ids=False): | 
| 557 | b = Branch('.') | |
| 558 | old = b.basis_tree() | |
| 559 | new = b.working_tree() | |
| 560 | ||
| 561 |         ## TODO: Much more efficient way to do this: read in new
 | |
| 562 |         ## directories with readdir, rather than stating each one.  Same
 | |
| 563 |         ## level of effort but possibly much less IO.  (Or possibly not,
 | |
| 564 |         ## if the directories are very large...)
 | |
| 565 | ||
| 566 | for path, ie in old.inventory.iter_entries(): | |
| 567 | if not new.has_id(ie.file_id): | |
| 568 | if show_ids: | |
| 569 | print '%-50s %s' % (path, ie.file_id) | |
| 570 | else: | |
| 571 | print path | |
| 572 | ||
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 573 | |
| 574 | class cmd_modified(Command): | |
| 575 | """List files modified in working tree.""" | |
| 576 | hidden = True | |
| 577 | def run(self): | |
| 578 | import statcache | |
| 579 | b = Branch('.') | |
| 438
by Martin Pool - Avoid calling Inventory.iter_entries() when finding modified | 580 | inv = b.read_working_inventory() | 
| 581 | sc = statcache.update_cache(b, inv) | |
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 582 | basis = b.basis_tree() | 
| 583 | basis_inv = basis.inventory | |
| 438
by Martin Pool - Avoid calling Inventory.iter_entries() when finding modified | 584 | |
| 585 |         # We used to do this through iter_entries(), but that's slow
 | |
| 586 |         # when most of the files are unmodified, as is usually the
 | |
| 587 |         # case.  So instead we iterate by inventory entry, and only
 | |
| 588 |         # calculate paths as necessary.
 | |
| 589 | ||
| 590 | for file_id in basis_inv: | |
| 591 | cacheentry = sc.get(file_id) | |
| 592 | if not cacheentry: # deleted | |
| 593 |                 continue
 | |
| 594 | ie = basis_inv[file_id] | |
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 595 | if cacheentry[statcache.SC_SHA1] != ie.text_sha1: | 
| 438
by Martin Pool - Avoid calling Inventory.iter_entries() when finding modified | 596 | path = inv.id2path(file_id) | 
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 597 | print path | 
| 439
by Martin Pool - new command 'bzr added' | 598 | |
| 599 | ||
| 600 | ||
| 601 | class cmd_added(Command): | |
| 602 | """List files added in working tree.""" | |
| 603 | hidden = True | |
| 604 | def run(self): | |
| 605 | b = Branch('.') | |
| 606 | wt = b.working_tree() | |
| 607 | basis_inv = b.basis_tree().inventory | |
| 608 | inv = wt.inventory | |
| 609 | for file_id in inv: | |
| 610 | if file_id in basis_inv: | |
| 611 |                 continue
 | |
| 612 | path = inv.id2path(file_id) | |
| 613 | if not os.access(b.abspath(path), os.F_OK): | |
| 614 |                 continue
 | |
| 615 | print path | |
| 437
by Martin Pool - new command 'bzr modified' to exercise the statcache | 616 | |
| 617 | ||
| 618 | ||
| 329
by Martin Pool - refactor command functions into command classes | 619 | class cmd_root(Command): | 
| 620 | """Show the tree root directory. | |
| 621 | ||
| 622 |     The root is the nearest enclosing directory with a .bzr control
 | |
| 623 |     directory."""
 | |
| 624 | takes_args = ['filename?'] | |
| 625 | def run(self, filename=None): | |
| 626 | """Print the branch root.""" | |
| 416
by Martin Pool - bzr log and bzr root now accept an http URL | 627 | from branch import find_branch | 
| 628 | b = find_branch(filename) | |
| 629 | print getattr(b, 'base', None) or getattr(b, 'baseurl') | |
| 329
by Martin Pool - refactor command functions into command classes | 630 | |
| 631 | ||
| 632 | class cmd_log(Command): | |
| 1
by mbp at sourcefrog import from baz patch-364 | 633 | """Show log of this branch. | 
| 634 | ||
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 635 |     To request a range of logs, you can use the command -r begin:end
 | 
| 636 |     -r revision requests a specific revision, -r :end or -r begin: are
 | |
| 637 |     also valid.
 | |
| 638 | ||
| 639 |     TODO: Make --revision support uuid: and hash: [future tag:] notation.
 | |
| 640 |   
 | |
| 545
by Martin Pool - --forward option for log | 641 |     """
 | 
| 367
by Martin Pool - New --show-ids option for bzr log | 642 | |
| 378
by Martin Pool - New usage bzr log FILENAME | 643 | takes_args = ['filename?'] | 
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 644 | takes_options = ['forward', 'timezone', 'verbose', 'show-ids', 'revision'] | 
| 545
by Martin Pool - --forward option for log | 645 | |
| 646 | def run(self, filename=None, timezone='original', | |
| 647 | verbose=False, | |
| 648 | show_ids=False, | |
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 649 | forward=False, | 
| 650 | revision=None): | |
| 527
by Martin Pool - refactor log command | 651 | from bzrlib import show_log, find_branch | 
| 562
by Martin Pool - bug fix for printing logs containing unicode | 652 | import codecs | 
| 545
by Martin Pool - --forward option for log | 653 | |
| 654 | direction = (forward and 'forward') or 'reverse' | |
| 527
by Martin Pool - refactor log command | 655 | |
| 378
by Martin Pool - New usage bzr log FILENAME | 656 | if filename: | 
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 657 | b = find_branch(filename) | 
| 527
by Martin Pool - refactor log command | 658 | fp = b.relpath(filename) | 
| 533
by Martin Pool - fix up asking for the log for the root of a remote branch | 659 | if fp: | 
| 660 | file_id = b.read_working_inventory().path2id(fp) | |
| 661 | else: | |
| 662 | file_id = None # points to branch root | |
| 527
by Martin Pool - refactor log command | 663 | else: | 
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 664 | b = find_branch('.') | 
| 527
by Martin Pool - refactor log command | 665 | file_id = None | 
| 666 | ||
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 667 | if revision == None: | 
| 668 | revision = [None, None] | |
| 669 | elif isinstance(revision, int): | |
| 670 | revision = [revision, revision] | |
| 671 | else: | |
| 672 |             # pair of revisions?
 | |
| 673 |             pass
 | |
| 674 | ||
| 675 | assert len(revision) == 2 | |
| 676 | ||
| 562
by Martin Pool - bug fix for printing logs containing unicode | 677 | mutter('encoding log as %r' % bzrlib.user_encoding) | 
| 610
by Martin Pool - replace Branch.lock(mode) with separate lock_read and lock_write | 678 | |
| 679 |         # use 'replace' so that we don't abort if trying to write out
 | |
| 680 |         # in e.g. the default C locale.
 | |
| 681 | outf = codecs.getwriter(bzrlib.user_encoding)(sys.stdout, errors='replace') | |
| 562
by Martin Pool - bug fix for printing logs containing unicode | 682 | |
| 527
by Martin Pool - refactor log command | 683 | show_log(b, file_id, | 
| 684 | show_timezone=timezone, | |
| 685 | verbose=verbose, | |
| 686 | show_ids=show_ids, | |
| 562
by Martin Pool - bug fix for printing logs containing unicode | 687 | to_file=outf, | 
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 688 | direction=direction, | 
| 689 | start_revision=revision[0], | |
| 690 | end_revision=revision[1]) | |
| 329
by Martin Pool - refactor command functions into command classes | 691 | |
| 692 | ||
| 375
by Martin Pool - New command touching-revisions and function to trace | 693 | |
| 694 | class cmd_touching_revisions(Command): | |
| 523
by Martin Pool doc | 695 | """Return revision-ids which affected a particular file. | 
| 696 | ||
| 697 |     A more user-friendly interface is "bzr log FILE"."""
 | |
| 375
by Martin Pool - New command touching-revisions and function to trace | 698 | hidden = True | 
| 699 | takes_args = ["filename"] | |
| 700 | def run(self, filename): | |
| 580
by Martin Pool - Use explicit lock methods on a branch, rather than doing it | 701 | b = Branch(filename) | 
| 375
by Martin Pool - New command touching-revisions and function to trace | 702 | inv = b.read_working_inventory() | 
| 703 | file_id = inv.path2id(b.relpath(filename)) | |
| 704 | for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id): | |
| 705 | print "%6d %s" % (revno, what) | |
| 706 | ||
| 707 | ||
| 329
by Martin Pool - refactor command functions into command classes | 708 | class cmd_ls(Command): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 709 | """List files in a tree. | 
| 710 | ||
| 254
by Martin Pool - Doc cleanups from Magnus Therning | 711 |     TODO: Take a revision or remote path and list that tree instead.
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 712 |     """
 | 
| 329
by Martin Pool - refactor command functions into command classes | 713 | hidden = True | 
| 714 | def run(self, revision=None, verbose=False): | |
| 715 | b = Branch('.') | |
| 716 | if revision == None: | |
| 717 | tree = b.working_tree() | |
| 718 | else: | |
| 719 | tree = b.revision_tree(b.lookup_revision(revision)) | |
| 720 | ||
| 721 | for fp, fc, kind, fid in tree.list_files(): | |
| 722 | if verbose: | |
| 723 | if kind == 'directory': | |
| 724 | kindch = '/' | |
| 725 | elif kind == 'file': | |
| 726 | kindch = '' | |
| 727 | else: | |
| 728 | kindch = '???' | |
| 729 | ||
| 730 | print '%-8s %s%s' % (fc, fp, kindch) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 731 | else: | 
| 329
by Martin Pool - refactor command functions into command classes | 732 | print fp | 
| 733 | ||
| 734 | ||
| 735 | ||
| 736 | class cmd_unknowns(Command): | |
| 1
by mbp at sourcefrog import from baz patch-364 | 737 | """List unknown files""" | 
| 329
by Martin Pool - refactor command functions into command classes | 738 | def run(self): | 
| 739 | for f in Branch('.').unknowns(): | |
| 740 | print quotefn(f) | |
| 741 | ||
| 742 | ||
| 743 | ||
| 744 | class cmd_ignore(Command): | |
| 420
by Martin Pool Doc | 745 | """Ignore a command or pattern | 
| 746 | ||
| 747 |     To remove patterns from the ignore list, edit the .bzrignore file.
 | |
| 748 | ||
| 749 |     If the pattern contains a slash, it is compared to the whole path
 | |
| 750 |     from the branch root.  Otherwise, it is comapred to only the last
 | |
| 751 |     component of the path.
 | |
| 752 | ||
| 753 |     Ignore patterns are case-insensitive on case-insensitive systems.
 | |
| 754 | ||
| 755 |     Note: wildcards must be quoted from the shell on Unix.
 | |
| 756 | ||
| 757 |     examples:
 | |
| 758 |         bzr ignore ./Makefile
 | |
| 759 |         bzr ignore '*.class'
 | |
| 760 |     """
 | |
| 329
by Martin Pool - refactor command functions into command classes | 761 | takes_args = ['name_pattern'] | 
| 310
by Martin Pool - new 'bzr ignored' command! | 762 | |
| 329
by Martin Pool - refactor command functions into command classes | 763 | def run(self, name_pattern): | 
| 409
by Martin Pool - New AtomicFile class | 764 | from bzrlib.atomicfile import AtomicFile | 
| 575
by Martin Pool - cleanup imports | 765 | import os.path | 
| 409
by Martin Pool - New AtomicFile class | 766 | |
| 329
by Martin Pool - refactor command functions into command classes | 767 | b = Branch('.') | 
| 410
by Martin Pool - Fix ignore command and add tests | 768 | ifn = b.abspath('.bzrignore') | 
| 329
by Martin Pool - refactor command functions into command classes | 769 | |
| 410
by Martin Pool - Fix ignore command and add tests | 770 | if os.path.exists(ifn): | 
| 498
by Martin Pool bugfix for bzr ignore reported by ddaa: | 771 | f = open(ifn, 'rt') | 
| 772 | try: | |
| 773 | igns = f.read().decode('utf-8') | |
| 774 | finally: | |
| 775 | f.close() | |
| 409
by Martin Pool - New AtomicFile class | 776 | else: | 
| 777 | igns = '' | |
| 778 | ||
| 575
by Martin Pool - cleanup imports | 779 |         # TODO: If the file already uses crlf-style termination, maybe
 | 
| 780 |         # we should use that for the newly added lines?
 | |
| 781 | ||
| 409
by Martin Pool - New AtomicFile class | 782 | if igns and igns[-1] != '\n': | 
| 783 | igns += '\n' | |
| 784 | igns += name_pattern + '\n' | |
| 785 | ||
| 498
by Martin Pool bugfix for bzr ignore reported by ddaa: | 786 | try: | 
| 787 | f = AtomicFile(ifn, 'wt') | |
| 788 | f.write(igns.encode('utf-8')) | |
| 789 | f.commit() | |
| 790 | finally: | |
| 791 | f.close() | |
| 329
by Martin Pool - refactor command functions into command classes | 792 | |
| 793 | inv = b.working_tree().inventory | |
| 794 | if inv.path2id('.bzrignore'): | |
| 795 | mutter('.bzrignore is already versioned') | |
| 796 | else: | |
| 797 | mutter('need to make new .bzrignore file versioned') | |
| 798 | b.add(['.bzrignore']) | |
| 799 | ||
| 800 | ||
| 801 | ||
| 802 | class cmd_ignored(Command): | |
| 421
by Martin Pool doc | 803 | """List ignored files and the patterns that matched them. | 
| 804 | ||
| 805 |     See also: bzr ignore"""
 | |
| 329
by Martin Pool - refactor command functions into command classes | 806 | def run(self): | 
| 807 | tree = Branch('.').working_tree() | |
| 808 | for path, file_class, kind, file_id in tree.list_files(): | |
| 809 | if file_class != 'I': | |
| 810 |                 continue
 | |
| 811 |             ## XXX: Slightly inefficient since this was already calculated
 | |
| 812 | pat = tree.is_ignored(path) | |
| 813 | print '%-50s %s' % (path, pat) | |
| 814 | ||
| 815 | ||
| 816 | class cmd_lookup_revision(Command): | |
| 817 | """Lookup the revision-id from a revision-number | |
| 818 | ||
| 819 |     example:
 | |
| 820 |         bzr lookup-revision 33
 | |
| 421
by Martin Pool doc | 821 |     """
 | 
| 329
by Martin Pool - refactor command functions into command classes | 822 | hidden = True | 
| 338
by Martin Pool - cleanup of some imports | 823 | takes_args = ['revno'] | 
| 824 | ||
| 329
by Martin Pool - refactor command functions into command classes | 825 | def run(self, revno): | 
| 826 | try: | |
| 827 | revno = int(revno) | |
| 828 | except ValueError: | |
| 338
by Martin Pool - cleanup of some imports | 829 | raise BzrCommandError("not a valid revision-number: %r" % revno) | 
| 830 | ||
| 831 | print Branch('.').lookup_revision(revno) | |
| 329
by Martin Pool - refactor command functions into command classes | 832 | |
| 833 | ||
| 834 | class cmd_export(Command): | |
| 835 | """Export past revision to destination directory. | |
| 836 | ||
| 837 |     If no revision is specified this exports the last committed revision."""
 | |
| 838 | takes_args = ['dest'] | |
| 839 | takes_options = ['revision'] | |
| 394
by Martin Pool - Fix argument handling in export command | 840 | def run(self, dest, revision=None): | 
| 329
by Martin Pool - refactor command functions into command classes | 841 | b = Branch('.') | 
| 394
by Martin Pool - Fix argument handling in export command | 842 | if revision == None: | 
| 843 | rh = b.revision_history()[-1] | |
| 329
by Martin Pool - refactor command functions into command classes | 844 | else: | 
| 394
by Martin Pool - Fix argument handling in export command | 845 | rh = b.lookup_revision(int(revision)) | 
| 329
by Martin Pool - refactor command functions into command classes | 846 | t = b.revision_tree(rh) | 
| 847 | t.export(dest) | |
| 848 | ||
| 849 | ||
| 850 | class cmd_cat(Command): | |
| 851 | """Write a file's text from a previous revision.""" | |
| 852 | ||
| 853 | takes_options = ['revision'] | |
| 854 | takes_args = ['filename'] | |
| 855 | ||
| 856 | def run(self, filename, revision=None): | |
| 857 | if revision == None: | |
| 858 | raise BzrCommandError("bzr cat requires a revision number") | |
| 859 | b = Branch('.') | |
| 860 | b.print_file(b.relpath(filename), int(revision)) | |
| 861 | ||
| 862 | ||
| 863 | class cmd_local_time_offset(Command): | |
| 864 | """Show the offset in seconds from GMT to local time.""" | |
| 865 | hidden = True | |
| 866 | def run(self): | |
| 867 | print bzrlib.osutils.local_time_offset() | |
| 868 | ||
| 869 | ||
| 870 | ||
| 871 | class cmd_commit(Command): | |
| 872 | """Commit changes into a new revision. | |
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 873 | |
| 491
by Martin Pool - Selective commit! | 874 |     If selected files are specified, only changes to those files are
 | 
| 875 |     committed.  If a directory is specified then its contents are also
 | |
| 876 |     committed.
 | |
| 877 | ||
| 878 |     A selected-file commit may fail in some cases where the committed
 | |
| 879 |     tree would be invalid, such as trying to commit a file in a
 | |
| 880 |     newly-added directory that is not itself committed.
 | |
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 881 | |
| 882 |     TODO: Run hooks on tree to-be-committed, and after commit.
 | |
| 883 | ||
| 884 |     TODO: Strict commit that fails if there are unknown or deleted files.
 | |
| 885 |     """
 | |
| 491
by Martin Pool - Selective commit! | 886 | takes_args = ['selected*'] | 
| 389
by Martin Pool - new commit --file option! | 887 | takes_options = ['message', 'file', 'verbose'] | 
| 350
by Martin Pool - refactor command aliases into command classes | 888 | aliases = ['ci', 'checkin'] | 
| 889 | ||
| 505
by Martin Pool - commit is verbose by default | 890 | def run(self, message=None, file=None, verbose=True, selected_list=None): | 
| 485
by Martin Pool - move commit code into its own module | 891 | from bzrlib.commit import commit | 
| 892 | ||
| 389
by Martin Pool - new commit --file option! | 893 |         ## Warning: shadows builtin file()
 | 
| 894 | if not message and not file: | |
| 895 | raise BzrCommandError("please specify a commit message", | |
| 896 | ["use either --message or --file"]) | |
| 897 | elif message and file: | |
| 898 | raise BzrCommandError("please specify either --message or --file") | |
| 899 | ||
| 900 | if file: | |
| 901 | import codecs | |
| 902 | message = codecs.open(file, 'rt', bzrlib.user_encoding).read() | |
| 903 | ||
| 485
by Martin Pool - move commit code into its own module | 904 | b = Branch('.') | 
| 491
by Martin Pool - Selective commit! | 905 | commit(b, message, verbose=verbose, specific_files=selected_list) | 
| 329
by Martin Pool - refactor command functions into command classes | 906 | |
| 907 | ||
| 908 | class cmd_check(Command): | |
| 909 | """Validate consistency of branch history. | |
| 232
by mbp at sourcefrog Allow docstrings for help to be in PEP0257 format. | 910 | |
| 911 |     This command checks various invariants about the branch storage to
 | |
| 912 |     detect data corruption or bzr bugs.
 | |
| 913 |     """
 | |
| 329
by Martin Pool - refactor command functions into command classes | 914 | takes_args = ['dir?'] | 
| 915 | def run(self, dir='.'): | |
| 916 | import bzrlib.check | |
| 512
by Martin Pool - bzr check can be run from a branch subdirectory | 917 | bzrlib.check.check(Branch(dir)) | 
| 329
by Martin Pool - refactor command functions into command classes | 918 | |
| 919 | ||
| 920 | ||
| 921 | class cmd_whoami(Command): | |
| 922 | """Show bzr user id.""" | |
| 923 | takes_options = ['email'] | |
| 286
by Martin Pool - New bzr whoami --email option | 924 | |
| 329
by Martin Pool - refactor command functions into command classes | 925 | def run(self, email=False): | 
| 926 | if email: | |
| 927 | print bzrlib.osutils.user_email() | |
| 928 | else: | |
| 929 | print bzrlib.osutils.username() | |
| 930 | ||
| 931 | ||
| 932 | class cmd_selftest(Command): | |
| 55
by mbp at sourcefrog bzr selftest shows some counts of tests | 933 | """Run internal test suite""" | 
| 329
by Martin Pool - refactor command functions into command classes | 934 | hidden = True | 
| 935 | def run(self): | |
| 608
by Martin Pool - Split selftests out into a new module and start changing them | 936 | from bzrlib.selftest import selftest | 
| 937 | if selftest(): | |
| 938 | return 0 | |
| 939 | else: | |
| 515
by Martin Pool - bzr selftest: return shell false (1) if any tests fail | 940 | return 1 | 
| 55
by mbp at sourcefrog bzr selftest shows some counts of tests | 941 | |
| 329
by Martin Pool - refactor command functions into command classes | 942 | |
| 943 | ||
| 944 | class cmd_version(Command): | |
| 945 | """Show version of bzr""" | |
| 946 | def run(self): | |
| 947 | show_version() | |
| 948 | ||
| 949 | def show_version(): | |
| 950 | print "bzr (bazaar-ng) %s" % bzrlib.__version__ | |
| 605
by Martin Pool - patch from Lalo Martins to show version of bzr itself | 951 |     # is bzrlib itself in a branch?
 | 
| 606
by Martin Pool - new bzrlib.get_bzr_revision() tells about the history of | 952 | bzrrev = bzrlib.get_bzr_revision() | 
| 953 | if bzrrev: | |
| 954 | print " (bzr checkout, revision %d {%s})" % bzrrev | |
| 329
by Martin Pool - refactor command functions into command classes | 955 | print bzrlib.__copyright__ | 
| 956 | print "http://bazaar-ng.org/" | |
| 957 |     print
 | |
| 958 | print "bzr comes with ABSOLUTELY NO WARRANTY. bzr is free software, and" | |
| 959 | print "you may use, modify and redistribute it under the terms of the GNU" | |
| 960 | print "General Public License version 2 or later." | |
| 961 | ||
| 962 | ||
| 963 | class cmd_rocks(Command): | |
| 964 | """Statement of optimism.""" | |
| 965 | hidden = True | |
| 966 | def run(self): | |
| 967 | print "it sure does!" | |
| 968 | ||
| 493
by Martin Pool - Merge aaron's merge command | 969 | def parse_spec(spec): | 
| 970 | if '/@' in spec: | |
| 971 | parsed = spec.split('/@') | |
| 972 | assert len(parsed) == 2 | |
| 973 | if parsed[1] == "": | |
| 974 | parsed[1] = -1 | |
| 975 | else: | |
| 976 | parsed[1] = int(parsed[1]) | |
| 977 | assert parsed[1] >=0 | |
| 978 | else: | |
| 979 | parsed = [spec, None] | |
| 980 | return parsed | |
| 981 | ||
| 982 | class cmd_merge(Command): | |
| 983 | """Perform a three-way merge of trees.""" | |
| 984 | takes_args = ['other_spec', 'base_spec'] | |
| 985 | ||
| 986 | def run(self, other_spec, base_spec): | |
| 591
by Martin Pool - trim imports | 987 | from bzrlib.merge import merge | 
| 988 | merge(parse_spec(other_spec), parse_spec(base_spec)) | |
| 329
by Martin Pool - refactor command functions into command classes | 989 | |
| 990 | class cmd_assert_fail(Command): | |
| 991 | """Test reporting of assertion failures""" | |
| 992 | hidden = True | |
| 993 | def run(self): | |
| 994 | assert False, "always fails" | |
| 995 | ||
| 996 | ||
| 997 | class cmd_help(Command): | |
| 998 | """Show help on a command or other topic. | |
| 999 | ||
| 1000 |     For a list of all available commands, say 'bzr help commands'."""
 | |
| 1001 | takes_args = ['topic?'] | |
| 350
by Martin Pool - refactor command aliases into command classes | 1002 | aliases = ['?'] | 
| 329
by Martin Pool - refactor command functions into command classes | 1003 | |
| 1004 | def run(self, topic=None): | |
| 351
by Martin Pool - Split out help functions into bzrlib.help | 1005 | import help | 
| 1006 | help.help(topic) | |
| 1007 | ||
| 1
by mbp at sourcefrog import from baz patch-364 | 1008 | |
| 429
by Martin Pool - New command update-stat-cache for testing | 1009 | class cmd_update_stat_cache(Command): | 
| 1010 | """Update stat-cache mapping inodes to SHA-1 hashes. | |
| 1011 | ||
| 1012 |     For testing only."""
 | |
| 1013 | hidden = True | |
| 1014 | def run(self): | |
| 1015 | import statcache | |
| 1016 | b = Branch('.') | |
| 454
by Martin Pool - fix update-stat-cache command | 1017 | statcache.update_cache(b.base, b.read_working_inventory()) | 
| 429
by Martin Pool - New command update-stat-cache for testing | 1018 | |
| 1019 | ||
| 1
by mbp at sourcefrog import from baz patch-364 | 1020 | |
| 1021 | # list of all available options; the rhs can be either None for an
 | |
| 1022 | # option that takes no argument, or a constructor function that checks
 | |
| 1023 | # the type.
 | |
| 1024 | OPTIONS = { | |
| 1025 | 'all': None, | |
| 571
by Martin Pool - new --diff-options to pass options through to external | 1026 | 'diff-options': str, | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1027 | 'help': None, | 
| 389
by Martin Pool - new commit --file option! | 1028 | 'file': unicode, | 
| 545
by Martin Pool - --forward option for log | 1029 | 'forward': None, | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1030 | 'message': unicode, | 
| 594
by Martin Pool - add --no-recurse option for add command | 1031 | 'no-recurse': None, | 
| 137
by mbp at sourcefrog new --profile option | 1032 | 'profile': None, | 
| 567
by Martin Pool - New form 'bzr log -r FROM:TO' | 1033 | 'revision': _parse_revision_str, | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1034 | 'show-ids': None, | 
| 12
by mbp at sourcefrog new --timezone option for bzr log | 1035 | 'timezone': str, | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1036 | 'verbose': None, | 
| 1037 | 'version': None, | |
| 286
by Martin Pool - New bzr whoami --email option | 1038 | 'email': None, | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1039 |     }
 | 
| 1040 | ||
| 1041 | SHORT_OPTIONS = { | |
| 583
by Martin Pool - add -h as short name for --help | 1042 | 'F': 'file', | 
| 1043 | 'h': 'help', | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1044 | 'm': 'message', | 
| 1045 | 'r': 'revision', | |
| 1046 | 'v': 'verbose', | |
| 1047 | }
 | |
| 1048 | ||
| 1049 | ||
| 1050 | def parse_args(argv): | |
| 1051 | """Parse command line. | |
| 1052 |     
 | |
| 1053 |     Arguments and options are parsed at this level before being passed
 | |
| 1054 |     down to specific command handlers.  This routine knows, from a
 | |
| 1055 |     lookup table, something about the available options, what optargs
 | |
| 1056 |     they take, and which commands will accept them.
 | |
| 1057 | ||
| 31
by Martin Pool fix up parse_args doctest | 1058 |     >>> parse_args('--help'.split())
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1059 |     ([], {'help': True})
 | 
| 31
by Martin Pool fix up parse_args doctest | 1060 |     >>> parse_args('--version'.split())
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1061 |     ([], {'version': True})
 | 
| 31
by Martin Pool fix up parse_args doctest | 1062 |     >>> parse_args('status --all'.split())
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1063 |     (['status'], {'all': True})
 | 
| 31
by Martin Pool fix up parse_args doctest | 1064 |     >>> parse_args('commit --message=biter'.split())
 | 
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1065 |     (['commit'], {'message': u'biter'})
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1066 |     """
 | 
| 1067 | args = [] | |
| 1068 | opts = {} | |
| 1069 | ||
| 1070 |     # TODO: Maybe handle '--' to end options?
 | |
| 1071 | ||
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 1072 | while argv: | 
| 1073 | a = argv.pop(0) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1074 | if a[0] == '-': | 
| 264
by Martin Pool parse_args: option names must be ascii | 1075 |             # option names must not be unicode
 | 
| 1076 | a = str(a) | |
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1077 | optarg = None | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1078 | if a[1] == '-': | 
| 1079 | mutter(" got option %r" % a) | |
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1080 | if '=' in a: | 
| 1081 | optname, optarg = a[2:].split('=', 1) | |
| 1082 | else: | |
| 1083 | optname = a[2:] | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1084 | if optname not in OPTIONS: | 
| 1085 | bailout('unknown long option %r' % a) | |
| 1086 | else: | |
| 1087 | shortopt = a[1:] | |
| 1088 | if shortopt not in SHORT_OPTIONS: | |
| 1089 | bailout('unknown short option %r' % a) | |
| 1090 | optname = SHORT_OPTIONS[shortopt] | |
| 1091 | ||
| 1092 | if optname in opts: | |
| 1093 |                 # XXX: Do we ever want to support this, e.g. for -r?
 | |
| 1094 | bailout('repeated option %r' % a) | |
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1095 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1096 | optargfn = OPTIONS[optname] | 
| 1097 | if optargfn: | |
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1098 | if optarg == None: | 
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 1099 | if not argv: | 
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1100 | bailout('option %r needs an argument' % a) | 
| 1101 | else: | |
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 1102 | optarg = argv.pop(0) | 
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1103 | opts[optname] = optargfn(optarg) | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1104 | else: | 
| 17
by mbp at sourcefrog allow --option=ARG syntax | 1105 | if optarg != None: | 
| 1106 | bailout('option %r takes no argument' % optname) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1107 | opts[optname] = True | 
| 1108 | else: | |
| 1109 | args.append(a) | |
| 1110 | ||
| 1111 | return args, opts | |
| 1112 | ||
| 1113 | ||
| 1114 | ||
| 1115 | ||
| 329
by Martin Pool - refactor command functions into command classes | 1116 | def _match_argform(cmd, takes_args, args): | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1117 | argdict = {} | 
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 1118 | |
| 329
by Martin Pool - refactor command functions into command classes | 1119 |     # step through args and takes_args, allowing appropriate 0-many matches
 | 
| 1120 | for ap in takes_args: | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1121 | argname = ap[:-1] | 
| 1122 | if ap[-1] == '?': | |
| 62
by mbp at sourcefrog - new find_branch_root function; based on suggestion from aaron | 1123 | if args: | 
| 1124 | argdict[argname] = args.pop(0) | |
| 196
by mbp at sourcefrog selected-file diff | 1125 | elif ap[-1] == '*': # all remaining arguments | 
| 1126 | if args: | |
| 1127 | argdict[argname + '_list'] = args[:] | |
| 1128 | args = [] | |
| 1129 | else: | |
| 1130 | argdict[argname + '_list'] = None | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1131 | elif ap[-1] == '+': | 
| 1132 | if not args: | |
| 329
by Martin Pool - refactor command functions into command classes | 1133 | raise BzrCommandError("command %r needs one or more %s" | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1134 | % (cmd, argname.upper())) | 
| 1135 | else: | |
| 1136 | argdict[argname + '_list'] = args[:] | |
| 1137 | 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 | 1138 | elif ap[-1] == '$': # all but one | 
| 1139 | if len(args) < 2: | |
| 329
by Martin Pool - refactor command functions into command classes | 1140 | 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 | 1141 | % (cmd, argname.upper())) | 
| 1142 | argdict[argname + '_list'] = args[:-1] | |
| 1143 | args[:-1] = [] | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1144 | else: | 
| 1145 |             # just a plain arg
 | |
| 1146 | argname = ap | |
| 1147 | if not args: | |
| 329
by Martin Pool - refactor command functions into command classes | 1148 | raise BzrCommandError("command %r requires argument %s" | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1149 | % (cmd, argname.upper())) | 
| 1150 | else: | |
| 1151 | argdict[argname] = args.pop(0) | |
| 1152 | ||
| 1153 | if args: | |
| 329
by Martin Pool - refactor command functions into command classes | 1154 | raise BzrCommandError("extra argument to command %s: %s" | 
| 1155 | % (cmd, args[0])) | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1156 | |
| 1157 | return argdict | |
| 1158 | ||
| 1159 | ||
| 1160 | ||
| 1161 | def run_bzr(argv): | |
| 1162 | """Execute a command. | |
| 1163 | ||
| 1164 |     This is similar to main(), but without all the trappings for
 | |
| 245
by mbp at sourcefrog - control files always in utf-8-unix format | 1165 |     logging and error handling.  
 | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1166 |     """
 | 
| 251
by mbp at sourcefrog - factor out locale.getpreferredencoding() | 1167 | argv = [a.decode(bzrlib.user_encoding) for a in argv] | 
| 245
by mbp at sourcefrog - control files always in utf-8-unix format | 1168 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1169 | try: | 
| 26
by mbp at sourcefrog fix StopIteration error on python2.3(?) | 1170 | args, opts = parse_args(argv[1:]) | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1171 | if 'help' in opts: | 
| 351
by Martin Pool - Split out help functions into bzrlib.help | 1172 | import help | 
| 159
by mbp at sourcefrog bzr commit --help now works | 1173 | if args: | 
| 351
by Martin Pool - Split out help functions into bzrlib.help | 1174 | help.help(args[0]) | 
| 159
by mbp at sourcefrog bzr commit --help now works | 1175 | else: | 
| 351
by Martin Pool - Split out help functions into bzrlib.help | 1176 | help.help() | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1177 | return 0 | 
| 1178 | elif 'version' in opts: | |
| 336
by Martin Pool - fix up 'bzr --version' | 1179 | show_version() | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1180 | return 0 | 
| 265
by Martin Pool parse_args: command names must also be ascii | 1181 | cmd = str(args.pop(0)) | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1182 | except IndexError: | 
| 448
by Martin Pool - bzr with no command now shows help, not just an error | 1183 | import help | 
| 1184 | help.help() | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1185 | return 1 | 
| 448
by Martin Pool - bzr with no command now shows help, not just an error | 1186 | |
| 115
by mbp at sourcefrog todo | 1187 | |
| 351
by Martin Pool - Split out help functions into bzrlib.help | 1188 | canonical_cmd, cmd_class = get_cmd_class(cmd) | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1189 | |
| 137
by mbp at sourcefrog new --profile option | 1190 |     # global option
 | 
| 1191 | if 'profile' in opts: | |
| 1192 | profile = True | |
| 1193 | del opts['profile'] | |
| 1194 | else: | |
| 1195 | profile = False | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1196 | |
| 1197 |     # check options are reasonable
 | |
| 329
by Martin Pool - refactor command functions into command classes | 1198 | allowed = cmd_class.takes_options | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1199 | for oname in opts: | 
| 1200 | if oname not in allowed: | |
| 381
by Martin Pool - Better message when a wrong argument is given | 1201 | raise BzrCommandError("option '--%s' is not allowed for command %r" | 
| 329
by Martin Pool - refactor command functions into command classes | 1202 | % (oname, cmd)) | 
| 176
by mbp at sourcefrog New cat command contributed by janmar. | 1203 | |
| 137
by mbp at sourcefrog new --profile option | 1204 |     # mix arguments and options into one dictionary
 | 
| 329
by Martin Pool - refactor command functions into command classes | 1205 | cmdargs = _match_argform(cmd, cmd_class.takes_args, args) | 
| 1206 | cmdopts = {} | |
| 136
by mbp at sourcefrog new --show-ids option for 'deleted' command | 1207 | for k, v in opts.items(): | 
| 329
by Martin Pool - refactor command functions into command classes | 1208 | cmdopts[k.replace('-', '_')] = v | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1209 | |
| 137
by mbp at sourcefrog new --profile option | 1210 | if profile: | 
| 338
by Martin Pool - cleanup of some imports | 1211 | import hotshot, tempfile | 
| 239
by mbp at sourcefrog - remove profiler temporary file when done | 1212 | pffileno, pfname = tempfile.mkstemp() | 
| 1213 | try: | |
| 1214 | prof = hotshot.Profile(pfname) | |
| 329
by Martin Pool - refactor command functions into command classes | 1215 | ret = prof.runcall(cmd_class, cmdopts, cmdargs) or 0 | 
| 239
by mbp at sourcefrog - remove profiler temporary file when done | 1216 | prof.close() | 
| 1217 | ||
| 1218 | import hotshot.stats | |
| 1219 | stats = hotshot.stats.load(pfname) | |
| 1220 |             #stats.strip_dirs()
 | |
| 1221 | stats.sort_stats('time') | |
| 1222 |             ## XXX: Might like to write to stderr or the trace file instead but
 | |
| 1223 |             ## print_stats seems hardcoded to stdout
 | |
| 1224 | stats.print_stats(20) | |
| 1225 | ||
| 337
by Martin Pool - Clarify return codes from command objects | 1226 | return ret.status | 
| 239
by mbp at sourcefrog - remove profiler temporary file when done | 1227 | |
| 1228 | finally: | |
| 1229 | os.close(pffileno) | |
| 1230 | os.remove(pfname) | |
| 137
by mbp at sourcefrog new --profile option | 1231 | else: | 
| 500
by Martin Pool - fix return value from run_bzr | 1232 | return cmd_class(cmdopts, cmdargs).status | 
| 1
by mbp at sourcefrog import from baz patch-364 | 1233 | |
| 1234 | ||
| 359
by Martin Pool - pychecker fixups | 1235 | def _report_exception(summary, quiet=False): | 
| 267
by Martin Pool - better reporting of errors | 1236 | import traceback | 
| 1237 | log_error('bzr: ' + summary) | |
| 359
by Martin Pool - pychecker fixups | 1238 | bzrlib.trace.log_exception() | 
| 317
by Martin Pool - better error message for broken pipe | 1239 | |
| 1240 | if not quiet: | |
| 1241 | tb = sys.exc_info()[2] | |
| 1242 | exinfo = traceback.extract_tb(tb) | |
| 1243 | if exinfo: | |
| 1244 | sys.stderr.write(' at %s:%d in %s()\n' % exinfo[-1][:3]) | |
| 1245 | sys.stderr.write(' see ~/.bzr.log for debug information\n') | |
| 267
by Martin Pool - better reporting of errors | 1246 | |
| 1247 | ||
| 1248 | ||
| 1
by mbp at sourcefrog import from baz patch-364 | 1249 | def main(argv): | 
| 317
by Martin Pool - better error message for broken pipe | 1250 | import errno | 
| 1251 | ||
| 344
by Martin Pool - It's not an error to use the library without | 1252 | bzrlib.open_tracefile(argv) | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1253 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1254 | try: | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1255 | try: | 
| 337
by Martin Pool - Clarify return codes from command objects | 1256 | try: | 
| 1257 | return run_bzr(argv) | |
| 1258 | finally: | |
| 1259 |                 # do this here inside the exception wrappers to catch EPIPE
 | |
| 1260 | sys.stdout.flush() | |
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1261 | except BzrError, e: | 
| 329
by Martin Pool - refactor command functions into command classes | 1262 | quiet = isinstance(e, (BzrCommandError)) | 
| 359
by Martin Pool - pychecker fixups | 1263 | _report_exception('error: ' + e.args[0], quiet=quiet) | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1264 | if len(e.args) > 1: | 
| 1265 | for h in e.args[1]: | |
| 267
by Martin Pool - better reporting of errors | 1266 |                     # some explanation or hints
 | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1267 | log_error(' ' + h) | 
| 1268 | return 1 | |
| 267
by Martin Pool - better reporting of errors | 1269 | except AssertionError, e: | 
| 1270 | msg = 'assertion failed' | |
| 1271 | if str(e): | |
| 1272 | msg += ': ' + str(e) | |
| 359
by Martin Pool - pychecker fixups | 1273 | _report_exception(msg) | 
| 318
by Martin Pool - better error message for Ctrl-c | 1274 | return 2 | 
| 1275 | except KeyboardInterrupt, e: | |
| 359
by Martin Pool - pychecker fixups | 1276 | _report_exception('interrupted', quiet=True) | 
| 318
by Martin Pool - better error message for Ctrl-c | 1277 | return 2 | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1278 | except Exception, e: | 
| 317
by Martin Pool - better error message for broken pipe | 1279 | quiet = False | 
| 419
by Martin Pool - RemoteBranch.__str__ and repr | 1280 | if (isinstance(e, IOError) | 
| 1281 | and hasattr(e, 'errno') | |
| 1282 | and e.errno == errno.EPIPE): | |
| 317
by Martin Pool - better error message for broken pipe | 1283 | quiet = True | 
| 1284 | msg = 'broken pipe' | |
| 1285 | else: | |
| 1286 | msg = str(e).rstrip('\n') | |
| 359
by Martin Pool - pychecker fixups | 1287 | _report_exception(msg, quiet) | 
| 318
by Martin Pool - better error message for Ctrl-c | 1288 | return 2 | 
| 260
by Martin Pool - remove atexit() dependency for writing out execution times | 1289 | finally: | 
| 1290 | bzrlib.trace.close_trace() | |
| 1
by mbp at sourcefrog import from baz patch-364 | 1291 | |
| 1292 | ||
| 1293 | if __name__ == '__main__': | |
| 1294 | sys.exit(main(sys.argv)) |