/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: Andrew Bennetts
  • Date: 2008-10-27 06:14:45 UTC
  • mfrom: (3793 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3795.
  • Revision ID: andrew.bennetts@canonical.com-20081027061445-eqt9lz6uw1mbvq4g
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""builtin bzr commands"""
18
18
 
19
19
import os
20
 
from StringIO import StringIO
21
20
 
22
21
from bzrlib.lazy_import import lazy_import
23
22
lazy_import(globals(), """
24
23
import codecs
 
24
import cStringIO
25
25
import sys
26
26
import time
27
27
 
29
29
from bzrlib import (
30
30
    bugtracker,
31
31
    bundle,
 
32
    btree_index,
32
33
    bzrdir,
33
34
    delta,
34
35
    config,
35
36
    errors,
36
37
    globbing,
37
 
    ignores,
38
38
    log,
39
39
    merge as _mod_merge,
40
40
    merge_directive,
56
56
 
57
57
from bzrlib.commands import Command, display_command
58
58
from bzrlib.option import ListOption, Option, RegistryOption, custom_help
59
 
from bzrlib.trace import mutter, note, warning, is_quiet, info
 
59
from bzrlib.trace import mutter, note, warning, is_quiet
60
60
 
61
61
 
62
62
def tree_files(file_list, default_branch=u'.'):
67
67
                                     (e.path, file_list[0]))
68
68
 
69
69
 
 
70
def _get_one_revision_tree(command_name, revisions, branch=None, tree=None):
 
71
    if branch is None:
 
72
        branch = tree.branch
 
73
    if revisions is None:
 
74
        if tree is not None:
 
75
            rev_tree = tree.basis_tree()
 
76
        else:
 
77
            rev_tree = branch.basis_tree()
 
78
    else:
 
79
        if len(revisions) != 1:
 
80
            raise errors.BzrCommandError(
 
81
                'bzr %s --revision takes exactly one revision identifier' % (
 
82
                    command_name,))
 
83
        rev_tree = revisions[0].as_tree(branch)
 
84
    return rev_tree
 
85
 
 
86
 
70
87
# XXX: Bad function name; should possibly also be a class method of
71
88
# WorkingTree rather than a function.
72
89
def internal_tree_files(file_list, default_branch=u'.'):
239
256
                                                 ' revision.')
240
257
                rev_id = rev.as_revision_id(b)
241
258
                self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
242
 
    
 
259
 
 
260
 
 
261
class cmd_dump_btree(Command):
 
262
    """Dump the contents of a btree index file to stdout.
 
263
 
 
264
    PATH is a btree index file, it can be any URL. This includes things like
 
265
    .bzr/repository/pack-names, or .bzr/repository/indices/a34b3a...ca4a4.iix
 
266
 
 
267
    By default, the tuples stored in the index file will be displayed. With
 
268
    --raw, we will uncompress the pages, but otherwise display the raw bytes
 
269
    stored in the index.
 
270
    """
 
271
 
 
272
    # TODO: Do we want to dump the internal nodes as well?
 
273
    # TODO: It would be nice to be able to dump the un-parsed information,
 
274
    #       rather than only going through iter_all_entries. However, this is
 
275
    #       good enough for a start
 
276
    hidden = True
 
277
    encoding_type = 'exact'
 
278
    takes_args = ['path']
 
279
    takes_options = [Option('raw', help='Write the uncompressed bytes out,'
 
280
                                        ' rather than the parsed tuples.'),
 
281
                    ]
 
282
 
 
283
    def run(self, path, raw=False):
 
284
        dirname, basename = osutils.split(path)
 
285
        t = transport.get_transport(dirname)
 
286
        if raw:
 
287
            self._dump_raw_bytes(t, basename)
 
288
        else:
 
289
            self._dump_entries(t, basename)
 
290
 
 
291
    def _get_index_and_bytes(self, trans, basename):
 
292
        """Create a BTreeGraphIndex and raw bytes."""
 
293
        bt = btree_index.BTreeGraphIndex(trans, basename, None)
 
294
        bytes = trans.get_bytes(basename)
 
295
        bt._file = cStringIO.StringIO(bytes)
 
296
        bt._size = len(bytes)
 
297
        return bt, bytes
 
298
 
 
299
    def _dump_raw_bytes(self, trans, basename):
 
300
        import zlib
 
301
 
 
302
        # We need to parse at least the root node.
 
303
        # This is because the first page of every row starts with an
 
304
        # uncompressed header.
 
305
        bt, bytes = self._get_index_and_bytes(trans, basename)
 
306
        for page_idx, page_start in enumerate(xrange(0, len(bytes),
 
307
                                                     btree_index._PAGE_SIZE)):
 
308
            page_end = min(page_start + btree_index._PAGE_SIZE, len(bytes))
 
309
            page_bytes = bytes[page_start:page_end]
 
310
            if page_idx == 0:
 
311
                self.outf.write('Root node:\n')
 
312
                header_end, data = bt._parse_header_from_bytes(page_bytes)
 
313
                self.outf.write(page_bytes[:header_end])
 
314
                page_bytes = data
 
315
            self.outf.write('\nPage %d\n' % (page_idx,))
 
316
            decomp_bytes = zlib.decompress(page_bytes)
 
317
            self.outf.write(decomp_bytes)
 
318
            self.outf.write('\n')
 
319
 
 
320
    def _dump_entries(self, trans, basename):
 
321
        try:
 
322
            st = trans.stat(basename)
 
323
        except errors.TransportNotPossible:
 
324
            # We can't stat, so we'll fake it because we have to do the 'get()'
 
325
            # anyway.
 
326
            bt, _ = self._get_index_and_bytes(trans, basename)
 
327
        else:
 
328
            bt = btree_index.BTreeGraphIndex(trans, basename, st.st_size)
 
329
        for node in bt.iter_all_entries():
 
330
            # Node is made up of:
 
331
            # (index, key, value, [references])
 
332
            self.outf.write('%s\n' % (node[1:],))
 
333
 
243
334
 
244
335
class cmd_remove_tree(Command):
245
336
    """Remove the working tree from a given branch/checkout.
490
581
                    raise errors.BzrCommandError(
491
582
                        'bzr inventory --revision takes exactly one revision'
492
583
                        ' identifier')
493
 
                revision_id = revision[0].as_revision_id(work_tree.branch)
494
 
                tree = work_tree.branch.repository.revision_tree(revision_id)
 
584
                tree = revision[0].as_tree(work_tree.branch)
495
585
 
496
586
                extra_trees = [work_tree]
497
587
                tree.lock_read()
1000
1090
            old_tree.lock_read()
1001
1091
            try:
1002
1092
                old_inv = old_tree.inventory
1003
 
                renames = list(_mod_tree.find_renames(old_inv, new_inv))
 
1093
                renames = []
 
1094
                iterator = tree.iter_changes(old_tree, include_unchanged=True)
 
1095
                for f, paths, c, v, p, n, k, e in iterator:
 
1096
                    if paths[0] == paths[1]:
 
1097
                        continue
 
1098
                    if None in (paths):
 
1099
                        continue
 
1100
                    renames.append(paths)
1004
1101
                renames.sort()
1005
1102
                for old_name, new_name in renames:
1006
1103
                    self.outf.write("%s => %s\n" % (old_name, new_name))
1288
1385
         RegistryOption('format',
1289
1386
                help='Specify a format for this branch. '
1290
1387
                'See "help formats".',
1291
 
                registry=bzrdir.format_registry,
1292
 
                converter=bzrdir.format_registry.make_bzrdir,
 
1388
                lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
1389
                converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1293
1390
                value_switches=True,
1294
1391
                title="Branch Format",
1295
1392
                ),
1377
1474
    takes_options = [RegistryOption('format',
1378
1475
                            help='Specify a format for this repository. See'
1379
1476
                                 ' "bzr help formats" for details.',
1380
 
                            registry=bzrdir.format_registry,
1381
 
                            converter=bzrdir.format_registry.make_bzrdir,
 
1477
                            lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
1478
                            converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1382
1479
                            value_switches=True, title='Repository format'),
1383
1480
                     Option('no-trees',
1384
1481
                             help='Branches in the repository will default to'
1666
1763
    takes_options = [
1667
1764
            Option('forward',
1668
1765
                   help='Show from oldest to newest.'),
1669
 
            Option('timezone',
1670
 
                   type=str,
1671
 
                   help='Display timezone as local, original, or utc.'),
 
1766
            'timezone',
1672
1767
            custom_help('verbose',
1673
1768
                   help='Show files changed in each revision.'),
1674
1769
            'show-ids',
1675
1770
            'revision',
 
1771
            Option('change',
 
1772
                   type=bzrlib.option._parse_revision_str,
 
1773
                   short_name='c',
 
1774
                   help='Show just the specified revision.'
 
1775
                   ' See also "help revisionspec".'),
1676
1776
            'log-format',
1677
1777
            Option('message',
1678
1778
                   short_name='m',
1693
1793
            show_ids=False,
1694
1794
            forward=False,
1695
1795
            revision=None,
 
1796
            change=None,
1696
1797
            log_format=None,
1697
1798
            message=None,
1698
1799
            limit=None):
1699
1800
        from bzrlib.log import show_log
1700
1801
        direction = (forward and 'forward') or 'reverse'
1701
 
        
 
1802
 
 
1803
        if change is not None:
 
1804
            if len(change) > 1:
 
1805
                raise errors.RangeInChangeOption()
 
1806
            if revision is not None:
 
1807
                raise errors.BzrCommandError(
 
1808
                    '--revision and --change are mutually exclusive')
 
1809
            else:
 
1810
                revision = change
 
1811
 
1702
1812
        # log everything
1703
1813
        file_id = None
1704
1814
        if location:
1850
1960
            relpath = u''
1851
1961
        elif relpath:
1852
1962
            relpath += '/'
1853
 
        if revision is not None:
1854
 
            tree = branch.repository.revision_tree(
1855
 
                revision[0].as_revision_id(branch))
1856
 
        elif tree is None:
1857
 
            tree = branch.basis_tree()
 
1963
        if revision is not None or tree is None:
 
1964
            tree = _get_one_revision_tree('ls', revision, branch=branch)
1858
1965
 
1859
1966
        tree.lock_read()
1860
1967
        try:
2078
2185
            subdir = None
2079
2186
        else:
2080
2187
            b, subdir = Branch.open_containing(branch_or_subdir)
2081
 
            
2082
 
        if revision is None:
2083
 
            # should be tree.last_revision  FIXME
2084
 
            rev_id = b.last_revision()
2085
 
        else:
2086
 
            if len(revision) != 1:
2087
 
                raise errors.BzrCommandError('bzr export --revision takes exactly 1 argument')
2088
 
            rev_id = revision[0].as_revision_id(b)
2089
 
        t = b.repository.revision_tree(rev_id)
 
2188
            tree = None
 
2189
 
 
2190
        rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2090
2191
        try:
2091
 
            export(t, dest, format, root, subdir)
 
2192
            export(rev_tree, dest, format, root, subdir)
2092
2193
        except errors.NoSuchExportFormat, e:
2093
2194
            raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
2094
2195
 
2127
2228
    def _run(self, tree, b, relpath, filename, revision, name_from_revision):
2128
2229
        if tree is None:
2129
2230
            tree = b.basis_tree()
2130
 
        if revision is None:
2131
 
            revision_id = b.last_revision()
2132
 
        else:
2133
 
            revision_id = revision[0].as_revision_id(b)
 
2231
        rev_tree = _get_one_revision_tree('cat', revision, branch=b)
2134
2232
 
2135
2233
        cur_file_id = tree.path2id(relpath)
2136
 
        rev_tree = b.repository.revision_tree(revision_id)
2137
2234
        old_file_id = rev_tree.path2id(relpath)
2138
 
        
 
2235
 
2139
2236
        if name_from_revision:
2140
2237
            if old_file_id is None:
2141
 
                raise errors.BzrCommandError("%r is not present in revision %s"
2142
 
                                                % (filename, revision_id))
 
2238
                raise errors.BzrCommandError(
 
2239
                    "%r is not present in revision %s" % (
 
2240
                        filename, rev_tree.get_revision_id()))
2143
2241
            else:
2144
2242
                content = rev_tree.get_file_text(old_file_id)
2145
2243
        elif cur_file_id is not None:
2147
2245
        elif old_file_id is not None:
2148
2246
            content = rev_tree.get_file_text(old_file_id)
2149
2247
        else:
2150
 
            raise errors.BzrCommandError("%r is not present in revision %s" %
2151
 
                                         (filename, revision_id))
 
2248
            raise errors.BzrCommandError(
 
2249
                "%r is not present in revision %s" % (
 
2250
                    filename, rev_tree.get_revision_id()))
2152
2251
        self.outf.write(content)
2153
2252
 
2154
2253
 
2308
2407
            if my_message is None and not file:
2309
2408
                t = make_commit_message_template_encoded(tree,
2310
2409
                        selected_list, diff=show_diff,
2311
 
                        output_encoding=bzrlib.user_encoding)
 
2410
                        output_encoding=osutils.get_user_encoding())
2312
2411
                my_message = edit_commit_message_encoded(t)
2313
2412
                if my_message is None:
2314
2413
                    raise errors.BzrCommandError("please specify a commit"
2318
2417
                    "please specify either --message or --file")
2319
2418
            if file:
2320
2419
                my_message = codecs.open(file, 'rt',
2321
 
                                         bzrlib.user_encoding).read()
 
2420
                                         osutils.get_user_encoding()).read()
2322
2421
            if my_message == "":
2323
2422
                raise errors.BzrCommandError("empty commit message specified")
2324
2423
            return my_message
2424
2523
                    RegistryOption('format',
2425
2524
                        help='Upgrade to a specific format.  See "bzr help'
2426
2525
                             ' formats" for details.',
2427
 
                        registry=bzrdir.format_registry,
2428
 
                        converter=bzrdir.format_registry.make_bzrdir,
 
2526
                        lazy_registry=('bzrlib.bzrdir', 'format_registry'),
 
2527
                        converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
2429
2528
                        value_switches=True, title='Branch format'),
2430
2529
                    ]
2431
2530
 
2688
2787
            first=False, list_only=False,
2689
2788
            randomize=None, exclude=None, strict=False,
2690
2789
            load_list=None, debugflag=None, starting_with=None):
2691
 
        import bzrlib.ui
2692
2790
        from bzrlib.tests import selftest
2693
2791
        import bzrlib.benchmarks as benchmarks
2694
2792
        from bzrlib.benchmarks import tree_creator
2888
2986
    ]
2889
2987
 
2890
2988
    def run(self, location=None, revision=None, force=False,
2891
 
            merge_type=None, show_base=False, reprocess=False, remember=False,
 
2989
            merge_type=None, show_base=False, reprocess=None, remember=False,
2892
2990
            uncommitted=False, pull=False,
2893
2991
            directory=None,
2894
2992
            preview=False,
2997
3095
            not merger.merge_type is _mod_merge.Merge3Merger):
2998
3096
            raise errors.BzrCommandError("Show-base is not supported for this"
2999
3097
                                         " merge type. %s" % merger.merge_type)
 
3098
        if merger.reprocess is None:
 
3099
            if merger.show_base:
 
3100
                merger.reprocess = False
 
3101
            else:
 
3102
                # Use reprocess if the merger supports it
 
3103
                merger.reprocess = merger.merge_type.supports_reprocess
3000
3104
        if merger.reprocess and not merger.merge_type.supports_reprocess:
3001
3105
            raise errors.BzrCommandError("Conflict reduction is not supported"
3002
3106
                                         " for merge type %s." %
3243
3347
    def run(self, revision=None, no_backup=False, file_list=None,
3244
3348
            forget_merges=None):
3245
3349
        tree, file_list = tree_files(file_list)
3246
 
        if forget_merges:
3247
 
            tree.set_parent_ids(tree.get_parent_ids()[:1])
3248
 
        else:
3249
 
            self._revert_tree_to_revision(tree, revision, file_list, no_backup)
 
3350
        tree.lock_write()
 
3351
        try:
 
3352
            if forget_merges:
 
3353
                tree.set_parent_ids(tree.get_parent_ids()[:1])
 
3354
            else:
 
3355
                self._revert_tree_to_revision(tree, revision, file_list, no_backup)
 
3356
        finally:
 
3357
            tree.unlock()
3250
3358
 
3251
3359
    @staticmethod
3252
3360
    def _revert_tree_to_revision(tree, revision, file_list, no_backup):
3253
 
        if revision is None:
3254
 
            rev_id = tree.last_revision()
3255
 
        elif len(revision) != 1:
3256
 
            raise errors.BzrCommandError('bzr revert --revision takes exactly 1 argument')
3257
 
        else:
3258
 
            rev_id = revision[0].as_revision_id(tree.branch)
 
3361
        rev_tree = _get_one_revision_tree('revert', revision, tree=tree)
3259
3362
        pb = ui.ui_factory.nested_progress_bar()
3260
3363
        try:
3261
 
            tree.revert(file_list,
3262
 
                        tree.branch.repository.revision_tree(rev_id),
3263
 
                        not no_backup, pb, report_changes=True)
 
3364
            tree.revert(file_list, rev_tree, not no_backup, pb,
 
3365
                report_changes=True)
3264
3366
        finally:
3265
3367
            pb.finished()
3266
3368
 
3553
3655
    @display_command
3554
3656
    def run(self, filename, all=False, long=False, revision=None,
3555
3657
            show_ids=False):
3556
 
        from bzrlib.annotate import annotate_file
 
3658
        from bzrlib.annotate import annotate_file, annotate_file_tree
3557
3659
        wt, branch, relpath = \
3558
3660
            bzrdir.BzrDir.open_containing_tree_or_branch(filename)
3559
3661
        if wt is not None:
3561
3663
        else:
3562
3664
            branch.lock_read()
3563
3665
        try:
3564
 
            if revision is None:
3565
 
                revision_id = branch.last_revision()
3566
 
            elif len(revision) != 1:
3567
 
                raise errors.BzrCommandError('bzr annotate --revision takes exactly 1 argument')
3568
 
            else:
3569
 
                revision_id = revision[0].as_revision_id(branch)
3570
 
            tree = branch.repository.revision_tree(revision_id)
 
3666
            tree = _get_one_revision_tree('annotate', revision, branch=branch)
3571
3667
            if wt is not None:
3572
3668
                file_id = wt.path2id(relpath)
3573
3669
            else:
3575
3671
            if file_id is None:
3576
3672
                raise errors.NotVersionedError(filename)
3577
3673
            file_version = tree.inventory[file_id].revision
3578
 
            annotate_file(branch, file_version, file_id, long, all, self.outf,
3579
 
                          show_ids=show_ids)
 
3674
            if wt is not None and revision is None:
 
3675
                # If there is a tree and we're not annotating historical
 
3676
                # versions, annotate the working tree's content.
 
3677
                annotate_file_tree(wt, file_id, self.outf, long, all,
 
3678
                    show_ids=show_ids)
 
3679
            else:
 
3680
                annotate_file(branch, file_version, file_id, long, all, self.outf,
 
3681
                              show_ids=show_ids)
3580
3682
        finally:
3581
3683
            if wt is not None:
3582
3684
                wt.unlock()
4191
4293
        from bzrlib.revision import NULL_REVISION
4192
4294
        branch = Branch.open_containing(from_)[0]
4193
4295
        if output is None:
4194
 
            outfile = StringIO()
 
4296
            outfile = cStringIO.StringIO()
4195
4297
        elif output == '-':
4196
4298
            outfile = self.outf
4197
4299
        else: