~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-04-18 04:55:00 UTC
  • mfrom: (5784.2.1 754188-apport-test)
  • Revision ID: pqm@pqm.ubuntu.com-20110418045500-ce6lkgyiq7f47q43
(mbp) Rewrite test_report_bug_legacy away from using doctest (see bug
 764188) (Martin Pool)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
21
21
from bzrlib.lazy_import import lazy_import
22
22
lazy_import(globals(), """
23
23
import cStringIO
24
 
import itertools
25
 
import re
26
24
import sys
27
25
import time
28
26
 
330
328
        if revision_id is None and revision is None:
331
329
            raise errors.BzrCommandError('You must supply either'
332
330
                                         ' --revision or a revision_id')
333
 
        b = WorkingTree.open_containing(directory)[0].branch
 
331
 
 
332
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
334
333
 
335
334
        revisions = b.repository.revisions
336
335
        if revisions is None:
414
413
                self.outf.write(page_bytes[:header_end])
415
414
                page_bytes = data
416
415
            self.outf.write('\nPage %d\n' % (page_idx,))
417
 
            decomp_bytes = zlib.decompress(page_bytes)
418
 
            self.outf.write(decomp_bytes)
419
 
            self.outf.write('\n')
 
416
            if len(page_bytes) == 0:
 
417
                self.outf.write('(empty)\n');
 
418
            else:
 
419
                decomp_bytes = zlib.decompress(page_bytes)
 
420
                self.outf.write(decomp_bytes)
 
421
                self.outf.write('\n')
420
422
 
421
423
    def _dump_entries(self, trans, basename):
422
424
        try:
483
485
            d.destroy_workingtree()
484
486
 
485
487
 
 
488
class cmd_repair_workingtree(Command):
 
489
    __doc__ = """Reset the working tree state file.
 
490
 
 
491
    This is not meant to be used normally, but more as a way to recover from
 
492
    filesystem corruption, etc. This rebuilds the working inventory back to a
 
493
    'known good' state. Any new modifications (adding a file, renaming, etc)
 
494
    will be lost, though modified files will still be detected as such.
 
495
 
 
496
    Most users will want something more like "bzr revert" or "bzr update"
 
497
    unless the state file has become corrupted.
 
498
 
 
499
    By default this attempts to recover the current state by looking at the
 
500
    headers of the state file. If the state file is too corrupted to even do
 
501
    that, you can supply --revision to force the state of the tree.
 
502
    """
 
503
 
 
504
    takes_options = ['revision', 'directory',
 
505
        Option('force',
 
506
               help='Reset the tree even if it doesn\'t appear to be'
 
507
                    ' corrupted.'),
 
508
    ]
 
509
    hidden = True
 
510
 
 
511
    def run(self, revision=None, directory='.', force=False):
 
512
        tree, _ = WorkingTree.open_containing(directory)
 
513
        self.add_cleanup(tree.lock_tree_write().unlock)
 
514
        if not force:
 
515
            try:
 
516
                tree.check_state()
 
517
            except errors.BzrError:
 
518
                pass # There seems to be a real error here, so we'll reset
 
519
            else:
 
520
                # Refuse
 
521
                raise errors.BzrCommandError(
 
522
                    'The tree does not appear to be corrupt. You probably'
 
523
                    ' want "bzr revert" instead. Use "--force" if you are'
 
524
                    ' sure you want to reset the working tree.')
 
525
        if revision is None:
 
526
            revision_ids = None
 
527
        else:
 
528
            revision_ids = [r.as_revision_id(tree.branch) for r in revision]
 
529
        try:
 
530
            tree.reset_state(revision_ids)
 
531
        except errors.BzrError, e:
 
532
            if revision_ids is None:
 
533
                extra = (', the header appears corrupt, try passing -r -1'
 
534
                         ' to set the state to the last commit')
 
535
            else:
 
536
                extra = ''
 
537
            raise errors.BzrCommandError('failed to reset the tree state'
 
538
                                         + extra)
 
539
 
 
540
 
486
541
class cmd_revno(Command):
487
542
    __doc__ = """Show current revision number.
488
543
 
1017
1072
            log.show_branch_change(
1018
1073
                branch_to, self.outf, result.old_revno,
1019
1074
                result.old_revid)
 
1075
        if getattr(result, 'tag_conflicts', None):
 
1076
            return 1
 
1077
        else:
 
1078
            return 0
1020
1079
 
1021
1080
 
1022
1081
class cmd_push(Command):
1963
2022
            type=unicode,
1964
2023
            ),
1965
2024
        RegistryOption('format',
 
2025
            short_name='F',
1966
2026
            help='Diff format to use.',
1967
2027
            lazy_registry=('bzrlib.diff', 'format_registry'),
1968
 
            value_switches=False, title='Diff format'),
 
2028
            title='Diff format'),
1969
2029
        ]
1970
2030
    aliases = ['di', 'dif']
1971
2031
    encoding_type = 'exact'
2052
2112
    @display_command
2053
2113
    def run(self, null=False, directory=u'.'):
2054
2114
        tree = WorkingTree.open_containing(directory)[0]
 
2115
        self.add_cleanup(tree.lock_read().unlock)
2055
2116
        td = tree.changes_from(tree.basis_tree())
 
2117
        self.cleanup_now()
2056
2118
        for path, id, kind, text_modified, meta_modified in td.modified:
2057
2119
            if null:
2058
2120
                self.outf.write(path + '\0')
2726
2788
            bzr ignore "RE:(?!debian/).*"
2727
2789
        
2728
2790
        Ignore everything except the "local" toplevel directory,
2729
 
        but always ignore "*~" autosave files, even under local/::
 
2791
        but always ignore autosave files ending in ~, even under local/::
2730
2792
        
2731
2793
            bzr ignore "*"
2732
2794
            bzr ignore "!./local"
2860
2922
         zip                          .zip
2861
2923
      =================       =========================
2862
2924
    """
 
2925
    encoding = 'exact'
2863
2926
    takes_args = ['dest', 'branch_or_subdir?']
2864
2927
    takes_options = ['directory',
2865
2928
        Option('format',
3043
3106
      to trigger updates to external systems like bug trackers. The --fixes
3044
3107
      option can be used to record the association between a revision and
3045
3108
      one or more bugs. See ``bzr help bugs`` for details.
3046
 
 
3047
 
      A selective commit may fail in some cases where the committed
3048
 
      tree would be invalid. Consider::
3049
 
  
3050
 
        bzr init foo
3051
 
        mkdir foo/bar
3052
 
        bzr add foo/bar
3053
 
        bzr commit foo -m "committing foo"
3054
 
        bzr mv foo/bar foo/baz
3055
 
        mkdir foo/bar
3056
 
        bzr add foo/bar
3057
 
        bzr commit foo/bar -m "committing bar but not baz"
3058
 
  
3059
 
      In the example above, the last commit will fail by design. This gives
3060
 
      the user the opportunity to decide whether they want to commit the
3061
 
      rename at the same time, separately first, or not at all. (As a general
3062
 
      rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3063
3109
    """
3064
 
    # TODO: Run hooks on tree to-be-committed, and after commit.
3065
 
 
3066
 
    # TODO: Strict commit that fails if there are deleted files.
3067
 
    #       (what does "deleted files" mean ??)
3068
 
 
3069
 
    # TODO: Give better message for -s, --summary, used by tla people
3070
 
 
3071
 
    # XXX: verbose currently does nothing
3072
3110
 
3073
3111
    _see_also = ['add', 'bugs', 'hooks', 'uncommit']
3074
3112
    takes_args = ['selected*']
3106
3144
             Option('show-diff', short_name='p',
3107
3145
                    help='When no message is supplied, show the diff along'
3108
3146
                    ' with the status summary in the message editor.'),
 
3147
             Option('lossy', 
 
3148
                    help='When committing to a foreign version control '
 
3149
                    'system do not push data that can not be natively '
 
3150
                    'represented.'),
3109
3151
             ]
3110
3152
    aliases = ['ci', 'checkin']
3111
3153
 
3130
3172
 
3131
3173
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3132
3174
            unchanged=False, strict=False, local=False, fixes=None,
3133
 
            author=None, show_diff=False, exclude=None, commit_time=None):
 
3175
            author=None, show_diff=False, exclude=None, commit_time=None,
 
3176
            lossy=False):
3134
3177
        from bzrlib.errors import (
3135
3178
            PointlessCommit,
3136
3179
            ConflictsInTree,
3150
3193
                raise errors.BzrCommandError(
3151
3194
                    "Could not parse --commit-time: " + str(e))
3152
3195
 
3153
 
        # TODO: Need a blackbox test for invoking the external editor; may be
3154
 
        # slightly problematic to run this cross-platform.
3155
 
 
3156
 
        # TODO: do more checks that the commit will succeed before
3157
 
        # spending the user's valuable time typing a commit message.
3158
 
 
3159
3196
        properties = {}
3160
3197
 
3161
3198
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3238
3275
                        reporter=None, verbose=verbose, revprops=properties,
3239
3276
                        authors=author, timestamp=commit_stamp,
3240
3277
                        timezone=offset,
3241
 
                        exclude=tree.safe_relpath_files(exclude))
 
3278
                        exclude=tree.safe_relpath_files(exclude),
 
3279
                        lossy=lossy)
3242
3280
        except PointlessCommit:
3243
3281
            raise errors.BzrCommandError("No changes to commit."
3244
 
                              " Use --unchanged to commit anyhow.")
 
3282
                " Please 'bzr add' the files you want to commit, or use"
 
3283
                " --unchanged to force an empty commit.")
3245
3284
        except ConflictsInTree:
3246
3285
            raise errors.BzrCommandError('Conflicts detected in working '
3247
3286
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3328
3367
 
3329
3368
 
3330
3369
class cmd_upgrade(Command):
3331
 
    __doc__ = """Upgrade branch storage to current format.
3332
 
 
3333
 
    The check command or bzr developers may sometimes advise you to run
3334
 
    this command. When the default format has changed you may also be warned
3335
 
    during other operations to upgrade.
 
3370
    __doc__ = """Upgrade a repository, branch or working tree to a newer format.
 
3371
 
 
3372
    When the default format has changed after a major new release of
 
3373
    Bazaar, you may be informed during certain operations that you
 
3374
    should upgrade. Upgrading to a newer format may improve performance
 
3375
    or make new features available. It may however limit interoperability
 
3376
    with older repositories or with older versions of Bazaar.
 
3377
 
 
3378
    If you wish to upgrade to a particular format rather than the
 
3379
    current default, that can be specified using the --format option.
 
3380
    As a consequence, you can use the upgrade command this way to
 
3381
    "downgrade" to an earlier format, though some conversions are
 
3382
    a one way process (e.g. changing from the 1.x default to the
 
3383
    2.x default) so downgrading is not always possible.
 
3384
 
 
3385
    A backup.bzr.~#~ directory is created at the start of the conversion
 
3386
    process (where # is a number). By default, this is left there on
 
3387
    completion. If the conversion fails, delete the new .bzr directory
 
3388
    and rename this one back in its place. Use the --clean option to ask
 
3389
    for the backup.bzr directory to be removed on successful conversion.
 
3390
    Alternatively, you can delete it by hand if everything looks good
 
3391
    afterwards.
 
3392
 
 
3393
    If the location given is a shared repository, dependent branches
 
3394
    are also converted provided the repository converts successfully.
 
3395
    If the conversion of a branch fails, remaining branches are still
 
3396
    tried.
 
3397
 
 
3398
    For more information on upgrades, see the Bazaar Upgrade Guide,
 
3399
    http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3336
3400
    """
3337
3401
 
3338
 
    _see_also = ['check']
 
3402
    _see_also = ['check', 'reconcile', 'formats']
3339
3403
    takes_args = ['url?']
3340
3404
    takes_options = [
3341
 
                    RegistryOption('format',
3342
 
                        help='Upgrade to a specific format.  See "bzr help'
3343
 
                             ' formats" for details.',
3344
 
                        lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3345
 
                        converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3346
 
                        value_switches=True, title='Branch format'),
3347
 
                    ]
 
3405
        RegistryOption('format',
 
3406
            help='Upgrade to a specific format.  See "bzr help'
 
3407
                 ' formats" for details.',
 
3408
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3409
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
 
3410
            value_switches=True, title='Branch format'),
 
3411
        Option('clean',
 
3412
            help='Remove the backup.bzr directory if successful.'),
 
3413
        Option('dry-run',
 
3414
            help="Show what would be done, but don't actually do anything."),
 
3415
    ]
3348
3416
 
3349
 
    def run(self, url='.', format=None):
 
3417
    def run(self, url='.', format=None, clean=False, dry_run=False):
3350
3418
        from bzrlib.upgrade import upgrade
3351
 
        upgrade(url, format)
 
3419
        exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
 
3420
        if exceptions:
 
3421
            if len(exceptions) == 1:
 
3422
                # Compatibility with historical behavior
 
3423
                raise exceptions[0]
 
3424
            else:
 
3425
                return 3
3352
3426
 
3353
3427
 
3354
3428
class cmd_whoami(Command):
3390
3464
                self.outf.write(c.username() + '\n')
3391
3465
            return
3392
3466
 
 
3467
        if email:
 
3468
            raise errors.BzrCommandError("--email can only be used to display existing "
 
3469
                                         "identity")
 
3470
 
3393
3471
        # display a warning if an email address isn't included in the given name.
3394
3472
        try:
3395
3473
            _mod_config.extract_email_address(name)
3749
3827
    with bzr send. If neither is specified, the default is the upstream branch
3750
3828
    or the branch most recently merged using --remember.
3751
3829
 
3752
 
    When merging a branch, by default the tip will be merged. To pick a different
3753
 
    revision, pass --revision. If you specify two values, the first will be used as
3754
 
    BASE and the second one as OTHER. Merging individual revisions, or a subset of
3755
 
    available revisions, like this is commonly referred to as "cherrypicking".
3756
 
 
3757
 
    Revision numbers are always relative to the branch being merged.
3758
 
 
3759
 
    By default, bzr will try to merge in all new work from the other
3760
 
    branch, automatically determining an appropriate base.  If this
3761
 
    fails, you may need to give an explicit base.
 
3830
    When merging from a branch, by default bzr will try to merge in all new
 
3831
    work from the other branch, automatically determining an appropriate base
 
3832
    revision.  If this fails, you may need to give an explicit base.
 
3833
 
 
3834
    To pick a different ending revision, pass "--revision OTHER".  bzr will
 
3835
    try to merge in all new work up to and including revision OTHER.
 
3836
 
 
3837
    If you specify two values, "--revision BASE..OTHER", only revisions BASE
 
3838
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
 
3839
    causes some revisions to be skipped, i.e. if the destination branch does
 
3840
    not already contain revision BASE, such a merge is commonly referred to as
 
3841
    a "cherrypick".
 
3842
 
 
3843
    Revision numbers are always relative to the source branch.
3762
3844
 
3763
3845
    Merge will do its best to combine the changes in two branches, but there
3764
3846
    are some kinds of problems only a human can fix.  When it encounters those,
3788
3870
    you to apply each diff hunk and file change, similar to "shelve".
3789
3871
 
3790
3872
    :Examples:
3791
 
        To merge the latest revision from bzr.dev::
 
3873
        To merge all new revisions from bzr.dev::
3792
3874
 
3793
3875
            bzr merge ../bzr.dev
3794
3876
 
4028
4110
        if ((remember or tree.branch.get_submit_branch() is None) and
4029
4111
             user_location is not None):
4030
4112
            tree.branch.set_submit_branch(other_branch.base)
4031
 
        _merge_tags_if_possible(other_branch, tree.branch)
 
4113
        # Merge tags (but don't set them in the master branch yet, the user
 
4114
        # might revert this merge).  Commit will propagate them.
 
4115
        _merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
4032
4116
        merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4033
4117
            other_revision_id, base_revision_id, other_branch, base_branch)
4034
4118
        if other_path != '':
4202
4286
    last committed revision is used.
4203
4287
 
4204
4288
    To remove only some changes, without reverting to a prior version, use
4205
 
    merge instead.  For example, "merge . --revision -2..-3" will remove the
4206
 
    changes introduced by -2, without affecting the changes introduced by -1.
4207
 
    Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
 
4289
    merge instead.  For example, "merge . -r -2..-3" (don't forget the ".")
 
4290
    will remove the changes introduced by the second last commit (-2), without
 
4291
    affecting the changes introduced by the last commit (-1).  To remove
 
4292
    certain changes on a hunk-by-hunk basis, see the shelve command.
4208
4293
 
4209
4294
    By default, any files that have been manually changed will be backed up
4210
4295
    first.  (Files changed only by merge are not backed up.)  Backup files have
4240
4325
    target branches.
4241
4326
    """
4242
4327
 
4243
 
    _see_also = ['cat', 'export']
 
4328
    _see_also = ['cat', 'export', 'merge', 'shelve']
4244
4329
    takes_options = [
4245
4330
        'revision',
4246
4331
        Option('no-backup', "Do not save backups of reverted files."),
4539
4624
 
4540
4625
    @display_command
4541
4626
    def run(self, verbose=False):
4542
 
        import bzrlib.plugin
4543
 
        from inspect import getdoc
4544
 
        result = []
4545
 
        for name, plugin in bzrlib.plugin.plugins().items():
4546
 
            version = plugin.__version__
4547
 
            if version == 'unknown':
4548
 
                version = ''
4549
 
            name_ver = '%s %s' % (name, version)
4550
 
            d = getdoc(plugin.module)
4551
 
            if d:
4552
 
                doc = d.split('\n')[0]
4553
 
            else:
4554
 
                doc = '(no description)'
4555
 
            result.append((name_ver, doc, plugin.path()))
4556
 
        for name_ver, doc, path in sorted(result):
4557
 
            self.outf.write("%s\n" % name_ver)
4558
 
            self.outf.write("   %s\n" % doc)
4559
 
            if verbose:
4560
 
                self.outf.write("   %s\n" % path)
4561
 
            self.outf.write("\n")
 
4627
        from bzrlib import plugin
 
4628
        self.outf.writelines(
 
4629
            plugin.describe_plugins(show_paths=verbose))
4562
4630
 
4563
4631
 
4564
4632
class cmd_testament(Command):
4626
4694
            self.add_cleanup(branch.lock_read().unlock)
4627
4695
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4628
4696
        self.add_cleanup(tree.lock_read().unlock)
4629
 
        if wt is not None:
 
4697
        if wt is not None and revision is None:
4630
4698
            file_id = wt.path2id(relpath)
4631
4699
        else:
4632
4700
            file_id = tree.path2id(relpath)
4633
4701
        if file_id is None:
4634
4702
            raise errors.NotVersionedError(filename)
4635
 
        file_version = tree.inventory[file_id].revision
4636
4703
        if wt is not None and revision is None:
4637
4704
            # If there is a tree and we're not annotating historical
4638
4705
            # versions, annotate the working tree's content.
4639
4706
            annotate_file_tree(wt, file_id, self.outf, long, all,
4640
4707
                show_ids=show_ids)
4641
4708
        else:
 
4709
            file_version = tree.inventory[file_id].revision
4642
4710
            annotate_file(branch, file_version, file_id, long, all, self.outf,
4643
4711
                          show_ids=show_ids)
4644
4712
 
5440
5508
    takes_options = [
5441
5509
        custom_help('directory',
5442
5510
            help='Branch whose tags should be displayed.'),
5443
 
        RegistryOption.from_kwargs('sort',
 
5511
        RegistryOption('sort',
5444
5512
            'Sort tags by different criteria.', title='Sorting',
5445
 
            natural='Sort numeric substrings as numbers:'
5446
 
                    ' suitable for version numbers. (default)',
5447
 
            alpha='Sort tags lexicographically.',
5448
 
            time='Sort tags chronologically.',
 
5513
            lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5449
5514
            ),
5450
5515
        'show-ids',
5451
5516
        'revision',
5452
5517
    ]
5453
5518
 
5454
5519
    @display_command
5455
 
    def run(self,
5456
 
            directory='.',
5457
 
            sort='natural',
5458
 
            show_ids=False,
5459
 
            revision=None,
5460
 
            ):
 
5520
    def run(self, directory='.', sort=None, show_ids=False, revision=None):
 
5521
        from bzrlib.tag import tag_sort_methods
5461
5522
        branch, relpath = Branch.open_containing(directory)
5462
5523
 
5463
5524
        tags = branch.tags.get_tag_dict().items()
5472
5533
            # only show revisions between revid1 and revid2 (inclusive)
5473
5534
            tags = [(tag, revid) for tag, revid in tags if
5474
5535
                graph.is_between(revid, revid1, revid2)]
5475
 
        if sort == 'natural':
5476
 
            def natural_sort_key(tag):
5477
 
                return [f(s) for f,s in 
5478
 
                        zip(itertools.cycle((unicode.lower,int)),
5479
 
                                            re.split('([0-9]+)', tag[0]))]
5480
 
            tags.sort(key=natural_sort_key)
5481
 
        elif sort == 'alpha':
5482
 
            tags.sort()
5483
 
        elif sort == 'time':
5484
 
            timestamps = {}
5485
 
            for tag, revid in tags:
5486
 
                try:
5487
 
                    revobj = branch.repository.get_revision(revid)
5488
 
                except errors.NoSuchRevision:
5489
 
                    timestamp = sys.maxint # place them at the end
5490
 
                else:
5491
 
                    timestamp = revobj.timestamp
5492
 
                timestamps[revid] = timestamp
5493
 
            tags.sort(key=lambda x: timestamps[x[1]])
 
5536
        if sort is None:
 
5537
            sort = tag_sort_methods.get()
 
5538
        sort(branch, tags)
5494
5539
        if not show_ids:
5495
5540
            # [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5496
5541
            for index, (tag, revid) in enumerate(tags):
5498
5543
                    revno = branch.revision_id_to_dotted_revno(revid)
5499
5544
                    if isinstance(revno, tuple):
5500
5545
                        revno = '.'.join(map(str, revno))
5501
 
                except errors.NoSuchRevision:
 
5546
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5502
5547
                    # Bad tag data/merges can lead to tagged revisions
5503
5548
                    # which are not in this branch. Fail gracefully ...
5504
5549
                    revno = '?'
5894
5939
            location = "."
5895
5940
        branch = Branch.open_containing(location)[0]
5896
5941
        branch.bzrdir.destroy_branch()
5897
 
        
 
5942
 
5898
5943
 
5899
5944
class cmd_shelve(Command):
5900
5945
    __doc__ = """Temporarily set aside some changes from the current tree.
5951
5996
    _see_also = ['unshelve', 'configuration']
5952
5997
 
5953
5998
    def run(self, revision=None, all=False, file_list=None, message=None,
5954
 
            writer=None, list=False, destroy=False, directory=u'.'):
 
5999
            writer=None, list=False, destroy=False, directory=None):
5955
6000
        if list:
5956
 
            return self.run_for_list()
 
6001
            return self.run_for_list(directory=directory)
5957
6002
        from bzrlib.shelf_ui import Shelver
5958
6003
        if writer is None:
5959
6004
            writer = bzrlib.option.diff_writer_registry.get()
5967
6012
        except errors.UserAbort:
5968
6013
            return 0
5969
6014
 
5970
 
    def run_for_list(self):
5971
 
        tree = WorkingTree.open_containing('.')[0]
 
6015
    def run_for_list(self, directory=None):
 
6016
        if directory is None:
 
6017
            directory = u'.'
 
6018
        tree = WorkingTree.open_containing(directory)[0]
5972
6019
        self.add_cleanup(tree.lock_read().unlock)
5973
6020
        manager = tree.get_shelf_manager()
5974
6021
        shelves = manager.active_shelves()
6033
6080
    """
6034
6081
    takes_options = ['directory',
6035
6082
                     Option('ignored', help='Delete all ignored files.'),
6036
 
                     Option('detritus', help='Delete conflict files, merge'
 
6083
                     Option('detritus', help='Delete conflict files, merge and revert'
6037
6084
                            ' backups, and failed selftest dirs.'),
6038
6085
                     Option('unknown',
6039
6086
                            help='Delete files unknown to bzr (default).'),