~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: John Arbash Meinel
  • Date: 2011-01-11 18:10:55 UTC
  • mto: This revision was merged to the branch mainline in revision 5596.
  • Revision ID: john@arbash-meinel.com-20110111181055-d79p02kioxcg4f7l
Change tuned_gzip.GzipFile to be deprecated

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
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'
2120
2050
    @display_command
2121
2051
    def run(self, null=False, directory=u'.'):
2122
2052
        tree = WorkingTree.open_containing(directory)[0]
2123
 
        self.add_cleanup(tree.lock_read().unlock)
2124
2053
        td = tree.changes_from(tree.basis_tree())
2125
 
        self.cleanup_now()
2126
2054
        for path, id, kind, text_modified, meta_modified in td.modified:
2127
2055
            if null:
2128
2056
                self.outf.write(path + '\0')
2796
2724
            bzr ignore "RE:(?!debian/).*"
2797
2725
        
2798
2726
        Ignore everything except the "local" toplevel directory,
2799
 
        but always ignore autosave files ending in ~, even under local/::
 
2727
        but always ignore "*~" autosave files, even under local/::
2800
2728
        
2801
2729
            bzr ignore "*"
2802
2730
            bzr ignore "!./local"
2930
2858
         zip                          .zip
2931
2859
      =================       =========================
2932
2860
    """
2933
 
    encoding = 'exact'
2934
2861
    takes_args = ['dest', 'branch_or_subdir?']
2935
2862
    takes_options = ['directory',
2936
2863
        Option('format',
3114
3041
      to trigger updates to external systems like bug trackers. The --fixes
3115
3042
      option can be used to record the association between a revision and
3116
3043
      one or more bugs. See ``bzr help bugs`` for details.
 
3044
 
 
3045
      A selective commit may fail in some cases where the committed
 
3046
      tree would be invalid. Consider::
 
3047
  
 
3048
        bzr init foo
 
3049
        mkdir foo/bar
 
3050
        bzr add foo/bar
 
3051
        bzr commit foo -m "committing foo"
 
3052
        bzr mv foo/bar foo/baz
 
3053
        mkdir foo/bar
 
3054
        bzr add foo/bar
 
3055
        bzr commit foo/bar -m "committing bar but not baz"
 
3056
  
 
3057
      In the example above, the last commit will fail by design. This gives
 
3058
      the user the opportunity to decide whether they want to commit the
 
3059
      rename at the same time, separately first, or not at all. (As a general
 
3060
      rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3117
3061
    """
 
3062
    # TODO: Run hooks on tree to-be-committed, and after commit.
 
3063
 
 
3064
    # TODO: Strict commit that fails if there are deleted files.
 
3065
    #       (what does "deleted files" mean ??)
 
3066
 
 
3067
    # TODO: Give better message for -s, --summary, used by tla people
 
3068
 
 
3069
    # XXX: verbose currently does nothing
3118
3070
 
3119
3071
    _see_also = ['add', 'bugs', 'hooks', 'uncommit']
3120
3072
    takes_args = ['selected*']
3152
3104
             Option('show-diff', short_name='p',
3153
3105
                    help='When no message is supplied, show the diff along'
3154
3106
                    ' 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
3107
             ]
3160
3108
    aliases = ['ci', 'checkin']
3161
3109
 
3180
3128
 
3181
3129
    def run(self, message=None, file=None, verbose=False, selected_list=None,
3182
3130
            unchanged=False, strict=False, local=False, fixes=None,
3183
 
            author=None, show_diff=False, exclude=None, commit_time=None,
3184
 
            lossy=False):
 
3131
            author=None, show_diff=False, exclude=None, commit_time=None):
3185
3132
        from bzrlib.errors import (
3186
3133
            PointlessCommit,
3187
3134
            ConflictsInTree,
3201
3148
                raise errors.BzrCommandError(
3202
3149
                    "Could not parse --commit-time: " + str(e))
3203
3150
 
 
3151
        # TODO: Need a blackbox test for invoking the external editor; may be
 
3152
        # slightly problematic to run this cross-platform.
 
3153
 
 
3154
        # TODO: do more checks that the commit will succeed before
 
3155
        # spending the user's valuable time typing a commit message.
 
3156
 
3204
3157
        properties = {}
3205
3158
 
3206
3159
        tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3283
3236
                        reporter=None, verbose=verbose, revprops=properties,
3284
3237
                        authors=author, timestamp=commit_stamp,
3285
3238
                        timezone=offset,
3286
 
                        exclude=tree.safe_relpath_files(exclude),
3287
 
                        lossy=lossy)
 
3239
                        exclude=tree.safe_relpath_files(exclude))
3288
3240
        except PointlessCommit:
3289
3241
            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.")
 
3242
                              " Use --unchanged to commit anyhow.")
3292
3243
        except ConflictsInTree:
3293
3244
            raise errors.BzrCommandError('Conflicts detected in working '
3294
3245
                'tree.  Use "bzr conflicts" to list, "bzr resolve FILE" to'
3472
3423
                self.outf.write(c.username() + '\n')
3473
3424
            return
3474
3425
 
3475
 
        if email:
3476
 
            raise errors.BzrCommandError("--email can only be used to display existing "
3477
 
                                         "identity")
3478
 
 
3479
3426
        # display a warning if an email address isn't included in the given name.
3480
3427
        try:
3481
3428
            _mod_config.extract_email_address(name)
3999
3946
            merger.other_rev_id is not None):
4000
3947
            note('Nothing to do.')
4001
3948
            return 0
4002
 
        if pull and not preview:
 
3949
        if pull:
4003
3950
            if merger.interesting_files is not None:
4004
3951
                raise errors.BzrCommandError('Cannot pull individual files')
4005
3952
            if (merger.base_rev_id == tree.last_revision()):
4632
4579
 
4633
4580
    @display_command
4634
4581
    def run(self, verbose=False):
4635
 
        from bzrlib import plugin
4636
 
        self.outf.writelines(
4637
 
            plugin.describe_plugins(show_paths=verbose))
 
4582
        import bzrlib.plugin
 
4583
        from inspect import getdoc
 
4584
        result = []
 
4585
        for name, plugin in bzrlib.plugin.plugins().items():
 
4586
            version = plugin.__version__
 
4587
            if version == 'unknown':
 
4588
                version = ''
 
4589
            name_ver = '%s %s' % (name, version)
 
4590
            d = getdoc(plugin.module)
 
4591
            if d:
 
4592
                doc = d.split('\n')[0]
 
4593
            else:
 
4594
                doc = '(no description)'
 
4595
            result.append((name_ver, doc, plugin.path()))
 
4596
        for name_ver, doc, path in sorted(result):
 
4597
            self.outf.write("%s\n" % name_ver)
 
4598
            self.outf.write("   %s\n" % doc)
 
4599
            if verbose:
 
4600
                self.outf.write("   %s\n" % path)
 
4601
            self.outf.write("\n")
4638
4602
 
4639
4603
 
4640
4604
class cmd_testament(Command):
4693
4657
    @display_command
4694
4658
    def run(self, filename, all=False, long=False, revision=None,
4695
4659
            show_ids=False, directory=None):
4696
 
        from bzrlib.annotate import (
4697
 
            annotate_file_tree,
4698
 
            )
 
4660
        from bzrlib.annotate import annotate_file, annotate_file_tree
4699
4661
        wt, branch, relpath = \
4700
4662
            _open_directory_or_containing_tree_or_branch(filename, directory)
4701
4663
        if wt is not None:
4704
4666
            self.add_cleanup(branch.lock_read().unlock)
4705
4667
        tree = _get_one_revision_tree('annotate', revision, branch=branch)
4706
4668
        self.add_cleanup(tree.lock_read().unlock)
4707
 
        if wt is not None and revision is None:
 
4669
        if wt is not None:
4708
4670
            file_id = wt.path2id(relpath)
4709
4671
        else:
4710
4672
            file_id = tree.path2id(relpath)
4711
4673
        if file_id is None:
4712
4674
            raise errors.NotVersionedError(filename)
 
4675
        file_version = tree.inventory[file_id].revision
4713
4676
        if wt is not None and revision is None:
4714
4677
            # If there is a tree and we're not annotating historical
4715
4678
            # versions, annotate the working tree's content.
4716
4679
            annotate_file_tree(wt, file_id, self.outf, long, all,
4717
4680
                show_ids=show_ids)
4718
4681
        else:
4719
 
            annotate_file_tree(tree, file_id, self.outf, long, all,
4720
 
                show_ids=show_ids, branch=branch)
 
4682
            annotate_file(branch, file_version, file_id, long, all, self.outf,
 
4683
                          show_ids=show_ids)
4721
4684
 
4722
4685
 
4723
4686
class cmd_re_sign(Command):
5552
5515
                    revno = branch.revision_id_to_dotted_revno(revid)
5553
5516
                    if isinstance(revno, tuple):
5554
5517
                        revno = '.'.join(map(str, revno))
5555
 
                except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
 
5518
                except errors.NoSuchRevision:
5556
5519
                    # Bad tag data/merges can lead to tagged revisions
5557
5520
                    # which are not in this branch. Fail gracefully ...
5558
5521
                    revno = '?'
6089
6052
    """
6090
6053
    takes_options = ['directory',
6091
6054
                     Option('ignored', help='Delete all ignored files.'),
6092
 
                     Option('detritus', help='Delete conflict files, merge and revert'
 
6055
                     Option('detritus', help='Delete conflict files, merge'
6093
6056
                            ' backups, and failed selftest dirs.'),
6094
6057
                     Option('unknown',
6095
6058
                            help='Delete files unknown to bzr (default).'),
6154
6117
            self.outf.write('%s %s\n' % (path, location))
6155
6118
 
6156
6119
 
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
6120
def _register_lazy_builtins():
6168
6121
    # register lazy builtins from other modules; called at startup and should
6169
6122
    # be only called once.