~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Gordon Tyler
  • Date: 2011-01-21 23:51:15 UTC
  • mto: This revision was merged to the branch mainline in revision 5632.
  • Revision ID: gordon@doxxx.net-20110121235115-9sdqamejot1h0481
Replace usage of format function from python 2.6 with our own very simple formatting function.

Show diffs side-by-side

added added

removed removed

Lines of Context:
328
328
        if revision_id is None and revision is None:
329
329
            raise errors.BzrCommandError('You must supply either'
330
330
                                         ' --revision or a revision_id')
331
 
 
332
 
        b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
 
331
        b = WorkingTree.open_containing(directory)[0].branch
333
332
 
334
333
        revisions = b.repository.revisions
335
334
        if revisions is None:
413
412
                self.outf.write(page_bytes[:header_end])
414
413
                page_bytes = data
415
414
            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')
 
415
            decomp_bytes = zlib.decompress(page_bytes)
 
416
            self.outf.write(decomp_bytes)
 
417
            self.outf.write('\n')
422
418
 
423
419
    def _dump_entries(self, trans, basename):
424
420
        try:
485
481
            d.destroy_workingtree()
486
482
 
487
483
 
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
484
class cmd_revno(Command):
542
485
    __doc__ = """Show current revision number.
543
486
 
1072
1015
            log.show_branch_change(
1073
1016
                branch_to, self.outf, result.old_revno,
1074
1017
                result.old_revid)
1075
 
        if getattr(result, 'tag_conflicts', None):
1076
 
            return 1
1077
 
        else:
1078
 
            return 0
1079
1018
 
1080
1019
 
1081
1020
class cmd_push(Command):
1205
1144
 
1206
1145
    To retrieve the branch as of a particular revision, supply the --revision
1207
1146
    parameter, as in "branch foo/bar -r 5".
1208
 
 
1209
 
    The synonyms 'clone' and 'get' for this command are deprecated.
1210
1147
    """
1211
1148
 
1212
1149
    _see_also = ['checkout']
1242
1179
            files_from=None):
1243
1180
        from bzrlib import switch as _mod_switch
1244
1181
        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
1182
        accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1252
1183
            from_location)
1253
1184
        if not (hardlink or files_from):
2030
1961
            type=unicode,
2031
1962
            ),
2032
1963
        RegistryOption('format',
2033
 
            short_name='F',
2034
1964
            help='Diff format to use.',
2035
1965
            lazy_registry=('bzrlib.diff', 'format_registry'),
2036
 
            title='Diff format'),
 
1966
            value_switches=False, title='Diff format'),
2037
1967
        ]
2038
1968
    aliases = ['di', 'dif']
2039
1969
    encoding_type = 'exact'
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'
3999
3952
            merger.other_rev_id is not None):
4000
3953
            note('Nothing to do.')
4001
3954
            return 0
4002
 
        if pull and not preview:
 
3955
        if pull:
4003
3956
            if merger.interesting_files is not None:
4004
3957
                raise errors.BzrCommandError('Cannot pull individual files')
4005
3958
            if (merger.base_rev_id == tree.last_revision()):
4632
4585
 
4633
4586
    @display_command
4634
4587
    def run(self, verbose=False):
4635
 
        from bzrlib import plugin
4636
 
        self.outf.writelines(
4637
 
            plugin.describe_plugins(show_paths=verbose))
 
4588
        import bzrlib.plugin
 
4589
        from inspect import getdoc
 
4590
        result = []
 
4591
        for name, plugin in bzrlib.plugin.plugins().items():
 
4592
            version = plugin.__version__
 
4593
            if version == 'unknown':
 
4594
                version = ''
 
4595
            name_ver = '%s %s' % (name, version)
 
4596
            d = getdoc(plugin.module)
 
4597
            if d:
 
4598
                doc = d.split('\n')[0]
 
4599
            else:
 
4600
                doc = '(no description)'
 
4601
            result.append((name_ver, doc, plugin.path()))
 
4602
        for name_ver, doc, path in sorted(result):
 
4603
            self.outf.write("%s\n" % name_ver)
 
4604
            self.outf.write("   %s\n" % doc)
 
4605
            if verbose:
 
4606
                self.outf.write("   %s\n" % path)
 
4607
            self.outf.write("\n")
4638
4608
 
4639
4609
 
4640
4610
class cmd_testament(Command):
4693
4663
    @display_command
4694
4664
    def run(self, filename, all=False, long=False, revision=None,
4695
4665
            show_ids=False, directory=None):
4696
 
        from bzrlib.annotate import (
4697
 
            annotate_file_tree,
4698
 
            )
 
4666
        from bzrlib.annotate import annotate_file, annotate_file_tree
4699
4667
        wt, branch, relpath = \
4700
4668
            _open_directory_or_containing_tree_or_branch(filename, directory)
4701
4669
        if wt is not None:
4704
4672
            self.add_cleanup(branch.lock_read().unlock)
4705
4673
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4706
4674
        self.add_cleanup(tree.lock_read().unlock)
4707
 
        if wt is not None and revision is None:
 
4675
        if wt is not None:
4708
4676
            file_id = wt.path2id(relpath)
4709
4677
        else:
4710
4678
            file_id = tree.path2id(relpath)
4711
4679
        if file_id is None:
4712
4680
            raise errors.NotVersionedError(filename)
 
4681
        file_version = tree.inventory[file_id].revision
4713
4682
        if wt is not None and revision is None:
4714
4683
            # If there is a tree and we're not annotating historical
4715
4684
            # versions, annotate the working tree's content.
4716
4685
            annotate_file_tree(wt, file_id, self.outf, long, all,
4717
4686
                show_ids=show_ids)
4718
4687
        else:
4719
 
            annotate_file_tree(tree, file_id, self.outf, long, all,
4720
 
                show_ids=show_ids, branch=branch)
 
4688
            annotate_file(branch, file_version, file_id, long, all, self.outf,
 
4689
                          show_ids=show_ids)
4721
4690
 
4722
4691
 
4723
4692
class cmd_re_sign(Command):
5552
5521
                    revno = branch.revision_id_to_dotted_revno(revid)
5553
5522
                    if isinstance(revno, tuple):
5554
5523
                        revno = '.'.join(map(str, revno))
5555
 
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
 
5524
                except errors.NoSuchRevision:
5556
5525
                    # Bad tag data/merges can lead to tagged revisions
5557
5526
                    # which are not in this branch. Fail gracefully ...
5558
5527
                    revno = '?'
6089
6058
    """
6090
6059
    takes_options = ['directory',
6091
6060
                     Option('ignored', help='Delete all ignored files.'),
6092
 
                     Option('detritus', help='Delete conflict files, merge and revert'
 
6061
                     Option('detritus', help='Delete conflict files, merge'
6093
6062
                            ' backups, and failed selftest dirs.'),
6094
6063
                     Option('unknown',
6095
6064
                            help='Delete files unknown to bzr (default).'),
6154
6123
            self.outf.write('%s %s\n' % (path, location))
6155
6124
 
6156
6125
 
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
6126
def _register_lazy_builtins():
6168
6127
    # register lazy builtins from other modules; called at startup and should
6169
6128
    # be only called once.