~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Jared Bunting
  • Date: 2010-10-21 22:27:43 UTC
  • mto: This revision was merged to the branch mainline in revision 5514.
  • Revision ID: jared.bunting@peachjean.com-20101021222743-tn9n0cgzg3z8cb25
Changed _win32_local_path_from_url to not allow "file:///C:" form.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 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
24
26
import sys
25
27
import time
26
28
 
328
330
        if revision_id is None and revision is None:
329
331
            raise errors.BzrCommandError('You must supply either'
330
332
                                         ' --revision or a revision_id')
331
 
 
332
 
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
 
333
        b = WorkingTree.open_containing(directory)[0].branch
333
334
 
334
335
        revisions = b.repository.revisions
335
336
        if revisions is None:
413
414
                self.outf.write(page_bytes[:header_end])
414
415
                page_bytes = data
415
416
            self.outf.write('\nPage %d\n' % (page_idx,))
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')
 
417
            decomp_bytes = zlib.decompress(page_bytes)
 
418
            self.outf.write(decomp_bytes)
 
419
            self.outf.write('\n')
422
420
 
423
421
    def _dump_entries(self, trans, basename):
424
422
        try:
485
483
            d.destroy_workingtree()
486
484
 
487
485
 
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
 
 
541
486
class cmd_revno(Command):
542
487
    __doc__ = """Show current revision number.
543
488
 
1072
1017
            log.show_branch_change(
1073
1018
                branch_to, self.outf, result.old_revno,
1074
1019
                result.old_revid)
1075
 
        if getattr(result, 'tag_conflicts', None):
1076
 
            return 1
1077
 
        else:
1078
 
            return 0
1079
1020
 
1080
1021
 
1081
1022
class cmd_push(Command):
1205
1146
 
1206
1147
    To retrieve the branch as of a particular revision, supply the --revision
1207
1148
    parameter, as in "branch foo/bar -r 5".
1208
 
 
1209
 
    The synonyms 'clone' and 'get' for this command are deprecated.
1210
1149
    """
1211
1150
 
1212
1151
    _see_also = ['checkout']
1242
1181
            files_from=None):
1243
1182
        from bzrlib import switch as _mod_switch
1244
1183
        from bzrlib.tag import _merge_tags_if_possible
1245
 
        if self.invoked_as in ['get', 'clone']:
1246
 
            ui.ui_factory.show_user_warning(
1247
 
                'deprecated_command',
1248
 
                deprecated_name=self.invoked_as,
1249
 
                recommended_name='branch',
1250
 
                deprecated_in_version='2.4')
1251
1184
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1252
1185
            from_location)
1253
1186
        if not (hardlink or files_from):
2030
1963
            type=unicode,
2031
1964
            ),
2032
1965
        RegistryOption('format',
2033
 
            short_name='F',
2034
1966
            help='Diff format to use.',
2035
1967
            lazy_registry=('bzrlib.diff', 'format_registry'),
2036
 
            title='Diff format'),
 
1968
            value_switches=False, title='Diff format'),
2037
1969
        ]
2038
1970
    aliases = ['di', 'dif']
2039
1971
    encoding_type = 'exact'
2120
2052
    @display_command
2121
2053
    def run(self, null=False, directory=u'.'):
2122
2054
        tree = WorkingTree.open_containing(directory)[0]
2123
 
        self.add_cleanup(tree.lock_read().unlock)
2124
2055
        td = tree.changes_from(tree.basis_tree())
2125
 
        self.cleanup_now()
2126
2056
        for path, id, kind, text_modified, meta_modified in td.modified:
2127
2057
            if null:
2128
2058
                self.outf.write(path + '\0')
2796
2726
            bzr ignore "RE:(?!debian/).*"
2797
2727
        
2798
2728
        Ignore everything except the "local" toplevel directory,
2799
 
        but always ignore autosave files ending in ~, even under local/::
 
2729
        but always ignore "*~" autosave files, even under local/::
2800
2730
        
2801
2731
            bzr ignore "*"
2802
2732
            bzr ignore "!./local"
2930
2860
         zip                          .zip
2931
2861
      =================       =========================
2932
2862
    """
2933
 
    encoding = 'exact'
2934
2863
    takes_args = ['dest', 'branch_or_subdir?']
2935
2864
    takes_options = ['directory',
2936
2865
        Option('format',
3114
3043
      to trigger updates to external systems like bug trackers. The --fixes
3115
3044
      option can be used to record the association between a revision and
3116
3045
      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.)
3117
3063
    """
 
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
3118
3072
 
3119
3073
    _see_also = ['add', 'bugs', 'hooks', 'uncommit']
3120
3074
    takes_args = ['selected*']
3152
3106
             Option('show-diff', short_name='p',
3153
3107
                    help='When no message is supplied, show the diff along'
3154
3108
                    ' with the status summary in the message editor.'),
3155
 
             Option('lossy', 
3156
 
                    help='When committing to a foreign version control '
3157
 
                    'system do not push data that can not be natively '
3158
 
                    'represented.'),
3159
3109
             ]
3160
3110
    aliases = ['ci', 'checkin']
3161
3111
 
3180
3130
 
3181
3131
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3182
3132
            unchanged=False, strict=False, local=False, fixes=None,
3183
 
            author=None, show_diff=False, exclude=None, commit_time=None,
3184
 
            lossy=False):
 
3133
            author=None, show_diff=False, exclude=None, commit_time=None):
3185
3134
        from bzrlib.errors import (
3186
3135
            PointlessCommit,
3187
3136
            ConflictsInTree,
3201
3150
                raise errors.BzrCommandError(
3202
3151
                    "Could not parse --commit-time: " + str(e))
3203
3152
 
 
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
 
3204
3159
        properties = {}
3205
3160
 
3206
3161
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3283
3238
                        reporter=None, verbose=verbose, revprops=properties,
3284
3239
                        authors=author, timestamp=commit_stamp,
3285
3240
                        timezone=offset,
3286
 
                        exclude=tree.safe_relpath_files(exclude),
3287
 
                        lossy=lossy)
 
3241
                        exclude=tree.safe_relpath_files(exclude))
3288
3242
        except PointlessCommit:
3289
3243
            raise errors.BzrCommandError("No changes to commit."
3290
 
                " Please 'bzr add' the files you want to commit, or use"
3291
 
                " --unchanged to force an empty commit.")
 
3244
                              " Use --unchanged to commit anyhow.")
3292
3245
        except ConflictsInTree:
3293
3246
            raise errors.BzrCommandError('Conflicts detected in working '
3294
3247
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3375
3328
 
3376
3329
 
3377
3330
class cmd_upgrade(Command):
3378
 
    __doc__ = """Upgrade a repository, branch or working tree to a newer format.
3379
 
 
3380
 
    When the default format has changed after a major new release of
3381
 
    Bazaar, you may be informed during certain operations that you
3382
 
    should upgrade. Upgrading to a newer format may improve performance
3383
 
    or make new features available. It may however limit interoperability
3384
 
    with older repositories or with older versions of Bazaar.
3385
 
 
3386
 
    If you wish to upgrade to a particular format rather than the
3387
 
    current default, that can be specified using the --format option.
3388
 
    As a consequence, you can use the upgrade command this way to
3389
 
    "downgrade" to an earlier format, though some conversions are
3390
 
    a one way process (e.g. changing from the 1.x default to the
3391
 
    2.x default) so downgrading is not always possible.
3392
 
 
3393
 
    A backup.bzr.~#~ directory is created at the start of the conversion
3394
 
    process (where # is a number). By default, this is left there on
3395
 
    completion. If the conversion fails, delete the new .bzr directory
3396
 
    and rename this one back in its place. Use the --clean option to ask
3397
 
    for the backup.bzr directory to be removed on successful conversion.
3398
 
    Alternatively, you can delete it by hand if everything looks good
3399
 
    afterwards.
3400
 
 
3401
 
    If the location given is a shared repository, dependent branches
3402
 
    are also converted provided the repository converts successfully.
3403
 
    If the conversion of a branch fails, remaining branches are still
3404
 
    tried.
3405
 
 
3406
 
    For more information on upgrades, see the Bazaar Upgrade Guide,
3407
 
    http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
 
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.
3408
3336
    """
3409
3337
 
3410
 
    _see_also = ['check', 'reconcile', 'formats']
 
3338
    _see_also = ['check']
3411
3339
    takes_args = ['url?']
3412
3340
    takes_options = [
3413
 
        RegistryOption('format',
3414
 
            help='Upgrade to a specific format.  See "bzr help'
3415
 
                 ' formats" for details.',
3416
 
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3417
 
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3418
 
            value_switches=True, title='Branch format'),
3419
 
        Option('clean',
3420
 
            help='Remove the backup.bzr directory if successful.'),
3421
 
        Option('dry-run',
3422
 
            help="Show what would be done, but don't actually do anything."),
3423
 
    ]
 
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
                    ]
3424
3348
 
3425
 
    def run(self, url='.', format=None, clean=False, dry_run=False):
 
3349
    def run(self, url='.', format=None):
3426
3350
        from bzrlib.upgrade import upgrade
3427
 
        exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3428
 
        if exceptions:
3429
 
            if len(exceptions) == 1:
3430
 
                # Compatibility with historical behavior
3431
 
                raise exceptions[0]
3432
 
            else:
3433
 
                return 3
 
3351
        upgrade(url, format)
3434
3352
 
3435
3353
 
3436
3354
class cmd_whoami(Command):
3472
3390
                self.outf.write(c.username() + '\n')
3473
3391
            return
3474
3392
 
3475
 
        if email:
3476
 
            raise errors.BzrCommandError("--email can only be used to display existing "
3477
 
                                         "identity")
3478
 
 
3479
3393
        # display a warning if an email address isn't included in the given name.
3480
3394
        try:
3481
3395
            _mod_config.extract_email_address(name)
3835
3749
    with bzr send. If neither is specified, the default is the upstream branch
3836
3750
    or the branch most recently merged using --remember.
3837
3751
 
3838
 
    When merging from a branch, by default bzr will try to merge in all new
3839
 
    work from the other branch, automatically determining an appropriate base
3840
 
    revision.  If this fails, you may need to give an explicit base.
3841
 
 
3842
 
    To pick a different ending revision, pass "--revision OTHER".  bzr will
3843
 
    try to merge in all new work up to and including revision OTHER.
3844
 
 
3845
 
    If you specify two values, "--revision BASE..OTHER", only revisions BASE
3846
 
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
3847
 
    causes some revisions to be skipped, i.e. if the destination branch does
3848
 
    not already contain revision BASE, such a merge is commonly referred to as
3849
 
    a "cherrypick".
3850
 
 
3851
 
    Revision numbers are always relative to the source branch.
 
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.
3852
3762
 
3853
3763
    Merge will do its best to combine the changes in two branches, but there
3854
3764
    are some kinds of problems only a human can fix.  When it encounters those,
3878
3788
    you to apply each diff hunk and file change, similar to "shelve".
3879
3789
 
3880
3790
    :Examples:
3881
 
        To merge all new revisions from bzr.dev::
 
3791
        To merge the latest revision from bzr.dev::
3882
3792
 
3883
3793
            bzr merge ../bzr.dev
3884
3794
 
3999
3909
            merger.other_rev_id is not None):
4000
3910
            note('Nothing to do.')
4001
3911
            return 0
4002
 
        if pull and not preview:
 
3912
        if pull:
4003
3913
            if merger.interesting_files is not None:
4004
3914
                raise errors.BzrCommandError('Cannot pull individual files')
4005
3915
            if (merger.base_rev_id == tree.last_revision()):
4118
4028
        if ((remember or tree.branch.get_submit_branch() is None) and
4119
4029
             user_location is not None):
4120
4030
            tree.branch.set_submit_branch(other_branch.base)
4121
 
        # Merge tags (but don't set them in the master branch yet, the user
4122
 
        # might revert this merge).  Commit will propagate them.
4123
 
        _merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
 
4031
        _merge_tags_if_possible(other_branch, tree.branch)
4124
4032
        merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4125
4033
            other_revision_id, base_revision_id, other_branch, base_branch)
4126
4034
        if other_path != '':
4294
4202
    last committed revision is used.
4295
4203
 
4296
4204
    To remove only some changes, without reverting to a prior version, use
4297
 
    merge instead.  For example, "merge . -r -2..-3" (don't forget the ".")
4298
 
    will remove the changes introduced by the second last commit (-2), without
4299
 
    affecting the changes introduced by the last commit (-1).  To remove
4300
 
    certain changes on a hunk-by-hunk basis, see the shelve command.
 
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.
4301
4208
 
4302
4209
    By default, any files that have been manually changed will be backed up
4303
4210
    first.  (Files changed only by merge are not backed up.)  Backup files have
4333
4240
    target branches.
4334
4241
    """
4335
4242
 
4336
 
    _see_also = ['cat', 'export', 'merge', 'shelve']
 
4243
    _see_also = ['cat', 'export']
4337
4244
    takes_options = [
4338
4245
        'revision',
4339
4246
        Option('no-backup', "Do not save backups of reverted files."),
4632
4539
 
4633
4540
    @display_command
4634
4541
    def run(self, verbose=False):
4635
 
        from bzrlib import plugin
4636
 
        self.outf.writelines(
4637
 
            plugin.describe_plugins(show_paths=verbose))
 
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")
4638
4562
 
4639
4563
 
4640
4564
class cmd_testament(Command):
4693
4617
    @display_command
4694
4618
    def run(self, filename, all=False, long=False, revision=None,
4695
4619
            show_ids=False, directory=None):
4696
 
        from bzrlib.annotate import (
4697
 
            annotate_file_tree,
4698
 
            )
 
4620
        from bzrlib.annotate import annotate_file, annotate_file_tree
4699
4621
        wt, branch, relpath = \
4700
4622
            _open_directory_or_containing_tree_or_branch(filename, directory)
4701
4623
        if wt is not None:
4704
4626
            self.add_cleanup(branch.lock_read().unlock)
4705
4627
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4706
4628
        self.add_cleanup(tree.lock_read().unlock)
4707
 
        if wt is not None and revision is None:
 
4629
        if wt is not None:
4708
4630
            file_id = wt.path2id(relpath)
4709
4631
        else:
4710
4632
            file_id = tree.path2id(relpath)
4711
4633
        if file_id is None:
4712
4634
            raise errors.NotVersionedError(filename)
 
4635
        file_version = tree.inventory[file_id].revision
4713
4636
        if wt is not None and revision is None:
4714
4637
            # If there is a tree and we're not annotating historical
4715
4638
            # versions, annotate the working tree's content.
4716
4639
            annotate_file_tree(wt, file_id, self.outf, long, all,
4717
4640
                show_ids=show_ids)
4718
4641
        else:
4719
 
            annotate_file_tree(tree, file_id, self.outf, long, all,
4720
 
                show_ids=show_ids, branch=branch)
 
4642
            annotate_file(branch, file_version, file_id, long, all, self.outf,
 
4643
                          show_ids=show_ids)
4721
4644
 
4722
4645
 
4723
4646
class cmd_re_sign(Command):
5517
5440
    takes_options = [
5518
5441
        custom_help('directory',
5519
5442
            help='Branch whose tags should be displayed.'),
5520
 
        RegistryOption('sort',
 
5443
        RegistryOption.from_kwargs('sort',
5521
5444
            'Sort tags by different criteria.', title='Sorting',
5522
 
            lazy_registry=('bzrlib.tag', 'tag_sort_methods')
 
5445
            natural='Sort numeric substrings as numbers:'
 
5446
                    ' suitable for version numbers. (default)',
 
5447
            alpha='Sort tags lexicographically.',
 
5448
            time='Sort tags chronologically.',
5523
5449
            ),
5524
5450
        'show-ids',
5525
5451
        'revision',
5526
5452
    ]
5527
5453
 
5528
5454
    @display_command
5529
 
    def run(self, directory='.', sort=None, show_ids=False, revision=None):
5530
 
        from bzrlib.tag import tag_sort_methods
 
5455
    def run(self,
 
5456
            directory='.',
 
5457
            sort='natural',
 
5458
            show_ids=False,
 
5459
            revision=None,
 
5460
            ):
5531
5461
        branch, relpath = Branch.open_containing(directory)
5532
5462
 
5533
5463
        tags = branch.tags.get_tag_dict().items()
5542
5472
            # only show revisions between revid1 and revid2 (inclusive)
5543
5473
            tags = [(tag, revid) for tag, revid in tags if
5544
5474
                graph.is_between(revid, revid1, revid2)]
5545
 
        if sort is None:
5546
 
            sort = tag_sort_methods.get()
5547
 
        sort(branch, tags)
 
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]])
5548
5494
        if not show_ids:
5549
5495
            # [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5550
5496
            for index, (tag, revid) in enumerate(tags):
5552
5498
                    revno = branch.revision_id_to_dotted_revno(revid)
5553
5499
                    if isinstance(revno, tuple):
5554
5500
                        revno = '.'.join(map(str, revno))
5555
 
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
 
5501
                except errors.NoSuchRevision:
5556
5502
                    # Bad tag data/merges can lead to tagged revisions
5557
5503
                    # which are not in this branch. Fail gracefully ...
5558
5504
                    revno = '?'
5948
5894
            location = "."
5949
5895
        branch = Branch.open_containing(location)[0]
5950
5896
        branch.bzrdir.destroy_branch()
5951
 
 
 
5897
        
5952
5898
 
5953
5899
class cmd_shelve(Command):
5954
5900
    __doc__ = """Temporarily set aside some changes from the current tree.
6005
5951
    _see_also = ['unshelve', 'configuration']
6006
5952
 
6007
5953
    def run(self, revision=None, all=False, file_list=None, message=None,
6008
 
            writer=None, list=False, destroy=False, directory=None):
 
5954
            writer=None, list=False, destroy=False, directory=u'.'):
6009
5955
        if list:
6010
 
            return self.run_for_list(directory=directory)
 
5956
            return self.run_for_list()
6011
5957
        from bzrlib.shelf_ui import Shelver
6012
5958
        if writer is None:
6013
5959
            writer = bzrlib.option.diff_writer_registry.get()
6021
5967
        except errors.UserAbort:
6022
5968
            return 0
6023
5969
 
6024
 
    def run_for_list(self, directory=None):
6025
 
        if directory is None:
6026
 
            directory = u'.'
6027
 
        tree = WorkingTree.open_containing(directory)[0]
 
5970
    def run_for_list(self):
 
5971
        tree = WorkingTree.open_containing('.')[0]
6028
5972
        self.add_cleanup(tree.lock_read().unlock)
6029
5973
        manager = tree.get_shelf_manager()
6030
5974
        shelves = manager.active_shelves()
6089
6033
    """
6090
6034
    takes_options = ['directory',
6091
6035
                     Option('ignored', help='Delete all ignored files.'),
6092
 
                     Option('detritus', help='Delete conflict files, merge and revert'
 
6036
                     Option('detritus', help='Delete conflict files, merge'
6093
6037
                            ' backups, and failed selftest dirs.'),
6094
6038
                     Option('unknown',
6095
6039
                            help='Delete files unknown to bzr (default).'),
6154
6098
            self.outf.write('%s %s\n' % (path, location))
6155
6099
 
6156
6100
 
6157
 
class cmd_export_pot(Command):
6158
 
    __doc__ = """Export command helps and error messages in po format."""
6159
 
 
6160
 
    hidden = True
6161
 
 
6162
 
    def run(self):
6163
 
        from bzrlib.export_pot import export_pot
6164
 
        export_pot(self.outf)
6165
 
 
6166
 
 
6167
6101
def _register_lazy_builtins():
6168
6102
    # register lazy builtins from other modules; called at startup and should
6169
6103
    # be only called once.
6175
6109
        ('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6176
6110
        ('cmd_conflicts', [], 'bzrlib.conflicts'),
6177
6111
        ('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6178
 
        ('cmd_test_script', [], 'bzrlib.cmd_test_script'),
 
6112
        ('cmd_test_script', [], 'bzrlib.tests.script'),
6179
6113
        ]:
6180
6114
        builtin_command_registry.register_lazy(name, aliases, module_name)