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
62
62
def tree_files(file_list, default_branch=u'.'):
67
67
(e.path, file_list[0]))
70
def _get_one_revision_tree(command_name, revisions, branch=None, tree=None):
75
rev_tree = tree.basis_tree()
77
rev_tree = branch.basis_tree()
79
if len(revisions) != 1:
80
raise errors.BzrCommandError(
81
'bzr %s --revision takes exactly one revision identifier' % (
83
rev_tree = revisions[0].as_tree(branch)
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'.'):
240
257
rev_id = rev.as_revision_id(b)
241
258
self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
261
class cmd_dump_btree(Command):
262
"""Dump the contents of a btree index file to stdout.
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
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
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
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.'),
283
def run(self, path, raw=False):
284
dirname, basename = osutils.split(path)
285
t = transport.get_transport(dirname)
287
self._dump_raw_bytes(t, basename)
289
self._dump_entries(t, basename)
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)
299
def _dump_raw_bytes(self, trans, basename):
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]
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])
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')
320
def _dump_entries(self, trans, basename):
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()'
326
bt, _ = self._get_index_and_bytes(trans, basename)
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:],))
244
335
class cmd_remove_tree(Command):
245
336
"""Remove the working tree from a given branch/checkout.
1000
1090
old_tree.lock_read()
1002
1092
old_inv = old_tree.inventory
1003
renames = list(_mod_tree.find_renames(old_inv, new_inv))
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]:
1100
renames.append(paths)
1005
1102
for old_name, new_name in renames:
1006
1103
self.outf.write("%s => %s\n" % (old_name, new_name))
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'
2080
2187
b, subdir = Branch.open_containing(branch_or_subdir)
2082
if revision is None:
2083
# should be tree.last_revision FIXME
2084
rev_id = b.last_revision()
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)
2190
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
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)
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()
2133
revision_id = revision[0].as_revision_id(b)
2231
rev_tree = _get_one_revision_tree('cat', revision, branch=b)
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)
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()))
2144
2242
content = rev_tree.get_file_text(old_file_id)
2145
2243
elif cur_file_id is not None:
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'),
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,
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)
3247
tree.set_parent_ids(tree.get_parent_ids()[:1])
3249
self._revert_tree_to_revision(tree, revision, file_list, no_backup)
3353
tree.set_parent_ids(tree.get_parent_ids()[:1])
3355
self._revert_tree_to_revision(tree, revision, file_list, no_backup)
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')
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()
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)
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,
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,
3680
annotate_file(branch, file_version, file_id, long, all, self.outf,
3581
3683
if wt is not None: