~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Martin
  • Date: 2011-04-15 21:22:57 UTC
  • mto: This revision was merged to the branch mainline in revision 5797.
  • Revision ID: gzlist@googlemail.com-20110415212257-jgtovwwp4be7egd9
Add release notes

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*']
3150
3188
                raise errors.BzrCommandError(
3151
3189
                    "Could not parse --commit-time: " + str(e))
3152
3190
 
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
3191
        properties = {}
3160
3192
 
3161
3193
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3241
3273
                        exclude=tree.safe_relpath_files(exclude))
3242
3274
        except PointlessCommit:
3243
3275
            raise errors.BzrCommandError("No changes to commit."
3244
 
                              " Use --unchanged to commit anyhow.")
 
3276
                " Please 'bzr add' the files you want to commit, or use"
 
3277
                " --unchanged to force an empty commit.")
3245
3278
        except ConflictsInTree:
3246
3279
            raise errors.BzrCommandError('Conflicts detected in working '
3247
3280
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3328
3361
 
3329
3362
 
3330
3363
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.
 
3364
    __doc__ = """Upgrade a repository, branch or working tree to a newer format.
 
3365
 
 
3366
    When the default format has changed after a major new release of
 
3367
    Bazaar, you may be informed during certain operations that you
 
3368
    should upgrade. Upgrading to a newer format may improve performance
 
3369
    or make new features available. It may however limit interoperability
 
3370
    with older repositories or with older versions of Bazaar.
 
3371
 
 
3372
    If you wish to upgrade to a particular format rather than the
 
3373
    current default, that can be specified using the --format option.
 
3374
    As a consequence, you can use the upgrade command this way to
 
3375
    "downgrade" to an earlier format, though some conversions are
 
3376
    a one way process (e.g. changing from the 1.x default to the
 
3377
    2.x default) so downgrading is not always possible.
 
3378
 
 
3379
    A backup.bzr.~#~ directory is created at the start of the conversion
 
3380
    process (where # is a number). By default, this is left there on
 
3381
    completion. If the conversion fails, delete the new .bzr directory
 
3382
    and rename this one back in its place. Use the --clean option to ask
 
3383
    for the backup.bzr directory to be removed on successful conversion.
 
3384
    Alternatively, you can delete it by hand if everything looks good
 
3385
    afterwards.
 
3386
 
 
3387
    If the location given is a shared repository, dependent branches
 
3388
    are also converted provided the repository converts successfully.
 
3389
    If the conversion of a branch fails, remaining branches are still
 
3390
    tried.
 
3391
 
 
3392
    For more information on upgrades, see the Bazaar Upgrade Guide,
 
3393
    http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3336
3394
    """
3337
3395
 
3338
 
    _see_also = ['check']
 
3396
    _see_also = ['check', 'reconcile', 'formats']
3339
3397
    takes_args = ['url?']
3340
3398
    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
 
                    ]
 
3399
        RegistryOption('format',
 
3400
            help='Upgrade to a specific format.  See "bzr help'
 
3401
                 ' formats" for details.',
 
3402
            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
3403
            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
 
3404
            value_switches=True, title='Branch format'),
 
3405
        Option('clean',
 
3406
            help='Remove the backup.bzr directory if successful.'),
 
3407
        Option('dry-run',
 
3408
            help="Show what would be done, but don't actually do anything."),
 
3409
    ]
3348
3410
 
3349
 
    def run(self, url='.', format=None):
 
3411
    def run(self, url='.', format=None, clean=False, dry_run=False):
3350
3412
        from bzrlib.upgrade import upgrade
3351
 
        upgrade(url, format)
 
3413
        exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
 
3414
        if exceptions:
 
3415
            if len(exceptions) == 1:
 
3416
                # Compatibility with historical behavior
 
3417
                raise exceptions[0]
 
3418
            else:
 
3419
                return 3
3352
3420
 
3353
3421
 
3354
3422
class cmd_whoami(Command):
3390
3458
                self.outf.write(c.username() + '\n')
3391
3459
            return
3392
3460
 
 
3461
        if email:
 
3462
            raise errors.BzrCommandError("--email can only be used to display existing "
 
3463
                                         "identity")
 
3464
 
3393
3465
        # display a warning if an email address isn't included in the given name.
3394
3466
        try:
3395
3467
            _mod_config.extract_email_address(name)
3749
3821
    with bzr send. If neither is specified, the default is the upstream branch
3750
3822
    or the branch most recently merged using --remember.
3751
3823
 
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.
 
3824
    When merging from a branch, by default bzr will try to merge in all new
 
3825
    work from the other branch, automatically determining an appropriate base
 
3826
    revision.  If this fails, you may need to give an explicit base.
 
3827
 
 
3828
    To pick a different ending revision, pass "--revision OTHER".  bzr will
 
3829
    try to merge in all new work up to and including revision OTHER.
 
3830
 
 
3831
    If you specify two values, "--revision BASE..OTHER", only revisions BASE
 
3832
    through OTHER, excluding BASE but including OTHER, will be merged.  If this
 
3833
    causes some revisions to be skipped, i.e. if the destination branch does
 
3834
    not already contain revision BASE, such a merge is commonly referred to as
 
3835
    a "cherrypick".
 
3836
 
 
3837
    Revision numbers are always relative to the source branch.
3762
3838
 
3763
3839
    Merge will do its best to combine the changes in two branches, but there
3764
3840
    are some kinds of problems only a human can fix.  When it encounters those,
3788
3864
    you to apply each diff hunk and file change, similar to "shelve".
3789
3865
 
3790
3866
    :Examples:
3791
 
        To merge the latest revision from bzr.dev::
 
3867
        To merge all new revisions from bzr.dev::
3792
3868
 
3793
3869
            bzr merge ../bzr.dev
3794
3870
 
4028
4104
        if ((remember or tree.branch.get_submit_branch() is None) and
4029
4105
             user_location is not None):
4030
4106
            tree.branch.set_submit_branch(other_branch.base)
4031
 
        _merge_tags_if_possible(other_branch, tree.branch)
 
4107
        # Merge tags (but don't set them in the master branch yet, the user
 
4108
        # might revert this merge).  Commit will propagate them.
 
4109
        _merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
4032
4110
        merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4033
4111
            other_revision_id, base_revision_id, other_branch, base_branch)
4034
4112
        if other_path != '':
4202
4280
    last committed revision is used.
4203
4281
 
4204
4282
    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.
 
4283
    merge instead.  For example, "merge . -r -2..-3" (don't forget the ".")
 
4284
    will remove the changes introduced by the second last commit (-2), without
 
4285
    affecting the changes introduced by the last commit (-1).  To remove
 
4286
    certain changes on a hunk-by-hunk basis, see the shelve command.
4208
4287
 
4209
4288
    By default, any files that have been manually changed will be backed up
4210
4289
    first.  (Files changed only by merge are not backed up.)  Backup files have
4240
4319
    target branches.
4241
4320
    """
4242
4321
 
4243
 
    _see_also = ['cat', 'export']
 
4322
    _see_also = ['cat', 'export', 'merge', 'shelve']
4244
4323
    takes_options = [
4245
4324
        'revision',
4246
4325
        Option('no-backup', "Do not save backups of reverted files."),
4539
4618
 
4540
4619
    @display_command
4541
4620
    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")
 
4621
        from bzrlib import plugin
 
4622
        self.outf.writelines(
 
4623
            plugin.describe_plugins(show_paths=verbose))
4562
4624
 
4563
4625
 
4564
4626
class cmd_testament(Command):
4626
4688
            self.add_cleanup(branch.lock_read().unlock)
4627
4689
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4628
4690
        self.add_cleanup(tree.lock_read().unlock)
4629
 
        if wt is not None:
 
4691
        if wt is not None and revision is None:
4630
4692
            file_id = wt.path2id(relpath)
4631
4693
        else:
4632
4694
            file_id = tree.path2id(relpath)
4633
4695
        if file_id is None:
4634
4696
            raise errors.NotVersionedError(filename)
4635
 
        file_version = tree.inventory[file_id].revision
4636
4697
        if wt is not None and revision is None:
4637
4698
            # If there is a tree and we're not annotating historical
4638
4699
            # versions, annotate the working tree's content.
4639
4700
            annotate_file_tree(wt, file_id, self.outf, long, all,
4640
4701
                show_ids=show_ids)
4641
4702
        else:
 
4703
            file_version = tree.inventory[file_id].revision
4642
4704
            annotate_file(branch, file_version, file_id, long, all, self.outf,
4643
4705
                          show_ids=show_ids)
4644
4706
 
5440
5502
    takes_options = [
5441
5503
        custom_help('directory',
5442
5504
            help='Branch whose tags should be displayed.'),
5443
 
        RegistryOption.from_kwargs('sort',
 
5505
        RegistryOption('sort',
5444
5506
            '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.',
 
5507
            lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5449
5508
            ),
5450
5509
        'show-ids',
5451
5510
        'revision',
5452
5511
    ]
5453
5512
 
5454
5513
    @display_command
5455
 
    def run(self,
5456
 
            directory='.',
5457
 
            sort='natural',
5458
 
            show_ids=False,
5459
 
            revision=None,
5460
 
            ):
 
5514
    def run(self, directory='.', sort=None, show_ids=False, revision=None):
 
5515
        from bzrlib.tag import tag_sort_methods
5461
5516
        branch, relpath = Branch.open_containing(directory)
5462
5517
 
5463
5518
        tags = branch.tags.get_tag_dict().items()
5472
5527
            # only show revisions between revid1 and revid2 (inclusive)
5473
5528
            tags = [(tag, revid) for tag, revid in tags if
5474
5529
                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]])
 
5530
        if sort is None:
 
5531
            sort = tag_sort_methods.get()
 
5532
        sort(branch, tags)
5494
5533
        if not show_ids:
5495
5534
            # [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5496
5535
            for index, (tag, revid) in enumerate(tags):
5498
5537
                    revno = branch.revision_id_to_dotted_revno(revid)
5499
5538
                    if isinstance(revno, tuple):
5500
5539
                        revno = '.'.join(map(str, revno))
5501
 
                except errors.NoSuchRevision:
 
5540
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5502
5541
                    # Bad tag data/merges can lead to tagged revisions
5503
5542
                    # which are not in this branch. Fail gracefully ...
5504
5543
                    revno = '?'
5894
5933
            location = "."
5895
5934
        branch = Branch.open_containing(location)[0]
5896
5935
        branch.bzrdir.destroy_branch()
5897
 
        
 
5936
 
5898
5937
 
5899
5938
class cmd_shelve(Command):
5900
5939
    __doc__ = """Temporarily set aside some changes from the current tree.
5951
5990
    _see_also = ['unshelve', 'configuration']
5952
5991
 
5953
5992
    def run(self, revision=None, all=False, file_list=None, message=None,
5954
 
            writer=None, list=False, destroy=False, directory=u'.'):
 
5993
            writer=None, list=False, destroy=False, directory=None):
5955
5994
        if list:
5956
 
            return self.run_for_list()
 
5995
            return self.run_for_list(directory=directory)
5957
5996
        from bzrlib.shelf_ui import Shelver
5958
5997
        if writer is None:
5959
5998
            writer = bzrlib.option.diff_writer_registry.get()
5967
6006
        except errors.UserAbort:
5968
6007
            return 0
5969
6008
 
5970
 
    def run_for_list(self):
5971
 
        tree = WorkingTree.open_containing('.')[0]
 
6009
    def run_for_list(self, directory=None):
 
6010
        if directory is None:
 
6011
            directory = u'.'
 
6012
        tree = WorkingTree.open_containing(directory)[0]
5972
6013
        self.add_cleanup(tree.lock_read().unlock)
5973
6014
        manager = tree.get_shelf_manager()
5974
6015
        shelves = manager.active_shelves()
6033
6074
    """
6034
6075
    takes_options = ['directory',
6035
6076
                     Option('ignored', help='Delete all ignored files.'),
6036
 
                     Option('detritus', help='Delete conflict files, merge'
 
6077
                     Option('detritus', help='Delete conflict files, merge and revert'
6037
6078
                            ' backups, and failed selftest dirs.'),
6038
6079
                     Option('unknown',
6039
6080
                            help='Delete files unknown to bzr (default).'),