84
81
def tree_files_for_add(file_list):
86
Return a tree and list of absolute paths from a file list.
88
Similar to tree_files, but add handles files a bit differently, so it a
89
custom implementation. In particular, MutableTreeTree.smart_add expects
90
absolute paths, which it immediately converts to relative paths.
92
# FIXME Would be nice to just return the relative paths like
93
# internal_tree_files does, but there are a large number of unit tests
94
# that assume the current interface to mutabletree.smart_add
82
"""Add handles files a bit differently so it a custom implementation."""
96
tree, relpath = WorkingTree.open_containing(file_list[0])
84
tree = WorkingTree.open_containing(file_list[0])[0]
97
85
if tree.supports_views():
98
86
view_files = tree.views.lookup_view()
100
88
for filename in file_list:
101
89
if not osutils.is_inside_any(view_files, filename):
102
90
raise errors.FileOutsideView(filename, view_files)
103
file_list = file_list[:]
104
file_list[0] = tree.abspath(relpath)
106
92
tree = WorkingTree.open_containing(u'.')[0]
107
93
if tree.supports_views():
358
323
' --revision or a revision_id')
359
324
b = WorkingTree.open_containing(u'.')[0].branch
361
revisions = b.repository.revisions
362
if revisions is None:
363
raise errors.BzrCommandError('Repository %r does not support '
364
'access to raw revision texts')
326
# TODO: jam 20060112 should cat-revision always output utf-8?
327
if revision_id is not None:
328
revision_id = osutils.safe_revision_id(revision_id, warn=False)
330
self.outf.write(b.repository.get_revision_xml(revision_id).decode('utf-8'))
331
except errors.NoSuchRevision:
332
msg = "The repository %s contains no revision %s." % (b.repository.base,
334
raise errors.BzrCommandError(msg)
335
elif revision is not None:
338
raise errors.BzrCommandError('You cannot specify a NULL'
340
rev_id = rev.as_revision_id(b)
341
self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
366
b.repository.lock_read()
368
# TODO: jam 20060112 should cat-revision always output utf-8?
369
if revision_id is not None:
370
revision_id = osutils.safe_revision_id(revision_id, warn=False)
372
self.print_revision(revisions, revision_id)
373
except errors.NoSuchRevision:
374
msg = "The repository %s contains no revision %s." % (
375
b.repository.base, revision_id)
376
raise errors.BzrCommandError(msg)
377
elif revision is not None:
380
raise errors.BzrCommandError(
381
'You cannot specify a NULL revision.')
382
rev_id = rev.as_revision_id(b)
383
self.print_revision(revisions, rev_id)
385
b.repository.unlock()
388
344
class cmd_dump_btree(Command):
389
345
"""Dump the contents of a btree index file to stdout.
470
424
To re-create the working tree, use "bzr checkout".
472
426
_see_also = ['checkout', 'working-trees']
473
takes_args = ['location*']
427
takes_args = ['location?']
474
428
takes_options = [
476
430
help='Remove the working tree even if it has '
477
431
'uncommitted changes.'),
480
def run(self, location_list, force=False):
481
if not location_list:
484
for location in location_list:
485
d = bzrdir.BzrDir.open(location)
488
working = d.open_workingtree()
489
except errors.NoWorkingTree:
490
raise errors.BzrCommandError("No working tree to remove")
491
except errors.NotLocalUrl:
492
raise errors.BzrCommandError("You cannot remove the working tree"
495
if (working.has_changes()):
496
raise errors.UncommittedChanges(working)
498
working_path = working.bzrdir.root_transport.base
499
branch_path = working.branch.bzrdir.root_transport.base
500
if working_path != branch_path:
501
raise errors.BzrCommandError("You cannot remove the working tree"
502
" from a lightweight checkout")
504
d.destroy_workingtree()
434
def run(self, location='.', force=False):
435
d = bzrdir.BzrDir.open(location)
438
working = d.open_workingtree()
439
except errors.NoWorkingTree:
440
raise errors.BzrCommandError("No working tree to remove")
441
except errors.NotLocalUrl:
442
raise errors.BzrCommandError("You cannot remove the working tree of a "
445
changes = working.changes_from(working.basis_tree())
446
if changes.has_changed():
447
raise errors.UncommittedChanges(working)
449
working_path = working.bzrdir.root_transport.base
450
branch_path = working.branch.bzrdir.root_transport.base
451
if working_path != branch_path:
452
raise errors.BzrCommandError("You cannot remove the working tree from "
453
"a lightweight checkout")
455
d.destroy_workingtree()
507
458
class cmd_revno(Command):
556
Option('tree', help='Show revno of working tree'),
560
def run(self, revision=None, directory=u'.', tree=False,
561
revision_info_list=[]):
489
def run(self, revision=None, directory=u'.', revision_info_list=[]):
564
wt = WorkingTree.open_containing(directory)[0]
567
self.add_cleanup(wt.unlock)
568
except (errors.NoWorkingTree, errors.NotLocalUrl):
570
b = Branch.open_containing(directory)[0]
572
self.add_cleanup(b.unlock)
574
492
if revision is not None:
575
revision_ids.extend(rev.as_revision_id(b) for rev in revision)
493
revs.extend(revision)
576
494
if revision_info_list is not None:
577
for rev_str in revision_info_list:
578
rev_spec = RevisionSpec.from_string(rev_str)
579
revision_ids.append(rev_spec.as_revision_id(b))
580
# No arguments supplied, default to the last revision
581
if len(revision_ids) == 0:
584
raise errors.NoWorkingTree(directory)
585
revision_ids.append(wt.last_revision())
587
revision_ids.append(b.last_revision())
591
for revision_id in revision_ids:
495
for rev in revision_info_list:
496
revs.append(RevisionSpec.from_string(rev))
498
b = Branch.open_containing(directory)[0]
501
revs.append(RevisionSpec.from_string('-1'))
504
revision_id = rev.as_revision_id(b)
593
dotted_revno = b.revision_id_to_dotted_revno(revision_id)
594
revno = '.'.join(str(i) for i in dotted_revno)
506
revno = '%4d' % (b.revision_id_to_revno(revision_id))
595
507
except errors.NoSuchRevision:
597
maxlen = max(maxlen, len(revno))
598
revinfos.append([revno, revision_id])
602
self.outf.write('%*s %s\n' % (maxlen, ri[0], ri[1]))
508
dotted_map = b.get_revision_id_to_revno_map()
509
revno = '.'.join(str(i) for i in dotted_map[revision_id])
510
print '%s %s' % (revno, revision_id)
605
513
class cmd_add(Command):
749
664
revision = _get_one_revision('inventory', revision)
750
665
work_tree, file_list = tree_files(file_list)
751
666
work_tree.lock_read()
752
self.add_cleanup(work_tree.unlock)
753
if revision is not None:
754
tree = revision.as_tree(work_tree.branch)
756
extra_trees = [work_tree]
758
self.add_cleanup(tree.unlock)
763
if file_list is not None:
764
file_ids = tree.paths2ids(file_list, trees=extra_trees,
765
require_versioned=True)
766
# find_ids_across_trees may include some paths that don't
768
entries = sorted((tree.id2path(file_id), tree.inventory[file_id])
769
for file_id in file_ids if file_id in tree)
771
entries = tree.inventory.entries()
668
if revision is not None:
669
tree = revision.as_tree(work_tree.branch)
671
extra_trees = [work_tree]
677
if file_list is not None:
678
file_ids = tree.paths2ids(file_list, trees=extra_trees,
679
require_versioned=True)
680
# find_ids_across_trees may include some paths that don't
682
entries = sorted((tree.id2path(file_id), tree.inventory[file_id])
683
for file_id in file_ids if file_id in tree)
685
entries = tree.inventory.entries()
688
if tree is not work_tree:
774
691
for path, entry in entries:
775
692
if kind and kind != entry.kind:
914
834
dest = osutils.pathjoin(dest_parent, dest_tail)
915
835
mutter("attempting to move %s => %s", src, dest)
916
836
tree.rename_one(src, dest, after=after)
918
self.outf.write("%s => %s\n" % (src, dest))
837
self.outf.write("%s => %s\n" % (src, dest))
921
840
class cmd_pull(Command):
922
841
"""Turn this branch into a mirror of another branch.
924
By default, this command only works on branches that have not diverged.
925
Branches are considered diverged if the destination branch's most recent
926
commit is one that has not been merged (directly or indirectly) into the
843
This command only works on branches that have not diverged. Branches are
844
considered diverged if the destination branch's most recent commit is one
845
that has not been merged (directly or indirectly) into the parent.
929
847
If branches have diverged, you can use 'bzr merge' to integrate the changes
930
848
from one into the other. Once one branch has merged, the other should
931
849
be able to pull it again.
933
If you want to replace your local changes and just want your branch to
934
match the remote one, use pull --overwrite. This will work even if the two
935
branches have diverged.
851
If you want to forget your local changes and just update your branch to
852
match the remote one, use pull --overwrite.
937
854
If there is no default location set, the first pull will set it. After
938
855
that, you can omit the location to use the default. To change the
1017
926
if branch_to.get_parent() is None or remember:
1018
927
branch_to.set_parent(branch_from.base)
1020
if branch_from is not branch_to:
1021
branch_from.lock_read()
1022
self.add_cleanup(branch_from.unlock)
1023
929
if revision is not None:
1024
930
revision_id = revision.as_revision_id(branch_from)
1026
932
branch_to.lock_write()
1027
self.add_cleanup(branch_to.unlock)
1028
if tree_to is not None:
1029
view_info = _get_view_info_for_change_reporter(tree_to)
1030
change_reporter = delta._ChangeReporter(
1031
unversioned_filter=tree_to.is_ignored,
1032
view_info=view_info)
1033
result = tree_to.pull(
1034
branch_from, overwrite, revision_id, change_reporter,
1035
possible_transports=possible_transports, local=local)
1037
result = branch_to.pull(
1038
branch_from, overwrite, revision_id, local=local)
934
if tree_to is not None:
935
view_info = _get_view_info_for_change_reporter(tree_to)
936
change_reporter = delta._ChangeReporter(
937
unversioned_filter=tree_to.is_ignored, view_info=view_info)
938
result = tree_to.pull(branch_from, overwrite, revision_id,
940
possible_transports=possible_transports)
942
result = branch_to.pull(branch_from, overwrite, revision_id)
1040
result.report(self.outf)
1041
if verbose and result.old_revid != result.new_revid:
1042
log.show_branch_change(
1043
branch_to, self.outf, result.old_revno,
944
result.report(self.outf)
945
if verbose and result.old_revid != result.new_revid:
946
log.show_branch_change(branch_to, self.outf, result.old_revno,
1047
952
class cmd_push(Command):
1104
1006
def run(self, location=None, remember=False, overwrite=False,
1105
1007
create_prefix=False, verbose=False, revision=None,
1106
1008
use_existing_dir=False, directory=None, stacked_on=None,
1107
stacked=False, strict=None):
1108
1010
from bzrlib.push import _show_push_branch
1012
# Get the source branch and revision_id
1110
1013
if directory is None:
1111
1014
directory = '.'
1112
# Get the source branch
1114
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1116
strict = br_from.get_config().get_user_option_as_bool('push_strict')
1117
if strict is None: strict = True # default value
1118
# Get the tip's revision_id
1015
br_from = Branch.open_containing(directory)[0]
1119
1016
revision = _get_one_revision('push', revision)
1120
1017
if revision is not None:
1121
1018
revision_id = revision.in_history(br_from).rev_id
1124
if strict and tree is not None and revision_id is None:
1125
if (tree.has_changes()):
1126
raise errors.UncommittedChanges(
1127
tree, more='Use --no-strict to force the push.')
1128
if tree.last_revision() != tree.branch.last_revision():
1129
# The tree has lost sync with its branch, there is little
1130
# chance that the user is aware of it but he can still force
1131
# the push with --no-strict
1132
raise errors.OutOfDateTree(
1133
tree, more='Use --no-strict to force the push.')
1020
revision_id = br_from.last_revision()
1135
1022
# Get the stacked_on branch, if any
1136
1023
if stacked_on is not None:
1188
1075
help='Hard-link working tree files where possible.'),
1189
1076
Option('no-tree',
1190
1077
help="Create a branch without a working-tree."),
1192
help="Switch the checkout in the current directory "
1193
"to the new branch."),
1194
1078
Option('stacked',
1195
1079
help='Create a stacked branch referring to the source branch. '
1196
1080
'The new branch will depend on the availability of the source '
1197
1081
'branch for all operations.'),
1198
1082
Option('standalone',
1199
1083
help='Do not use a shared repository, even if available.'),
1200
Option('use-existing-dir',
1201
help='By default branch will fail if the target'
1202
' directory exists, but does not already'
1203
' have a control directory. This flag will'
1204
' allow branch to proceed.'),
1206
help="Bind new branch to from location."),
1208
1085
aliases = ['get', 'clone']
1210
1087
def run(self, from_location, to_location=None, revision=None,
1211
hardlink=False, stacked=False, standalone=False, no_tree=False,
1212
use_existing_dir=False, switch=False, bind=False):
1213
from bzrlib import switch as _mod_switch
1088
hardlink=False, stacked=False, standalone=False, no_tree=False):
1214
1089
from bzrlib.tag import _merge_tags_if_possible
1215
1091
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1217
1093
revision = _get_one_revision('branch', revision)
1218
1094
br_from.lock_read()
1219
self.add_cleanup(br_from.unlock)
1220
if revision is not None:
1221
revision_id = revision.as_revision_id(br_from)
1223
# FIXME - wt.last_revision, fallback to branch, fall back to
1224
# None or perhaps NULL_REVISION to mean copy nothing
1226
revision_id = br_from.last_revision()
1227
if to_location is None:
1228
to_location = urlutils.derive_to_location(from_location)
1229
to_transport = transport.get_transport(to_location)
1231
to_transport.mkdir('.')
1232
except errors.FileExists:
1233
if not use_existing_dir:
1234
raise errors.BzrCommandError('Target directory "%s" '
1235
'already exists.' % to_location)
1096
if revision is not None:
1097
revision_id = revision.as_revision_id(br_from)
1238
bzrdir.BzrDir.open_from_transport(to_transport)
1239
except errors.NotBranchError:
1242
raise errors.AlreadyBranchError(to_location)
1243
except errors.NoSuchFile:
1244
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1247
# preserve whatever source format we have.
1248
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1249
possible_transports=[to_transport],
1250
accelerator_tree=accelerator_tree,
1251
hardlink=hardlink, stacked=stacked,
1252
force_new_repo=standalone,
1253
create_tree_if_local=not no_tree,
1254
source_branch=br_from)
1255
branch = dir.open_branch()
1256
except errors.NoSuchRevision:
1257
to_transport.delete_tree('.')
1258
msg = "The branch %s has no revision %s." % (from_location,
1260
raise errors.BzrCommandError(msg)
1261
_merge_tags_if_possible(br_from, branch)
1262
# If the source branch is stacked, the new branch may
1263
# be stacked whether we asked for that explicitly or not.
1264
# We therefore need a try/except here and not just 'if stacked:'
1266
note('Created new stacked branch referring to %s.' %
1267
branch.get_stacked_on_url())
1268
except (errors.NotStacked, errors.UnstackableBranchFormat,
1269
errors.UnstackableRepositoryFormat), e:
1270
note('Branched %d revision(s).' % branch.revno())
1272
# Bind to the parent
1273
parent_branch = Branch.open(from_location)
1274
branch.bind(parent_branch)
1275
note('New branch bound to %s' % from_location)
1277
# Switch to the new branch
1278
wt, _ = WorkingTree.open_containing('.')
1279
_mod_switch.switch(wt.bzrdir, branch)
1280
note('Switched to branch: %s',
1281
urlutils.unescape_for_display(branch.base, 'utf-8'))
1099
# FIXME - wt.last_revision, fallback to branch, fall back to
1100
# None or perhaps NULL_REVISION to mean copy nothing
1102
revision_id = br_from.last_revision()
1103
if to_location is None:
1104
to_location = urlutils.derive_to_location(from_location)
1105
to_transport = transport.get_transport(to_location)
1107
to_transport.mkdir('.')
1108
except errors.FileExists:
1109
raise errors.BzrCommandError('Target directory "%s" already'
1110
' exists.' % to_location)
1111
except errors.NoSuchFile:
1112
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1115
# preserve whatever source format we have.
1116
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1117
possible_transports=[to_transport],
1118
accelerator_tree=accelerator_tree,
1119
hardlink=hardlink, stacked=stacked,
1120
force_new_repo=standalone,
1121
create_tree_if_local=not no_tree,
1122
source_branch=br_from)
1123
branch = dir.open_branch()
1124
except errors.NoSuchRevision:
1125
to_transport.delete_tree('.')
1126
msg = "The branch %s has no revision %s." % (from_location,
1128
raise errors.BzrCommandError(msg)
1129
_merge_tags_if_possible(br_from, branch)
1130
# If the source branch is stacked, the new branch may
1131
# be stacked whether we asked for that explicitly or not.
1132
# We therefore need a try/except here and not just 'if stacked:'
1134
note('Created new stacked branch referring to %s.' %
1135
branch.get_stacked_on_url())
1136
except (errors.NotStacked, errors.UnstackableBranchFormat,
1137
errors.UnstackableRepositoryFormat), e:
1138
note('Branched %d revision(s).' % branch.revno())
1284
1143
class cmd_checkout(Command):
1363
1222
def run(self, dir=u'.'):
1364
1223
tree = WorkingTree.open_containing(dir)[0]
1365
1224
tree.lock_read()
1366
self.add_cleanup(tree.unlock)
1367
new_inv = tree.inventory
1368
old_tree = tree.basis_tree()
1369
old_tree.lock_read()
1370
self.add_cleanup(old_tree.unlock)
1371
old_inv = old_tree.inventory
1373
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1374
for f, paths, c, v, p, n, k, e in iterator:
1375
if paths[0] == paths[1]:
1379
renames.append(paths)
1381
for old_name, new_name in renames:
1382
self.outf.write("%s => %s\n" % (old_name, new_name))
1226
new_inv = tree.inventory
1227
old_tree = tree.basis_tree()
1228
old_tree.lock_read()
1230
old_inv = old_tree.inventory
1232
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1233
for f, paths, c, v, p, n, k, e in iterator:
1234
if paths[0] == paths[1]:
1238
renames.append(paths)
1240
for old_name, new_name in renames:
1241
self.outf.write("%s => %s\n" % (old_name, new_name))
1385
1248
class cmd_update(Command):
1392
1255
If you want to discard your local changes, you can just do a
1393
1256
'bzr revert' instead of 'bzr commit' after the update.
1395
If the tree's branch is bound to a master branch, it will also update
1396
the branch from the master.
1399
1259
_see_also = ['pull', 'working-trees', 'status-flags']
1400
1260
takes_args = ['dir?']
1401
takes_options = ['revision']
1402
1261
aliases = ['up']
1404
def run(self, dir='.', revision=None):
1405
if revision is not None and len(revision) != 1:
1406
raise errors.BzrCommandError(
1407
"bzr update --revision takes exactly one revision")
1263
def run(self, dir='.'):
1408
1264
tree = WorkingTree.open_containing(dir)[0]
1409
branch = tree.branch
1410
1265
possible_transports = []
1411
master = branch.get_master_branch(
1266
master = tree.branch.get_master_branch(
1412
1267
possible_transports=possible_transports)
1413
1268
if master is not None:
1414
1269
tree.lock_write()
1415
branch_location = master.base
1417
1271
tree.lock_tree_write()
1418
branch_location = tree.branch.base
1419
self.add_cleanup(tree.unlock)
1420
# get rid of the final '/' and be ready for display
1421
branch_location = urlutils.unescape_for_display(branch_location[:-1],
1423
existing_pending_merges = tree.get_parent_ids()[1:]
1427
# may need to fetch data into a heavyweight checkout
1428
# XXX: this may take some time, maybe we should display a
1430
old_tip = branch.update(possible_transports)
1431
if revision is not None:
1432
revision_id = revision[0].as_revision_id(branch)
1434
revision_id = branch.last_revision()
1435
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1436
revno = branch.revision_id_to_revno(revision_id)
1437
note("Tree is up to date at revision %d of branch %s" %
1438
(revno, branch_location))
1440
view_info = _get_view_info_for_change_reporter(tree)
1441
change_reporter = delta._ChangeReporter(
1442
unversioned_filter=tree.is_ignored,
1443
view_info=view_info)
1273
existing_pending_merges = tree.get_parent_ids()[1:]
1274
last_rev = _mod_revision.ensure_null(tree.last_revision())
1275
if last_rev == _mod_revision.ensure_null(
1276
tree.branch.last_revision()):
1277
# may be up to date, check master too.
1278
if master is None or last_rev == _mod_revision.ensure_null(
1279
master.last_revision()):
1280
revno = tree.branch.revision_id_to_revno(last_rev)
1281
note("Tree is up to date at revision %d." % (revno,))
1283
view_info = _get_view_info_for_change_reporter(tree)
1445
1284
conflicts = tree.update(
1447
possible_transports=possible_transports,
1448
revision=revision_id,
1450
except errors.NoSuchRevision, e:
1451
raise errors.BzrCommandError(
1452
"branch has no revision %s\n"
1453
"bzr update --revision only works"
1454
" for a revision in the branch history"
1456
revno = tree.branch.revision_id_to_revno(
1457
_mod_revision.ensure_null(tree.last_revision()))
1458
note('Updated to revision %d of branch %s' %
1459
(revno, branch_location))
1460
if tree.get_parent_ids()[1:] != existing_pending_merges:
1461
note('Your local commits will now show as pending merges with '
1462
"'bzr status', and can be committed with 'bzr commit'.")
1285
delta._ChangeReporter(unversioned_filter=tree.is_ignored,
1286
view_info=view_info), possible_transports=possible_transports)
1287
revno = tree.branch.revision_id_to_revno(
1288
_mod_revision.ensure_null(tree.last_revision()))
1289
note('Updated to revision %d.' % (revno,))
1290
if tree.get_parent_ids()[1:] != existing_pending_merges:
1291
note('Your local commits will now show as pending merges with '
1292
"'bzr status', and can be committed with 'bzr commit'.")
1469
1301
class cmd_info(Command):
1540
1372
file_list = [f for f in file_list]
1542
1374
tree.lock_write()
1543
self.add_cleanup(tree.unlock)
1544
# Heuristics should probably all move into tree.remove_smart or
1547
added = tree.changes_from(tree.basis_tree(),
1548
specific_files=file_list).added
1549
file_list = sorted([f[0] for f in added], reverse=True)
1550
if len(file_list) == 0:
1551
raise errors.BzrCommandError('No matching files.')
1552
elif file_list is None:
1553
# missing files show up in iter_changes(basis) as
1554
# versioned-with-no-kind.
1556
for change in tree.iter_changes(tree.basis_tree()):
1557
# Find paths in the working tree that have no kind:
1558
if change[1][1] is not None and change[6][1] is None:
1559
missing.append(change[1][1])
1560
file_list = sorted(missing, reverse=True)
1561
file_deletion_strategy = 'keep'
1562
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1563
keep_files=file_deletion_strategy=='keep',
1564
force=file_deletion_strategy=='force')
1376
# Heuristics should probably all move into tree.remove_smart or
1379
added = tree.changes_from(tree.basis_tree(),
1380
specific_files=file_list).added
1381
file_list = sorted([f[0] for f in added], reverse=True)
1382
if len(file_list) == 0:
1383
raise errors.BzrCommandError('No matching files.')
1384
elif file_list is None:
1385
# missing files show up in iter_changes(basis) as
1386
# versioned-with-no-kind.
1388
for change in tree.iter_changes(tree.basis_tree()):
1389
# Find paths in the working tree that have no kind:
1390
if change[1][1] is not None and change[6][1] is None:
1391
missing.append(change[1][1])
1392
file_list = sorted(missing, reverse=True)
1393
file_deletion_strategy = 'keep'
1394
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1395
keep_files=file_deletion_strategy=='keep',
1396
force=file_deletion_strategy=='force')
1567
1401
class cmd_file_id(Command):
2369
2181
diff_type = 'full'
2371
# Build the log formatter
2372
if log_format is None:
2373
log_format = log.log_formatter_registry.get_default(b)
2374
# Make a non-encoding output to include the diffs - bug 328007
2375
unencoded_output = ui.ui_factory.make_output_stream(encoding_type='exact')
2376
lf = log_format(show_ids=show_ids, to_file=self.outf,
2377
to_exact_file=unencoded_output,
2378
show_timezone=timezone,
2379
delta_format=get_verbosity_level(),
2381
show_advice=levels is None)
2383
# Choose the algorithm for doing the logging. It's annoying
2384
# having multiple code paths like this but necessary until
2385
# the underlying repository format is faster at generating
2386
# deltas or can provide everything we need from the indices.
2387
# The default algorithm - match-using-deltas - works for
2388
# multiple files and directories and is faster for small
2389
# amounts of history (200 revisions say). However, it's too
2390
# slow for logging a single file in a repository with deep
2391
# history, i.e. > 10K revisions. In the spirit of "do no
2392
# evil when adding features", we continue to use the
2393
# original algorithm - per-file-graph - for the "single
2394
# file that isn't a directory without showing a delta" case.
2395
partial_history = revision and b.repository._format.supports_chks
2396
match_using_deltas = (len(file_ids) != 1 or filter_by_dir
2397
or delta_type or partial_history)
2399
# Build the LogRequest and execute it
2400
if len(file_ids) == 0:
2402
rqst = make_log_request_dict(
2403
direction=direction, specific_fileids=file_ids,
2404
start_revision=rev1, end_revision=rev2, limit=limit,
2405
message_search=message, delta_type=delta_type,
2406
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2407
Logger(b, rqst).show(lf)
2185
# Build the log formatter
2186
if log_format is None:
2187
log_format = log.log_formatter_registry.get_default(b)
2188
lf = log_format(show_ids=show_ids, to_file=self.outf,
2189
show_timezone=timezone,
2190
delta_format=get_verbosity_level(),
2193
# Choose the algorithm for doing the logging. It's annoying
2194
# having multiple code paths like this but necessary until
2195
# the underlying repository format is faster at generating
2196
# deltas or can provide everything we need from the indices.
2197
# The default algorithm - match-using-deltas - works for
2198
# multiple files and directories and is faster for small
2199
# amounts of history (200 revisions say). However, it's too
2200
# slow for logging a single file in a repository with deep
2201
# history, i.e. > 10K revisions. In the spirit of "do no
2202
# evil when adding features", we continue to use the
2203
# original algorithm - per-file-graph - for the "single
2204
# file that isn't a directory without showing a delta" case.
2205
partial_history = revision and b.repository._format.supports_chks
2206
match_using_deltas = (len(file_ids) != 1 or filter_by_dir
2207
or delta_type or partial_history)
2209
# Build the LogRequest and execute it
2210
if len(file_ids) == 0:
2212
rqst = make_log_request_dict(
2213
direction=direction, specific_fileids=file_ids,
2214
start_revision=rev1, end_revision=rev2, limit=limit,
2215
message_search=message, delta_type=delta_type,
2216
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2217
Logger(b, rqst).show(lf)
2410
2222
def _get_revision_range(revisionspec_list, branch, command_name):
2553
2360
note("Ignoring files outside view. View is %s" % view_str)
2555
2362
tree.lock_read()
2556
self.add_cleanup(tree.unlock)
2557
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2558
from_dir=relpath, recursive=recursive):
2559
# Apply additional masking
2560
if not all and not selection[fc]:
2562
if kind is not None and fkind != kind:
2567
fullpath = osutils.pathjoin(relpath, fp)
2570
views.check_path_in_view(tree, fullpath)
2571
except errors.FileOutsideView:
2576
fp = osutils.pathjoin(prefix, fp)
2577
kindch = entry.kind_character()
2578
outstring = fp + kindch
2579
ui.ui_factory.clear_term()
2581
outstring = '%-8s %s' % (fc, outstring)
2582
if show_ids and fid is not None:
2583
outstring = "%-50s %s" % (outstring, fid)
2584
self.outf.write(outstring + '\n')
2586
self.outf.write(fp + '\0')
2589
self.outf.write(fid)
2590
self.outf.write('\0')
2598
self.outf.write('%-50s %s\n' % (outstring, my_id))
2600
self.outf.write(outstring + '\n')
2364
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False):
2365
if fp.startswith(relpath):
2366
fp = osutils.pathjoin(prefix, fp[len(relpath):])
2367
if non_recursive and '/' in fp:
2369
if not all and not selection[fc]:
2371
if kind is not None and fkind != kind:
2375
views.check_path_in_view(tree, fp)
2376
except errors.FileOutsideView:
2378
kindch = entry.kind_character()
2379
outstring = fp + kindch
2381
outstring = '%-8s %s' % (fc, outstring)
2382
if show_ids and fid is not None:
2383
outstring = "%-50s %s" % (outstring, fid)
2384
self.outf.write(outstring + '\n')
2386
self.outf.write(fp + '\0')
2389
self.outf.write(fid)
2390
self.outf.write('\0')
2398
self.outf.write('%-50s %s\n' % (outstring, my_id))
2400
self.outf.write(outstring + '\n')
2603
2405
class cmd_unknowns(Command):
2918
2696
class cmd_commit(Command):
2919
2697
"""Commit changes into a new revision.
2921
An explanatory message needs to be given for each commit. This is
2922
often done by using the --message option (getting the message from the
2923
command line) or by using the --file option (getting the message from
2924
a file). If neither of these options is given, an editor is opened for
2925
the user to enter the message. To see the changed files in the
2926
boilerplate text loaded into the editor, use the --show-diff option.
2928
By default, the entire tree is committed and the person doing the
2929
commit is assumed to be the author. These defaults can be overridden
2934
If selected files are specified, only changes to those files are
2935
committed. If a directory is specified then the directory and
2936
everything within it is committed.
2938
When excludes are given, they take precedence over selected files.
2939
For example, to commit only changes within foo, but not changes
2942
bzr commit foo -x foo/bar
2944
A selective commit after a merge is not yet supported.
2948
If the author of the change is not the same person as the committer,
2949
you can specify the author's name using the --author option. The
2950
name should be in the same format as a committer-id, e.g.
2951
"John Doe <jdoe@example.com>". If there is more than one author of
2952
the change you can specify the option multiple times, once for each
2957
A common mistake is to forget to add a new file or directory before
2958
running the commit command. The --strict option checks for unknown
2959
files and aborts the commit if any are found. More advanced pre-commit
2960
checks can be implemented by defining hooks. See ``bzr help hooks``
2965
If you accidentially commit the wrong changes or make a spelling
2966
mistake in the commit message say, you can use the uncommit command
2967
to undo it. See ``bzr help uncommit`` for details.
2969
Hooks can also be configured to run after a commit. This allows you
2970
to trigger updates to external systems like bug trackers. The --fixes
2971
option can be used to record the association between a revision and
2972
one or more bugs. See ``bzr help bugs`` for details.
2974
A selective commit may fail in some cases where the committed
2975
tree would be invalid. Consider::
2980
bzr commit foo -m "committing foo"
2981
bzr mv foo/bar foo/baz
2984
bzr commit foo/bar -m "committing bar but not baz"
2986
In the example above, the last commit will fail by design. This gives
2987
the user the opportunity to decide whether they want to commit the
2988
rename at the same time, separately first, or not at all. (As a general
2989
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
2699
If no arguments are given, the entire tree is committed.
2701
If selected files are specified, only changes to those files are
2702
committed. If a directory is specified then the directory and everything
2703
within it is committed.
2705
When excludes are given, they take precedence over selected files.
2706
For example, too commit only changes within foo, but not changes within
2709
bzr commit foo -x foo/bar
2711
If author of the change is not the same person as the committer, you can
2712
specify the author's name using the --author option. The name should be
2713
in the same format as a committer-id, e.g. "John Doe <jdoe@example.com>".
2714
If there is more than one author of the change you can specify the option
2715
multiple times, once for each author.
2717
A selected-file commit may fail in some cases where the committed
2718
tree would be invalid. Consider::
2723
bzr commit foo -m "committing foo"
2724
bzr mv foo/bar foo/baz
2727
bzr commit foo/bar -m "committing bar but not baz"
2729
In the example above, the last commit will fail by design. This gives
2730
the user the opportunity to decide whether they want to commit the
2731
rename at the same time, separately first, or not at all. (As a general
2732
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
2734
Note: A selected-file commit after a merge is not yet supported.
2991
2736
# TODO: Run hooks on tree to-be-committed, and after commit.
3143
2859
raise errors.BzrCommandError("empty commit message specified")
3144
2860
return my_message
3146
# The API permits a commit with a filter of [] to mean 'select nothing'
3147
# but the command line should not do that.
3148
if not selected_list:
3149
selected_list = None
3151
2863
tree.commit(message_callback=get_message,
3152
2864
specific_files=selected_list,
3153
2865
allow_pointless=unchanged, strict=strict, local=local,
3154
2866
reporter=None, verbose=verbose, revprops=properties,
3155
authors=author, timestamp=commit_stamp,
3157
2868
exclude=safe_relpath_files(tree, exclude))
3158
2869
except PointlessCommit:
3159
2870
# FIXME: This should really happen before the file is read in;
3160
2871
# perhaps prepare the commit; get the message; then actually commit
3161
raise errors.BzrCommandError("No changes to commit."
3162
" Use --unchanged to commit anyhow.")
2872
raise errors.BzrCommandError("no changes to commit."
2873
" use --unchanged to commit anyhow")
3163
2874
except ConflictsInTree:
3164
2875
raise errors.BzrCommandError('Conflicts detected in working '
3165
2876
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3183
2894
The working tree and branch checks will only give output if a problem is
3184
2895
detected. The output fields of the repository check are:
3187
This is just the number of revisions checked. It doesn't
3191
This is just the number of versionedfiles checked. It
3192
doesn't indicate a problem.
3194
unreferenced ancestors
3195
Texts that are ancestors of other texts, but
3196
are not properly referenced by the revision ancestry. This is a
3197
subtle problem that Bazaar can work around.
3200
This is the total number of unique file contents
3201
seen in the checked revisions. It does not indicate a problem.
3204
This is the total number of repeated texts seen
3205
in the checked revisions. Texts can be repeated when their file
3206
entries are modified, but the file contents are not. It does not
2897
revisions: This is just the number of revisions checked. It doesn't
2899
versionedfiles: This is just the number of versionedfiles checked. It
2900
doesn't indicate a problem.
2901
unreferenced ancestors: Texts that are ancestors of other texts, but
2902
are not properly referenced by the revision ancestry. This is a
2903
subtle problem that Bazaar can work around.
2904
unique file texts: This is the total number of unique file contents
2905
seen in the checked revisions. It does not indicate a problem.
2906
repeated file texts: This is the total number of repeated texts seen
2907
in the checked revisions. Texts can be repeated when their file
2908
entries are modified, but the file contents are not. It does not
3209
2911
If no restrictions are specified, all Bazaar data that is found at the given
3210
2912
location will be checked.
3569
3274
verbose = not is_quiet()
3570
3275
# TODO: should possibly lock the history file...
3571
3276
benchfile = open(".perf_history", "at", buffering=1)
3572
self.add_cleanup(benchfile.close)
3574
3278
test_suite_factory = None
3575
3279
benchfile = None
3576
selftest_kwargs = {"verbose": verbose,
3578
"stop_on_failure": one,
3579
"transport": transport,
3580
"test_suite_factory": test_suite_factory,
3581
"lsprof_timed": lsprof_timed,
3582
"lsprof_tests": lsprof_tests,
3583
"bench_history": benchfile,
3584
"matching_tests_first": first,
3585
"list_only": list_only,
3586
"random_seed": randomize,
3587
"exclude_pattern": exclude,
3589
"load_list": load_list,
3590
"debug_flags": debugflag,
3591
"starting_with": starting_with
3593
selftest_kwargs.update(self.additional_selftest_args)
3594
result = selftest(**selftest_kwargs)
3281
selftest_kwargs = {"verbose": verbose,
3283
"stop_on_failure": one,
3284
"transport": transport,
3285
"test_suite_factory": test_suite_factory,
3286
"lsprof_timed": lsprof_timed,
3287
"bench_history": benchfile,
3288
"matching_tests_first": first,
3289
"list_only": list_only,
3290
"random_seed": randomize,
3291
"exclude_pattern": exclude,
3293
"load_list": load_list,
3294
"debug_flags": debugflag,
3295
"starting_with": starting_with
3297
selftest_kwargs.update(self.additional_selftest_args)
3298
result = selftest(**selftest_kwargs)
3300
if benchfile is not None:
3303
note('tests passed')
3305
note('tests failed')
3595
3306
return int(not result)
3767
3463
verified = 'inapplicable'
3768
3464
tree = WorkingTree.open_containing(directory)[0]
3466
# die as quickly as possible if there are uncommitted changes
3771
3468
basis_tree = tree.revision_tree(tree.last_revision())
3772
3469
except errors.NoSuchRevision:
3773
3470
basis_tree = tree.basis_tree()
3775
# die as quickly as possible if there are uncommitted changes
3777
if tree.has_changes():
3472
changes = tree.changes_from(basis_tree)
3473
if changes.has_changed():
3778
3474
raise errors.UncommittedChanges(tree)
3780
3476
view_info = _get_view_info_for_change_reporter(tree)
3781
3477
change_reporter = delta._ChangeReporter(
3782
3478
unversioned_filter=tree.is_ignored, view_info=view_info)
3783
pb = ui.ui_factory.nested_progress_bar()
3784
self.add_cleanup(pb.finished)
3786
self.add_cleanup(tree.unlock)
3787
if location is not None:
3789
mergeable = bundle.read_mergeable_from_url(location,
3790
possible_transports=possible_transports)
3791
except errors.NotABundle:
3481
pb = ui.ui_factory.nested_progress_bar()
3482
cleanups.append(pb.finished)
3484
cleanups.append(tree.unlock)
3485
if location is not None:
3487
mergeable = bundle.read_mergeable_from_url(location,
3488
possible_transports=possible_transports)
3489
except errors.NotABundle:
3493
raise errors.BzrCommandError('Cannot use --uncommitted'
3494
' with bundles or merge directives.')
3496
if revision is not None:
3497
raise errors.BzrCommandError(
3498
'Cannot use -r with merge directives or bundles')
3499
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3502
if merger is None and uncommitted:
3503
if revision is not None and len(revision) > 0:
3504
raise errors.BzrCommandError('Cannot use --uncommitted and'
3505
' --revision at the same time.')
3506
location = self._select_branch_location(tree, location)[0]
3507
other_tree, other_path = WorkingTree.open_containing(location)
3508
merger = _mod_merge.Merger.from_uncommitted(tree, other_tree,
3510
allow_pending = False
3511
if other_path != '':
3512
merger.interesting_files = [other_path]
3515
merger, allow_pending = self._get_merger_from_branch(tree,
3516
location, revision, remember, possible_transports, pb)
3518
merger.merge_type = merge_type
3519
merger.reprocess = reprocess
3520
merger.show_base = show_base
3521
self.sanity_check_merger(merger)
3522
if (merger.base_rev_id == merger.other_rev_id and
3523
merger.other_rev_id is not None):
3524
note('Nothing to do.')
3527
if merger.interesting_files is not None:
3528
raise errors.BzrCommandError('Cannot pull individual files')
3529
if (merger.base_rev_id == tree.last_revision()):
3530
result = tree.pull(merger.other_branch, False,
3531
merger.other_rev_id)
3532
result.report(self.outf)
3534
merger.check_basis(False)
3536
return self._do_preview(merger)
3795
raise errors.BzrCommandError('Cannot use --uncommitted'
3796
' with bundles or merge directives.')
3798
if revision is not None:
3799
raise errors.BzrCommandError(
3800
'Cannot use -r with merge directives or bundles')
3801
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3804
if merger is None and uncommitted:
3805
if revision is not None and len(revision) > 0:
3806
raise errors.BzrCommandError('Cannot use --uncommitted and'
3807
' --revision at the same time.')
3808
merger = self.get_merger_from_uncommitted(tree, location, None)
3809
allow_pending = False
3812
merger, allow_pending = self._get_merger_from_branch(tree,
3813
location, revision, remember, possible_transports, None)
3815
merger.merge_type = merge_type
3816
merger.reprocess = reprocess
3817
merger.show_base = show_base
3818
self.sanity_check_merger(merger)
3819
if (merger.base_rev_id == merger.other_rev_id and
3820
merger.other_rev_id is not None):
3821
note('Nothing to do.')
3824
if merger.interesting_files is not None:
3825
raise errors.BzrCommandError('Cannot pull individual files')
3826
if (merger.base_rev_id == tree.last_revision()):
3827
result = tree.pull(merger.other_branch, False,
3828
merger.other_rev_id)
3829
result.report(self.outf)
3831
if merger.this_basis is None:
3832
raise errors.BzrCommandError(
3833
"This branch has no commits."
3834
" (perhaps you would prefer 'bzr pull')")
3836
return self._do_preview(merger)
3838
return self._do_interactive(merger)
3840
return self._do_merge(merger, change_reporter, allow_pending,
3843
def _get_preview(self, merger):
3538
return self._do_merge(merger, change_reporter, allow_pending,
3541
for cleanup in reversed(cleanups):
3544
def _do_preview(self, merger):
3545
from bzrlib.diff import show_diff_trees
3844
3546
tree_merger = merger.make_merger()
3845
3547
tt = tree_merger.make_preview_transform()
3846
self.add_cleanup(tt.finalize)
3847
result_tree = tt.get_preview_tree()
3850
def _do_preview(self, merger):
3851
from bzrlib.diff import show_diff_trees
3852
result_tree = self._get_preview(merger)
3853
show_diff_trees(merger.this_tree, result_tree, self.outf,
3854
old_label='', new_label='')
3549
result_tree = tt.get_preview_tree()
3550
show_diff_trees(merger.this_tree, result_tree, self.outf,
3551
old_label='', new_label='')
3856
3555
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3857
3556
merger.change_reporter = change_reporter
4045
3712
merge_type = _mod_merge.Merge3Merger
4046
3713
tree, file_list = tree_files(file_list)
4047
3714
tree.lock_write()
4048
self.add_cleanup(tree.unlock)
4049
parents = tree.get_parent_ids()
4050
if len(parents) != 2:
4051
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4052
" merges. Not cherrypicking or"
4054
repository = tree.branch.repository
4055
interesting_ids = None
4057
conflicts = tree.conflicts()
4058
if file_list is not None:
4059
interesting_ids = set()
4060
for filename in file_list:
4061
file_id = tree.path2id(filename)
4063
raise errors.NotVersionedError(filename)
4064
interesting_ids.add(file_id)
4065
if tree.kind(file_id) != "directory":
3716
parents = tree.get_parent_ids()
3717
if len(parents) != 2:
3718
raise errors.BzrCommandError("Sorry, remerge only works after normal"
3719
" merges. Not cherrypicking or"
3721
repository = tree.branch.repository
3722
interesting_ids = None
3724
conflicts = tree.conflicts()
3725
if file_list is not None:
3726
interesting_ids = set()
3727
for filename in file_list:
3728
file_id = tree.path2id(filename)
3730
raise errors.NotVersionedError(filename)
3731
interesting_ids.add(file_id)
3732
if tree.kind(file_id) != "directory":
4068
for name, ie in tree.inventory.iter_entries(file_id):
4069
interesting_ids.add(ie.file_id)
4070
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
4072
# Remerge only supports resolving contents conflicts
4073
allowed_conflicts = ('text conflict', 'contents conflict')
4074
restore_files = [c.path for c in conflicts
4075
if c.typestring in allowed_conflicts]
4076
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
4077
tree.set_conflicts(ConflictList(new_conflicts))
4078
if file_list is not None:
4079
restore_files = file_list
4080
for filename in restore_files:
3735
for name, ie in tree.inventory.iter_entries(file_id):
3736
interesting_ids.add(ie.file_id)
3737
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
3739
# Remerge only supports resolving contents conflicts
3740
allowed_conflicts = ('text conflict', 'contents conflict')
3741
restore_files = [c.path for c in conflicts
3742
if c.typestring in allowed_conflicts]
3743
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
3744
tree.set_conflicts(ConflictList(new_conflicts))
3745
if file_list is not None:
3746
restore_files = file_list
3747
for filename in restore_files:
3749
restore(tree.abspath(filename))
3750
except errors.NotConflicted:
3752
# Disable pending merges, because the file texts we are remerging
3753
# have not had those merges performed. If we use the wrong parents
3754
# list, we imply that the working tree text has seen and rejected
3755
# all the changes from the other tree, when in fact those changes
3756
# have not yet been seen.
3757
pb = ui.ui_factory.nested_progress_bar()
3758
tree.set_parent_ids(parents[:1])
4082
restore(tree.abspath(filename))
4083
except errors.NotConflicted:
4085
# Disable pending merges, because the file texts we are remerging
4086
# have not had those merges performed. If we use the wrong parents
4087
# list, we imply that the working tree text has seen and rejected
4088
# all the changes from the other tree, when in fact those changes
4089
# have not yet been seen.
4090
tree.set_parent_ids(parents[:1])
4092
merger = _mod_merge.Merger.from_revision_ids(None, tree, parents[1])
4093
merger.interesting_ids = interesting_ids
4094
merger.merge_type = merge_type
4095
merger.show_base = show_base
4096
merger.reprocess = reprocess
4097
conflicts = merger.do_merge()
3760
merger = _mod_merge.Merger.from_revision_ids(pb,
3762
merger.interesting_ids = interesting_ids
3763
merger.merge_type = merge_type
3764
merger.show_base = show_base
3765
merger.reprocess = reprocess
3766
conflicts = merger.do_merge()
3768
tree.set_parent_ids(parents)
4099
tree.set_parent_ids(parents)
4100
3772
if conflicts > 0:
4124
3796
name. If you name a directory, all the contents of that directory will be
4127
If you have newly added files since the target revision, they will be
4128
removed. If the files to be removed have been changed, backups will be
4129
created as above. Directories containing unknown files will not be
3799
Any files that have been newly added since that revision will be deleted,
3800
with a backup kept if appropriate. Directories containing unknown files
3801
will not be deleted.
4132
The working tree contains a list of revisions that have been merged but
4133
not yet committed. These revisions will be included as additional parents
4134
of the next commit. Normally, using revert clears that list as well as
4135
reverting the files. If any files are specified, revert leaves the list
4136
of uncommitted merges alone and reverts only the files. Use ``bzr revert
4137
.`` in the tree root to revert all files but keep the recorded merges,
4138
and ``bzr revert --forget-merges`` to clear the pending merge list without
3803
The working tree contains a list of pending merged revisions, which will
3804
be included as parents in the next commit. Normally, revert clears that
3805
list as well as reverting the files. If any files are specified, revert
3806
leaves the pending merge list alone and reverts only the files. Use "bzr
3807
revert ." in the tree root to revert all files but keep the merge record,
3808
and "bzr revert --forget-merges" to clear the pending merge list without
4139
3809
reverting any files.
4141
Using "bzr revert --forget-merges", it is possible to apply all of the
4142
changes from a branch in a single revision. To do this, perform the merge
4143
as desired. Then doing revert with the "--forget-merges" option will keep
4144
the content of the tree as it was, but it will clear the list of pending
4145
merges. The next commit will then contain all of the changes that are
4146
present in the other branch, but without any other parent revisions.
4147
Because this technique forgets where these changes originated, it may
4148
cause additional conflicts on later merges involving the same source and
4152
3812
_see_also = ['cat', 'export']
4319
3981
if remote_branch.base == local_branch.base:
4320
3982
remote_branch = local_branch
4322
local_branch.lock_read()
4323
self.add_cleanup(local_branch.unlock)
4324
3984
local_revid_range = _revision_range_to_revid_range(
4325
3985
_get_revision_range(my_revision, local_branch,
4328
remote_branch.lock_read()
4329
self.add_cleanup(remote_branch.unlock)
4330
3988
remote_revid_range = _revision_range_to_revid_range(
4331
3989
_get_revision_range(revision,
4332
3990
remote_branch, self.name()))
4334
local_extra, remote_extra = find_unmerged(
4335
local_branch, remote_branch, restrict,
4336
backward=not reverse,
4337
include_merges=include_merges,
4338
local_revid_range=local_revid_range,
4339
remote_revid_range=remote_revid_range)
4341
if log_format is None:
4342
registry = log.log_formatter_registry
4343
log_format = registry.get_default(local_branch)
4344
lf = log_format(to_file=self.outf,
4346
show_timezone='original')
4349
if local_extra and not theirs_only:
4350
message("You have %d extra revision(s):\n" %
4352
for revision in iter_log_revisions(local_extra,
4353
local_branch.repository,
4355
lf.log_revision(revision)
4356
printed_local = True
4359
printed_local = False
4361
if remote_extra and not mine_only:
4362
if printed_local is True:
4364
message("You are missing %d revision(s):\n" %
4366
for revision in iter_log_revisions(remote_extra,
4367
remote_branch.repository,
4369
lf.log_revision(revision)
4372
if mine_only and not local_extra:
4373
# We checked local, and found nothing extra
4374
message('This branch is up to date.\n')
4375
elif theirs_only and not remote_extra:
4376
# We checked remote, and found nothing extra
4377
message('Other branch is up to date.\n')
4378
elif not (mine_only or theirs_only or local_extra or
4380
# We checked both branches, and neither one had extra
4382
message("Branches are up to date.\n")
3992
local_branch.lock_read()
3994
remote_branch.lock_read()
3996
local_extra, remote_extra = find_unmerged(
3997
local_branch, remote_branch, restrict,
3998
backward=not reverse,
3999
include_merges=include_merges,
4000
local_revid_range=local_revid_range,
4001
remote_revid_range=remote_revid_range)
4003
if log_format is None:
4004
registry = log.log_formatter_registry
4005
log_format = registry.get_default(local_branch)
4006
lf = log_format(to_file=self.outf,
4008
show_timezone='original')
4011
if local_extra and not theirs_only:
4012
message("You have %d extra revision(s):\n" %
4014
for revision in iter_log_revisions(local_extra,
4015
local_branch.repository,
4017
lf.log_revision(revision)
4018
printed_local = True
4021
printed_local = False
4023
if remote_extra and not mine_only:
4024
if printed_local is True:
4026
message("You are missing %d revision(s):\n" %
4028
for revision in iter_log_revisions(remote_extra,
4029
remote_branch.repository,
4031
lf.log_revision(revision)
4034
if mine_only and not local_extra:
4035
# We checked local, and found nothing extra
4036
message('This branch is up to date.\n')
4037
elif theirs_only and not remote_extra:
4038
# We checked remote, and found nothing extra
4039
message('Other branch is up to date.\n')
4040
elif not (mine_only or theirs_only or local_extra or
4042
# We checked both branches, and neither one had extra
4044
message("Branches are up to date.\n")
4046
remote_branch.unlock()
4048
local_branch.unlock()
4384
4049
if not status_code and parent is None and other_branch is not None:
4385
4050
local_branch.lock_write()
4386
self.add_cleanup(local_branch.unlock)
4387
# handle race conditions - a parent might be set while we run.
4388
if local_branch.get_parent() is None:
4389
local_branch.set_parent(remote_branch.base)
4052
# handle race conditions - a parent might be set while we run.
4053
if local_branch.get_parent() is None:
4054
local_branch.set_parent(remote_branch.base)
4056
local_branch.unlock()
4390
4057
return status_code
4512
4181
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4513
4182
if wt is not None:
4515
self.add_cleanup(wt.unlock)
4517
4185
branch.lock_read()
4518
self.add_cleanup(branch.unlock)
4519
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4521
self.add_cleanup(tree.unlock)
4523
file_id = wt.path2id(relpath)
4525
file_id = tree.path2id(relpath)
4527
raise errors.NotVersionedError(filename)
4528
file_version = tree.inventory[file_id].revision
4529
if wt is not None and revision is None:
4530
# If there is a tree and we're not annotating historical
4531
# versions, annotate the working tree's content.
4532
annotate_file_tree(wt, file_id, self.outf, long, all,
4535
annotate_file(branch, file_version, file_id, long, all, self.outf,
4187
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4189
file_id = wt.path2id(relpath)
4191
file_id = tree.path2id(relpath)
4193
raise errors.NotVersionedError(filename)
4194
file_version = tree.inventory[file_id].revision
4195
if wt is not None and revision is None:
4196
# If there is a tree and we're not annotating historical
4197
# versions, annotate the working tree's content.
4198
annotate_file_tree(wt, file_id, self.outf, long, all,
4201
annotate_file(branch, file_version, file_id, long, all, self.outf,
4539
4210
class cmd_re_sign(Command):
4830
4500
Option('allow-writes',
4831
4501
help='By default the server is a readonly server. Supplying '
4832
4502
'--allow-writes enables write access to the contents of '
4833
'the served directory and below. Note that ``bzr serve`` '
4834
'does not perform authentication, so unless some form of '
4835
'external authentication is arranged supplying this '
4836
'option leads to global uncontrolled write access to your '
4503
'the served directory and below.'
4507
def run_smart_server(self, smart_server):
4508
"""Run 'smart_server' forever, with no UI output at all."""
4509
# For the duration of this server, no UI output is permitted. note
4510
# that this may cause problems with blackbox tests. This should be
4511
# changed with care though, as we dont want to use bandwidth sending
4512
# progress over stderr to smart server clients!
4513
from bzrlib import lockdir
4514
old_factory = ui.ui_factory
4515
old_lockdir_timeout = lockdir._DEFAULT_TIMEOUT_SECONDS
4517
ui.ui_factory = ui.SilentUIFactory()
4518
lockdir._DEFAULT_TIMEOUT_SECONDS = 0
4519
smart_server.serve()
4521
ui.ui_factory = old_factory
4522
lockdir._DEFAULT_TIMEOUT_SECONDS = old_lockdir_timeout
4841
4524
def get_host_and_port(self, port):
4842
4525
"""Return the host and port to run the smart server on.
4844
If 'port' is None, None will be returned for the host and port.
4527
If 'port' is None, the default host (`medium.BZR_DEFAULT_INTERFACE`)
4528
and port (`medium.BZR_DEFAULT_PORT`) will be used.
4846
4530
If 'port' has a colon in it, the string before the colon will be
4847
4531
interpreted as the host.
4850
4534
:return: A tuple of (host, port), where 'host' is a host name or IP,
4851
4535
and port is an integer TCP/IP port.
4854
if port is not None:
4537
from bzrlib.smart import medium
4538
host = medium.BZR_DEFAULT_INTERFACE
4540
port = medium.BZR_DEFAULT_PORT
4855
4542
if ':' in port:
4856
4543
host, port = port.split(':')
4857
4544
port = int(port)
4858
4545
return host, port
4860
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4862
from bzrlib.transport import get_transport, transport_server_registry
4547
def get_smart_server(self, transport, inet, port):
4548
"""Construct a smart server.
4550
:param transport: The base transport from which branches will be
4552
:param inet: If True, serve over stdin and stdout. Used for running
4554
:param port: The port to listen on. By default, it's `
4555
medium.BZR_DEFAULT_PORT`. See `get_host_and_port` for more
4557
:return: A smart server.
4559
from bzrlib.smart import medium, server
4561
smart_server = medium.SmartServerPipeStreamMedium(
4562
sys.stdin, sys.stdout, transport)
4564
host, port = self.get_host_and_port(port)
4565
smart_server = server.SmartTCPServer(
4566
transport, host=host, port=port)
4567
note('listening on port: %s' % smart_server.port)
4570
def run(self, port=None, inet=False, directory=None, allow_writes=False):
4571
from bzrlib.transport import get_transport
4572
from bzrlib.transport.chroot import ChrootServer
4863
4573
if directory is None:
4864
4574
directory = os.getcwd()
4865
if protocol is None:
4866
protocol = transport_server_registry.get()
4867
host, port = self.get_host_and_port(port)
4868
4575
url = urlutils.local_path_to_url(directory)
4869
4576
if not allow_writes:
4870
4577
url = 'readonly+' + url
4871
transport = get_transport(url)
4872
protocol(transport, host, port, inet)
4578
chroot_server = ChrootServer(get_transport(url))
4579
chroot_server.setUp()
4580
t = get_transport(chroot_server.get_url())
4581
smart_server = self.get_smart_server(t, inet, port)
4582
self.run_smart_server(smart_server)
4875
4585
class cmd_join(Command):
4876
"""Combine a tree into its containing tree.
4586
"""Combine a subtree into its containing tree.
4878
This command requires the target tree to be in a rich-root format.
4588
This command is for experimental use only. It requires the target tree
4589
to be in dirstate-with-subtree format, which cannot be converted into
4880
4592
The TREE argument should be an independent tree, inside another tree, but
4881
4593
not part of it. (Such trees can be produced by "bzr split", but also by
5056
4775
directly from the merge directive, without retrieving data from a
5059
`bzr send` creates a compact data set that, when applied using bzr
5060
merge, has the same effect as merging from the source branch.
5062
By default the merge directive is self-contained and can be applied to any
5063
branch containing submit_branch in its ancestory without needing access to
5066
If --no-bundle is specified, then Bazaar doesn't send the contents of the
5067
revisions, but only a structured request to merge from the
5068
public_location. In that case the public_branch is needed and it must be
5069
up-to-date and accessible to the recipient. The public_branch is always
5070
included if known, so that people can check it later.
5072
The submit branch defaults to the parent of the source branch, but can be
5073
overridden. Both submit branch and public branch will be remembered in
5074
branch.conf the first time they are used for a particular branch. The
5075
source branch defaults to that containing the working directory, but can
5076
be changed using --from.
5078
In order to calculate those changes, bzr must analyse the submit branch.
5079
Therefore it is most efficient for the submit branch to be a local mirror.
5080
If a public location is known for the submit_branch, that location is used
5081
in the merge directive.
5083
The default behaviour is to send the merge directive by mail, unless -o is
5084
given, in which case it is sent to a file.
4778
If --no-bundle is specified, then public_branch is needed (and must be
4779
up-to-date), so that the receiver can perform the merge using the
4780
public_branch. The public_branch is always included if known, so that
4781
people can check it later.
4783
The submit branch defaults to the parent, but can be overridden. Both
4784
submit branch and public branch will be remembered if supplied.
4786
If a public_branch is known for the submit_branch, that public submit
4787
branch is used in the merge instructions. This means that a local mirror
4788
can be used as your actual submit branch, once you have set public_branch
5086
4791
Mail is sent using your preferred mail program. This should be transparent
5087
4792
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5135
4835
help='Write merge directive to this file; '
5136
4836
'use - for stdout.',
5139
help='Refuse to send if there are uncommitted changes in'
5140
' the working tree, --no-strict disables the check.'),
5141
4838
Option('mail-to', help='Mail the request to this address.',
5145
4842
Option('body', help='Body for the email.', type=unicode),
5146
RegistryOption('format',
5147
help='Use the specified output format.',
5148
lazy_registry=('bzrlib.send', 'format_registry')),
4843
RegistryOption.from_kwargs('format',
4844
'Use the specified output format.',
4845
**{'4': 'Bundle format 4, Merge Directive 2 (default)',
4846
'0.9': 'Bundle format 0.9, Merge Directive 1',})
5151
4849
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5152
4850
no_patch=False, revision=None, remember=False, output=None,
5153
format=None, mail_to=None, message=None, body=None,
5154
strict=None, **kwargs):
5155
from bzrlib.send import send
5156
return send(submit_branch, revision, public_branch, remember,
5157
format, no_bundle, no_patch, output,
5158
kwargs.get('from', '.'), mail_to, message, body,
4851
format='4', mail_to=None, message=None, body=None, **kwargs):
4852
return self._run(submit_branch, revision, public_branch, remember,
4853
format, no_bundle, no_patch, output,
4854
kwargs.get('from', '.'), mail_to, message, body)
4856
def _run(self, submit_branch, revision, public_branch, remember, format,
4857
no_bundle, no_patch, output, from_, mail_to, message, body):
4858
from bzrlib.revision import NULL_REVISION
4859
branch = Branch.open_containing(from_)[0]
4861
outfile = cStringIO.StringIO()
4865
outfile = open(output, 'wb')
4866
# we may need to write data into branch's repository to calculate
4871
config = branch.get_config()
4873
mail_to = config.get_user_option('submit_to')
4874
mail_client = config.get_mail_client()
4875
if (not getattr(mail_client, 'supports_body', False)
4876
and body is not None):
4877
raise errors.BzrCommandError(
4878
'Mail client "%s" does not support specifying body' %
4879
mail_client.__class__.__name__)
4880
if remember and submit_branch is None:
4881
raise errors.BzrCommandError(
4882
'--remember requires a branch to be specified.')
4883
stored_submit_branch = branch.get_submit_branch()
4884
remembered_submit_branch = None
4885
if submit_branch is None:
4886
submit_branch = stored_submit_branch
4887
remembered_submit_branch = "submit"
4889
if stored_submit_branch is None or remember:
4890
branch.set_submit_branch(submit_branch)
4891
if submit_branch is None:
4892
submit_branch = branch.get_parent()
4893
remembered_submit_branch = "parent"
4894
if submit_branch is None:
4895
raise errors.BzrCommandError('No submit branch known or'
4897
if remembered_submit_branch is not None:
4898
note('Using saved %s location "%s" to determine what '
4899
'changes to submit.', remembered_submit_branch,
4903
submit_config = Branch.open(submit_branch).get_config()
4904
mail_to = submit_config.get_user_option("child_submit_to")
4906
stored_public_branch = branch.get_public_branch()
4907
if public_branch is None:
4908
public_branch = stored_public_branch
4909
elif stored_public_branch is None or remember:
4910
branch.set_public_branch(public_branch)
4911
if no_bundle and public_branch is None:
4912
raise errors.BzrCommandError('No public branch specified or'
4914
base_revision_id = None
4916
if revision is not None:
4917
if len(revision) > 2:
4918
raise errors.BzrCommandError('bzr send takes '
4919
'at most two one revision identifiers')
4920
revision_id = revision[-1].as_revision_id(branch)
4921
if len(revision) == 2:
4922
base_revision_id = revision[0].as_revision_id(branch)
4923
if revision_id is None:
4924
revision_id = branch.last_revision()
4925
if revision_id == NULL_REVISION:
4926
raise errors.BzrCommandError('No revisions to submit.')
4928
directive = merge_directive.MergeDirective2.from_objects(
4929
branch.repository, revision_id, time.time(),
4930
osutils.local_time_offset(), submit_branch,
4931
public_branch=public_branch, include_patch=not no_patch,
4932
include_bundle=not no_bundle, message=message,
4933
base_revision_id=base_revision_id)
4934
elif format == '0.9':
4937
patch_type = 'bundle'
4939
raise errors.BzrCommandError('Format 0.9 does not'
4940
' permit bundle with no patch')
4946
directive = merge_directive.MergeDirective.from_objects(
4947
branch.repository, revision_id, time.time(),
4948
osutils.local_time_offset(), submit_branch,
4949
public_branch=public_branch, patch_type=patch_type,
4952
outfile.writelines(directive.to_lines())
4954
subject = '[MERGE] '
4955
if message is not None:
4958
revision = branch.repository.get_revision(revision_id)
4959
subject += revision.get_summary()
4960
basename = directive.get_disk_name(branch)
4961
mail_client.compose_merge_request(mail_to, subject,
5163
4970
class cmd_bundle_revisions(cmd_send):
5164
4972
"""Create a merge-directive for submitting changes.
5166
4974
A merge directive provides many things needed for requesting merges:
5224
5030
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5225
5031
no_patch=False, revision=None, remember=False, output=None,
5226
format=None, strict=None, **kwargs):
5032
format='4', **kwargs):
5227
5033
if output is None:
5229
from bzrlib.send import send
5230
return send(submit_branch, revision, public_branch, remember,
5035
return self._run(submit_branch, revision, public_branch, remember,
5231
5036
format, no_bundle, no_patch, output,
5232
kwargs.get('from', '.'), None, None, None,
5233
self.outf, strict=strict)
5037
kwargs.get('from', '.'), None, None, None)
5236
5040
class cmd_tag(Command):
5276
5080
branch, relpath = Branch.open_containing(directory)
5277
5081
branch.lock_write()
5278
self.add_cleanup(branch.unlock)
5280
branch.tags.delete_tag(tag_name)
5281
self.outf.write('Deleted tag %s.\n' % tag_name)
5284
if len(revision) != 1:
5285
raise errors.BzrCommandError(
5286
"Tags can only be placed on a single revision, "
5288
revision_id = revision[0].as_revision_id(branch)
5084
branch.tags.delete_tag(tag_name)
5085
self.outf.write('Deleted tag %s.\n' % tag_name)
5290
revision_id = branch.last_revision()
5291
if (not force) and branch.tags.has_tag(tag_name):
5292
raise errors.TagAlreadyExists(tag_name)
5293
branch.tags.set_tag(tag_name, revision_id)
5294
self.outf.write('Created tag %s.\n' % tag_name)
5088
if len(revision) != 1:
5089
raise errors.BzrCommandError(
5090
"Tags can only be placed on a single revision, "
5092
revision_id = revision[0].as_revision_id(branch)
5094
revision_id = branch.last_revision()
5095
if (not force) and branch.tags.has_tag(tag_name):
5096
raise errors.TagAlreadyExists(tag_name)
5097
branch.tags.set_tag(tag_name, revision_id)
5098
self.outf.write('Created tag %s.\n' % tag_name)
5297
5103
class cmd_tags(Command):
5406
5206
Option('bind-to', help='Branch to bind checkout to.', type=str),
5407
5207
Option('force',
5408
help='Perform reconfiguration even if local changes'
5410
Option('stacked-on',
5411
help='Reconfigure a branch to be stacked on another branch.',
5415
help='Reconfigure a branch to be unstacked. This '
5416
'may require copying substantial data into it.',
5208
help='Perform reconfiguration even if local changes'
5420
def run(self, location=None, target_type=None, bind_to=None, force=False,
5212
def run(self, location=None, target_type=None, bind_to=None, force=False):
5423
5213
directory = bzrdir.BzrDir.open(location)
5424
if stacked_on and unstacked:
5425
raise BzrCommandError("Can't use both --stacked-on and --unstacked")
5426
elif stacked_on is not None:
5427
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5429
reconfigure.ReconfigureUnstacked().apply(directory)
5430
# At the moment you can use --stacked-on and a different
5431
# reconfiguration shape at the same time; there seems no good reason
5433
5214
if target_type is None:
5434
if stacked_on or unstacked:
5437
raise errors.BzrCommandError('No target configuration '
5215
raise errors.BzrCommandError('No target configuration specified')
5439
5216
elif target_type == 'branch':
5440
5217
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5441
5218
elif target_type == 'tree':
5478
5255
/path/to/newbranch.
5480
5257
Bound branches use the nickname of its master branch unless it is set
5481
locally, in which case switching will update the local nickname to be
5258
locally, in which case switching will update the the local nickname to be
5482
5259
that of the master.
5485
takes_args = ['to_location?']
5262
takes_args = ['to_location']
5486
5263
takes_options = [Option('force',
5487
help='Switch even if local commits will be lost.'),
5489
Option('create-branch', short_name='b',
5490
help='Create the target branch from this one before'
5491
' switching to it.'),
5264
help='Switch even if local commits will be lost.')
5494
def run(self, to_location=None, force=False, create_branch=False,
5267
def run(self, to_location, force=False):
5496
5268
from bzrlib import switch
5497
5269
tree_location = '.'
5498
revision = _get_one_revision('switch', revision)
5499
5270
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5500
if to_location is None:
5501
if revision is None:
5502
raise errors.BzrCommandError('You must supply either a'
5503
' revision or a location')
5271
branch = control_dir.open_branch()
5506
branch = control_dir.open_branch()
5507
had_explicit_nick = branch.get_config().has_explicit_nickname()
5273
to_branch = Branch.open(to_location)
5508
5274
except errors.NotBranchError:
5510
had_explicit_nick = False
5513
raise errors.BzrCommandError('cannot create branch without'
5515
to_location = directory_service.directories.dereference(
5517
if '/' not in to_location and '\\' not in to_location:
5518
# This path is meant to be relative to the existing branch
5519
this_url = self._get_branch_location(control_dir)
5520
to_location = urlutils.join(this_url, '..', to_location)
5521
to_branch = branch.bzrdir.sprout(to_location,
5522
possible_transports=[branch.bzrdir.root_transport],
5523
source_branch=branch).open_branch()
5526
to_branch = Branch.open(to_location)
5527
except errors.NotBranchError:
5528
this_url = self._get_branch_location(control_dir)
5529
to_branch = Branch.open(
5530
urlutils.join(this_url, '..', to_location))
5531
if revision is not None:
5532
revision = revision.as_revision_id(to_branch)
5533
switch.switch(control_dir, to_branch, force, revision_id=revision)
5534
if had_explicit_nick:
5275
this_branch = control_dir.open_branch()
5276
# This may be a heavy checkout, where we want the master branch
5277
this_url = this_branch.get_bound_location()
5278
# If not, use a local sibling
5279
if this_url is None:
5280
this_url = this_branch.base
5281
to_branch = Branch.open(
5282
urlutils.join(this_url, '..', to_location))
5283
switch.switch(control_dir, to_branch, force)
5284
if branch.get_config().has_explicit_nickname():
5535
5285
branch = control_dir.open_branch() #get the new branch!
5536
5286
branch.nick = to_branch.nick
5537
5287
note('Switched to branch: %s',
5538
5288
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5540
def _get_branch_location(self, control_dir):
5541
"""Return location of branch for this control dir."""
5543
this_branch = control_dir.open_branch()
5544
# This may be a heavy checkout, where we want the master branch
5545
master_location = this_branch.get_bound_location()
5546
if master_location is not None:
5547
return master_location
5548
# If not, use a local sibling
5549
return this_branch.base
5550
except errors.NotBranchError:
5551
format = control_dir.find_branch_format()
5552
if getattr(format, 'get_reference', None) is not None:
5553
return format.get_reference(control_dir)
5555
return control_dir.root_transport.base
5558
5291
class cmd_view(Command):
5559
5292
"""Manage filtered views.
5778
5511
if writer is None:
5779
5512
writer = bzrlib.option.diff_writer_registry.get()
5781
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5782
file_list, message, destroy=destroy)
5514
Shelver.from_args(writer(sys.stdout), revision, all, file_list,
5515
message, destroy=destroy).run()
5787
5516
except errors.UserAbort:
5790
5519
def run_for_list(self):
5791
5520
tree = WorkingTree.open_containing('.')[0]
5792
5521
tree.lock_read()
5793
self.add_cleanup(tree.unlock)
5794
manager = tree.get_shelf_manager()
5795
shelves = manager.active_shelves()
5796
if len(shelves) == 0:
5797
note('No shelved changes.')
5799
for shelf_id in reversed(shelves):
5800
message = manager.get_metadata(shelf_id).get('message')
5802
message = '<no message>'
5803
self.outf.write('%3d: %s\n' % (shelf_id, message))
5523
manager = tree.get_shelf_manager()
5524
shelves = manager.active_shelves()
5525
if len(shelves) == 0:
5526
note('No shelved changes.')
5528
for shelf_id in reversed(shelves):
5529
message = manager.get_metadata(shelf_id).get('message')
5531
message = '<no message>'
5532
self.outf.write('%3d: %s\n' % (shelf_id, message))
5807
5538
class cmd_unshelve(Command):
5870
5594
dry_run=dry_run, no_prompt=force)
5873
class cmd_reference(Command):
5874
"""list, view and set branch locations for nested trees.
5876
If no arguments are provided, lists the branch locations for nested trees.
5877
If one argument is provided, display the branch location for that tree.
5878
If two arguments are provided, set the branch location for that tree.
5883
takes_args = ['path?', 'location?']
5885
def run(self, path=None, location=None):
5887
if path is not None:
5889
tree, branch, relpath =(
5890
bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
5891
if path is not None:
5894
tree = branch.basis_tree()
5896
info = branch._get_all_reference_info().iteritems()
5897
self._display_reference_info(tree, branch, info)
5597
def _create_prefix(cur_transport):
5598
needed = [cur_transport]
5599
# Recurse upwards until we can create a directory successfully
5601
new_transport = cur_transport.clone('..')
5602
if new_transport.base == cur_transport.base:
5603
raise errors.BzrCommandError(
5604
"Failed to create path prefix for %s."
5605
% cur_transport.base)
5607
new_transport.mkdir('.')
5608
except errors.NoSuchFile:
5609
needed.append(new_transport)
5610
cur_transport = new_transport
5899
file_id = tree.path2id(path)
5901
raise errors.NotVersionedError(path)
5902
if location is None:
5903
info = [(file_id, branch.get_reference_info(file_id))]
5904
self._display_reference_info(tree, branch, info)
5906
branch.set_reference_info(file_id, path, location)
5908
def _display_reference_info(self, tree, branch, info):
5910
for file_id, (path, location) in info:
5912
path = tree.id2path(file_id)
5913
except errors.NoSuchId:
5915
ref_list.append((path, location))
5916
for path, location in sorted(ref_list):
5917
self.outf.write('%s %s\n' % (path, location))
5613
# Now we only need to create child directories
5615
cur_transport = needed.pop()
5616
cur_transport.ensure_base()
5920
5619
# these get imported and then picked up by the scan for cmd_*