320
337
def run(self, revision_id=None, revision=None, directory=u'.'):
321
338
if revision_id is not None and revision is not None:
322
raise errors.BzrCommandError('You can only supply one of'
323
' revision_id or --revision')
339
raise errors.BzrCommandError(gettext('You can only supply one of'
340
' revision_id or --revision'))
324
341
if revision_id is None and revision is None:
325
raise errors.BzrCommandError('You must supply either'
326
' --revision or a revision_id')
327
b = WorkingTree.open_containing(directory)[0].branch
342
raise errors.BzrCommandError(gettext('You must supply either'
343
' --revision or a revision_id'))
345
b = controldir.ControlDir.open_containing_tree_or_branch(directory)[1]
329
347
revisions = b.repository.revisions
330
348
if revisions is None:
331
raise errors.BzrCommandError('Repository %r does not support '
332
'access to raw revision texts')
349
raise errors.BzrCommandError(gettext('Repository %r does not support '
350
'access to raw revision texts'))
334
352
b.repository.lock_read()
471
492
raise errors.ShelvedChanges(working)
473
494
if working.user_url != working.branch.user_url:
474
raise errors.BzrCommandError("You cannot remove the working tree"
475
" from a lightweight checkout")
495
raise errors.BzrCommandError(gettext("You cannot remove the working tree"
496
" from a lightweight checkout"))
477
498
d.destroy_workingtree()
501
class cmd_repair_workingtree(Command):
502
__doc__ = """Reset the working tree state file.
504
This is not meant to be used normally, but more as a way to recover from
505
filesystem corruption, etc. This rebuilds the working inventory back to a
506
'known good' state. Any new modifications (adding a file, renaming, etc)
507
will be lost, though modified files will still be detected as such.
509
Most users will want something more like "bzr revert" or "bzr update"
510
unless the state file has become corrupted.
512
By default this attempts to recover the current state by looking at the
513
headers of the state file. If the state file is too corrupted to even do
514
that, you can supply --revision to force the state of the tree.
517
takes_options = ['revision', 'directory',
519
help='Reset the tree even if it doesn\'t appear to be'
524
def run(self, revision=None, directory='.', force=False):
525
tree, _ = WorkingTree.open_containing(directory)
526
self.add_cleanup(tree.lock_tree_write().unlock)
530
except errors.BzrError:
531
pass # There seems to be a real error here, so we'll reset
534
raise errors.BzrCommandError(gettext(
535
'The tree does not appear to be corrupt. You probably'
536
' want "bzr revert" instead. Use "--force" if you are'
537
' sure you want to reset the working tree.'))
541
revision_ids = [r.as_revision_id(tree.branch) for r in revision]
543
tree.reset_state(revision_ids)
544
except errors.BzrError, e:
545
if revision_ids is None:
546
extra = (gettext(', the header appears corrupt, try passing -r -1'
547
' to set the state to the last commit'))
550
raise errors.BzrCommandError(gettext('failed to reset the tree state{0}').format(extra))
480
553
class cmd_revno(Command):
481
554
__doc__ = """Show current revision number.
486
559
_see_also = ['info']
487
560
takes_args = ['location?']
488
561
takes_options = [
489
Option('tree', help='Show revno of working tree'),
562
Option('tree', help='Show revno of working tree.'),
493
def run(self, tree=False, location=u'.'):
567
def run(self, tree=False, location=u'.', revision=None):
568
if revision is not None and tree:
569
raise errors.BzrCommandError(gettext("--tree and --revision can "
570
"not be used together"))
496
574
wt = WorkingTree.open_containing(location)[0]
497
575
self.add_cleanup(wt.lock_read().unlock)
498
576
except (errors.NoWorkingTree, errors.NotLocalUrl):
499
577
raise errors.NoWorkingTree(location)
500
579
revid = wt.last_revision()
502
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
503
except errors.NoSuchRevision:
505
revno = ".".join(str(n) for n in revno_t)
507
581
b = Branch.open_containing(location)[0]
508
582
self.add_cleanup(b.lock_read().unlock)
584
if len(revision) != 1:
585
raise errors.BzrCommandError(gettext(
586
"Tags can only be placed on a single revision, "
588
revid = revision[0].as_revision_id(b)
590
revid = b.last_revision()
592
revno_t = b.revision_id_to_dotted_revno(revid)
593
except errors.NoSuchRevision:
595
revno = ".".join(str(n) for n in revno_t)
510
596
self.cleanup_now()
511
self.outf.write(str(revno) + '\n')
597
self.outf.write(revno + '\n')
514
600
class cmd_revision_info(Command):
662
756
takes_args = ['dir+']
760
help='No error if existing, make parent directories as needed.',
663
764
encoding_type = 'replace'
665
def run(self, dir_list):
667
wt, dd = WorkingTree.open_containing(d)
668
base = os.path.dirname(dd)
669
id = wt.path2id(base)
673
self.outf.write('added %s\n' % d)
767
def add_file_with_parents(cls, wt, relpath):
768
if wt.path2id(relpath) is not None:
770
cls.add_file_with_parents(wt, osutils.dirname(relpath))
774
def add_file_single(cls, wt, relpath):
777
def run(self, dir_list, parents=False):
779
add_file = self.add_file_with_parents
781
add_file = self.add_file_single
783
wt, relpath = WorkingTree.open_containing(dir)
788
if e.errno != errno.EEXIST:
675
raise errors.NotVersionedError(path=base)
792
add_file(wt, relpath)
794
self.outf.write(gettext('added %s\n') % dir)
678
797
class cmd_relpath(Command):
784
904
return self.run_auto(names_list, after, dry_run)
786
raise errors.BzrCommandError('--dry-run requires --auto.')
906
raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
787
907
if names_list is None:
789
909
if len(names_list) < 2:
790
raise errors.BzrCommandError("missing file argument")
910
raise errors.BzrCommandError(gettext("missing file argument"))
791
911
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
912
for file_name in rel_names[0:-1]:
914
raise errors.BzrCommandError(gettext("can not move root of branch"))
792
915
self.add_cleanup(tree.lock_tree_write().unlock)
793
916
self._run(tree, names_list, rel_names, after)
795
918
def run_auto(self, names_list, after, dry_run):
796
919
if names_list is not None and len(names_list) > 1:
797
raise errors.BzrCommandError('Only one path may be specified to'
920
raise errors.BzrCommandError(gettext('Only one path may be specified to'
800
raise errors.BzrCommandError('--after cannot be specified with'
923
raise errors.BzrCommandError(gettext('--after cannot be specified with'
802
925
work_tree, file_list = WorkingTree.open_containing_paths(
803
926
names_list, default_directory='.')
804
927
self.add_cleanup(work_tree.lock_tree_write().unlock)
901
1024
match the remote one, use pull --overwrite. This will work even if the two
902
1025
branches have diverged.
904
If there is no default location set, the first pull will set it. After
905
that, you can omit the location to use the default. To change the
906
default, use --remember. The value will only be saved if the remote
907
location can be accessed.
1027
If there is no default location set, the first pull will set it (use
1028
--no-remember to avoid setting it). After that, you can omit the
1029
location to use the default. To change the default, use --remember. The
1030
value will only be saved if the remote location can be accessed.
1032
The --verbose option will display the revisions pulled using the log_format
1033
configuration option. You can use a different format by overriding it with
1034
-Olog_format=<other_format>.
909
1036
Note: The location can be specified either in the form of a branch,
910
1037
or in the form of a path to a file containing a merge directive generated
1026
1164
do a merge (see bzr help merge) from the other branch, and commit that.
1027
1165
After that you will be able to do a push without '--overwrite'.
1029
If there is no default push location set, the first push will set it.
1030
After that, you can omit the location to use the default. To change the
1031
default, use --remember. The value will only be saved if the remote
1032
location can be accessed.
1167
If there is no default push location set, the first push will set it (use
1168
--no-remember to avoid setting it). After that, you can omit the
1169
location to use the default. To change the default, use --remember. The
1170
value will only be saved if the remote location can be accessed.
1172
The --verbose option will display the revisions pushed using the log_format
1173
configuration option. You can use a different format by overriding it with
1174
-Olog_format=<other_format>.
1035
1177
_see_also = ['pull', 'update', 'working-trees']
1056
1198
Option('strict',
1057
1199
help='Refuse to push if there are uncommitted changes in'
1058
1200
' the working tree, --no-strict disables the check.'),
1202
help="Don't populate the working tree, even for protocols"
1203
" that support it."),
1060
1205
takes_args = ['location?']
1061
1206
encoding_type = 'replace'
1063
def run(self, location=None, remember=False, overwrite=False,
1208
def run(self, location=None, remember=None, overwrite=False,
1064
1209
create_prefix=False, verbose=False, revision=None,
1065
1210
use_existing_dir=False, directory=None, stacked_on=None,
1066
stacked=False, strict=None):
1211
stacked=False, strict=None, no_tree=False):
1067
1212
from bzrlib.push import _show_push_branch
1069
1214
if directory is None:
1070
1215
directory = '.'
1071
1216
# Get the source branch
1072
1217
(tree, br_from,
1073
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1218
_unused) = controldir.ControlDir.open_containing_tree_or_branch(directory)
1074
1219
# Get the tip's revision_id
1075
1220
revision = _get_one_revision('push', revision)
1076
1221
if revision is not None:
1097
1242
# error by the feedback given to them. RBC 20080227.
1098
1243
stacked_on = parent_url
1099
1244
if not stacked_on:
1100
raise errors.BzrCommandError(
1101
"Could not determine branch to refer to.")
1245
raise errors.BzrCommandError(gettext(
1246
"Could not determine branch to refer to."))
1103
1248
# Get the destination location
1104
1249
if location is None:
1105
1250
stored_loc = br_from.get_push_location()
1106
1251
if stored_loc is None:
1107
raise errors.BzrCommandError(
1108
"No push location known or specified.")
1252
raise errors.BzrCommandError(gettext(
1253
"No push location known or specified."))
1110
1255
display_url = urlutils.unescape_for_display(stored_loc,
1111
1256
self.outf.encoding)
1112
self.outf.write("Using saved push location: %s\n" % display_url)
1257
note(gettext("Using saved push location: %s") % display_url)
1113
1258
location = stored_loc
1115
1260
_show_push_branch(br_from, revision_id, location, self.outf,
1116
1261
verbose=verbose, overwrite=overwrite, remember=remember,
1117
1262
stacked_on=stacked_on, create_prefix=create_prefix,
1118
use_existing_dir=use_existing_dir)
1263
use_existing_dir=use_existing_dir, no_tree=no_tree)
1121
1266
class cmd_branch(Command):
1185
1338
revision_id = br_from.last_revision()
1186
1339
if to_location is None:
1187
to_location = urlutils.derive_to_location(from_location)
1340
to_location = getattr(br_from, "name", None)
1341
if to_location is None:
1342
to_location = urlutils.derive_to_location(from_location)
1188
1343
to_transport = transport.get_transport(to_location)
1190
1345
to_transport.mkdir('.')
1191
1346
except errors.FileExists:
1192
if not use_existing_dir:
1193
raise errors.BzrCommandError('Target directory "%s" '
1194
'already exists.' % to_location)
1348
to_dir = controldir.ControlDir.open_from_transport(
1350
except errors.NotBranchError:
1351
if not use_existing_dir:
1352
raise errors.BzrCommandError(gettext('Target directory "%s" '
1353
'already exists.') % to_location)
1197
bzrdir.BzrDir.open_from_transport(to_transport)
1358
to_dir.open_branch()
1198
1359
except errors.NotBranchError:
1201
1362
raise errors.AlreadyBranchError(to_location)
1202
1363
except errors.NoSuchFile:
1203
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1364
raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
1206
# preserve whatever source format we have.
1207
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1208
possible_transports=[to_transport],
1209
accelerator_tree=accelerator_tree,
1210
hardlink=hardlink, stacked=stacked,
1211
force_new_repo=standalone,
1212
create_tree_if_local=not no_tree,
1213
source_branch=br_from)
1214
branch = dir.open_branch()
1215
except errors.NoSuchRevision:
1216
to_transport.delete_tree('.')
1217
msg = "The branch %s has no revision %s." % (from_location,
1219
raise errors.BzrCommandError(msg)
1370
# preserve whatever source format we have.
1371
to_dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1372
possible_transports=[to_transport],
1373
accelerator_tree=accelerator_tree,
1374
hardlink=hardlink, stacked=stacked,
1375
force_new_repo=standalone,
1376
create_tree_if_local=not no_tree,
1377
source_branch=br_from)
1378
branch = to_dir.open_branch(
1379
possible_transports=[
1380
br_from.bzrdir.root_transport, to_transport])
1381
except errors.NoSuchRevision:
1382
to_transport.delete_tree('.')
1383
msg = gettext("The branch {0} has no revision {1}.").format(
1384
from_location, revision)
1385
raise errors.BzrCommandError(msg)
1387
branch = br_from.sprout(to_dir, revision_id=revision_id)
1220
1388
_merge_tags_if_possible(br_from, branch)
1221
1389
# If the source branch is stacked, the new branch may
1222
1390
# be stacked whether we asked for that explicitly or not.
1223
1391
# We therefore need a try/except here and not just 'if stacked:'
1225
note('Created new stacked branch referring to %s.' %
1393
note(gettext('Created new stacked branch referring to %s.') %
1226
1394
branch.get_stacked_on_url())
1227
1395
except (errors.NotStacked, errors.UnstackableBranchFormat,
1228
1396
errors.UnstackableRepositoryFormat), e:
1229
note('Branched %d revision(s).' % branch.revno())
1397
note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
1231
1399
# Bind to the parent
1232
1400
parent_branch = Branch.open(from_location)
1233
1401
branch.bind(parent_branch)
1234
note('New branch bound to %s' % from_location)
1402
note(gettext('New branch bound to %s') % from_location)
1236
1404
# Switch to the new branch
1237
1405
wt, _ = WorkingTree.open_containing('.')
1238
1406
_mod_switch.switch(wt.bzrdir, branch)
1239
note('Switched to branch: %s',
1407
note(gettext('Switched to branch: %s'),
1240
1408
urlutils.unescape_for_display(branch.base, 'utf-8'))
1411
class cmd_branches(Command):
1412
__doc__ = """List the branches available at the current location.
1414
This command will print the names of all the branches at the current
1418
takes_args = ['location?']
1420
Option('recursive', short_name='R',
1421
help='Recursively scan for branches rather than '
1422
'just looking in the specified location.')]
1424
def run(self, location=".", recursive=False):
1426
t = transport.get_transport(location)
1427
if not t.listable():
1428
raise errors.BzrCommandError(
1429
"Can't scan this type of location.")
1430
for b in controldir.ControlDir.find_branches(t):
1431
self.outf.write("%s\n" % urlutils.unescape_for_display(
1432
urlutils.relative_url(t.base, b.base),
1433
self.outf.encoding).rstrip("/"))
1435
dir = controldir.ControlDir.open_containing(location)[0]
1436
for branch in dir.list_branches():
1437
if branch.name is None:
1438
self.outf.write(gettext(" (default)\n"))
1440
self.outf.write(" %s\n" % branch.name.encode(
1441
self.outf.encoding))
1243
1444
class cmd_checkout(Command):
1244
1445
__doc__ = """Create a new checkout of an existing branch.
1347
1548
class cmd_update(Command):
1348
__doc__ = """Update a tree to have the latest code committed to its branch.
1350
This will perform a merge into the working tree, and may generate
1351
conflicts. If you have any local changes, you will still
1352
need to commit them after the update for the update to be complete.
1354
If you want to discard your local changes, you can just do a
1355
'bzr revert' instead of 'bzr commit' after the update.
1357
If you want to restore a file that has been removed locally, use
1358
'bzr revert' instead of 'bzr update'.
1360
If the tree's branch is bound to a master branch, it will also update
1549
__doc__ = """Update a working tree to a new revision.
1551
This will perform a merge of the destination revision (the tip of the
1552
branch, or the specified revision) into the working tree, and then make
1553
that revision the basis revision for the working tree.
1555
You can use this to visit an older revision, or to update a working tree
1556
that is out of date from its branch.
1558
If there are any uncommitted changes in the tree, they will be carried
1559
across and remain as uncommitted changes after the update. To discard
1560
these changes, use 'bzr revert'. The uncommitted changes may conflict
1561
with the changes brought in by the change in basis revision.
1563
If the tree's branch is bound to a master branch, bzr will also update
1361
1564
the branch from the master.
1566
You cannot update just a single file or directory, because each Bazaar
1567
working tree has just a single basis revision. If you want to restore a
1568
file that has been removed locally, use 'bzr revert' instead of 'bzr
1569
update'. If you want to restore a file to its state in a previous
1570
revision, use 'bzr revert' with a '-r' option, or use 'bzr cat' to write
1571
out the old content of that file to a new location.
1573
The 'dir' argument, if given, must be the location of the root of a
1574
working tree to update. By default, the working tree that contains the
1575
current working directory is used.
1364
1578
_see_also = ['pull', 'working-trees', 'status-flags']
1365
1579
takes_args = ['dir?']
1366
takes_options = ['revision']
1580
takes_options = ['revision',
1582
help="Show base revision text in conflicts."),
1367
1584
aliases = ['up']
1369
def run(self, dir='.', revision=None):
1586
def run(self, dir=None, revision=None, show_base=None):
1370
1587
if revision is not None and len(revision) != 1:
1371
raise errors.BzrCommandError(
1372
"bzr update --revision takes exactly one revision")
1373
tree = WorkingTree.open_containing(dir)[0]
1588
raise errors.BzrCommandError(gettext(
1589
"bzr update --revision takes exactly one revision"))
1591
tree = WorkingTree.open_containing('.')[0]
1593
tree, relpath = WorkingTree.open_containing(dir)
1596
raise errors.BzrCommandError(gettext(
1597
"bzr update can only update a whole tree, "
1598
"not a file or subdirectory"))
1374
1599
branch = tree.branch
1375
1600
possible_transports = []
1376
1601
master = branch.get_master_branch(
1412
1637
change_reporter,
1413
1638
possible_transports=possible_transports,
1414
1639
revision=revision_id,
1641
show_base=show_base)
1416
1642
except errors.NoSuchRevision, e:
1417
raise errors.BzrCommandError(
1643
raise errors.BzrCommandError(gettext(
1418
1644
"branch has no revision %s\n"
1419
1645
"bzr update --revision only works"
1420
" for a revision in the branch history"
1646
" for a revision in the branch history")
1421
1647
% (e.revision))
1422
1648
revno = tree.branch.revision_id_to_dotted_revno(
1423
1649
_mod_revision.ensure_null(tree.last_revision()))
1424
note('Updated to revision %s of branch %s' %
1425
('.'.join(map(str, revno)), branch_location))
1650
note(gettext('Updated to revision {0} of branch {1}').format(
1651
'.'.join(map(str, revno)), branch_location))
1426
1652
parent_ids = tree.get_parent_ids()
1427
1653
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1428
note('Your local commits will now show as pending merges with '
1429
"'bzr status', and can be committed with 'bzr commit'.")
1654
note(gettext('Your local commits will now show as pending merges with '
1655
"'bzr status', and can be committed with 'bzr commit'."))
1430
1656
if conflicts != 0:
1494
1720
title='Deletion Strategy', value_switches=True, enum_switch=False,
1495
1721
safe='Backup changed files (default).',
1496
1722
keep='Delete from bzr but leave the working copy.',
1723
no_backup='Don\'t backup changed files.',
1497
1724
force='Delete all the specified files, even if they can not be '
1498
'recovered and even if they are non-empty directories.')]
1725
'recovered and even if they are non-empty directories. '
1726
'(deprecated, use no-backup)')]
1499
1727
aliases = ['rm', 'del']
1500
1728
encoding_type = 'replace'
1502
1730
def run(self, file_list, verbose=False, new=False,
1503
1731
file_deletion_strategy='safe'):
1732
if file_deletion_strategy == 'force':
1733
note(gettext("(The --force option is deprecated, rather use --no-backup "
1735
file_deletion_strategy = 'no-backup'
1504
1737
tree, file_list = WorkingTree.open_containing_paths(file_list)
1506
1739
if file_list is not None:
1682
1923
help='Specify a format for this branch. '
1683
1924
'See "help formats".',
1684
1925
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
1685
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1926
converter=lambda name: controldir.format_registry.make_bzrdir(name),
1686
1927
value_switches=True,
1687
1928
title="Branch format",
1689
1930
Option('append-revisions-only',
1690
1931
help='Never change revnos or the existing log.'
1691
' Append revisions to it only.')
1932
' Append revisions to it only.'),
1934
'Create a branch without a working tree.')
1693
1936
def run(self, location=None, format=None, append_revisions_only=False,
1694
create_prefix=False):
1937
create_prefix=False, no_tree=False):
1695
1938
if format is None:
1696
format = bzrdir.format_registry.make_bzrdir('default')
1939
format = controldir.format_registry.make_bzrdir('default')
1697
1940
if location is None:
1698
1941
location = u'.'
1708
1951
to_transport.ensure_base()
1709
1952
except errors.NoSuchFile:
1710
1953
if not create_prefix:
1711
raise errors.BzrCommandError("Parent directory of %s"
1954
raise errors.BzrCommandError(gettext("Parent directory of %s"
1712
1955
" does not exist."
1713
1956
"\nYou may supply --create-prefix to create all"
1714
" leading parent directories."
1957
" leading parent directories.")
1716
1959
to_transport.create_prefix()
1719
a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
1962
a_bzrdir = controldir.ControlDir.open_from_transport(to_transport)
1720
1963
except errors.NotBranchError:
1721
1964
# really a NotBzrDir error...
1722
create_branch = bzrdir.BzrDir.create_branch_convenience
1965
create_branch = controldir.ControlDir.create_branch_convenience
1967
force_new_tree = False
1969
force_new_tree = None
1723
1970
branch = create_branch(to_transport.base, format=format,
1724
possible_transports=[to_transport])
1971
possible_transports=[to_transport],
1972
force_new_tree=force_new_tree)
1725
1973
a_bzrdir = branch.bzrdir
1727
1975
from bzrlib.transport.local import LocalTransport
2264
2533
Option('show-diff',
2265
2534
short_name='p',
2266
2535
help='Show changes made in each revision as a patch.'),
2267
Option('include-merges',
2536
Option('include-merged',
2268
2537
help='Show merged revisions like --levels 0 does.'),
2538
Option('include-merges', hidden=True,
2539
help='Historical alias for --include-merged.'),
2540
Option('omit-merges',
2541
help='Do not report commits with more than one parent.'),
2269
2542
Option('exclude-common-ancestry',
2270
2543
help='Display only the revisions that are not part'
2271
' of both ancestries (require -rX..Y)'
2544
' of both ancestries (require -rX..Y).'
2546
Option('signatures',
2547
help='Show digital signature validity.'),
2550
help='Show revisions whose properties match this '
2553
ListOption('match-message',
2554
help='Show revisions whose message matches this '
2557
ListOption('match-committer',
2558
help='Show revisions whose committer matches this '
2561
ListOption('match-author',
2562
help='Show revisions whose authors match this '
2565
ListOption('match-bugs',
2566
help='Show revisions whose bugs match this '
2274
2570
encoding_type = 'replace'
2295
2599
_get_info_for_log_files,
2297
2601
direction = (forward and 'forward') or 'reverse'
2602
if symbol_versioning.deprecated_passed(include_merges):
2603
ui.ui_factory.show_user_warning(
2604
'deprecated_command_option',
2605
deprecated_name='--include-merges',
2606
recommended_name='--include-merged',
2607
deprecated_in_version='2.5',
2608
command=self.invoked_as)
2609
if include_merged is None:
2610
include_merged = include_merges
2612
raise errors.BzrCommandError(gettext(
2613
'{0} and {1} are mutually exclusive').format(
2614
'--include-merges', '--include-merged'))
2615
if include_merged is None:
2616
include_merged = False
2298
2617
if (exclude_common_ancestry
2299
2618
and (revision is None or len(revision) != 2)):
2300
raise errors.BzrCommandError(
2301
'--exclude-common-ancestry requires -r with two revisions')
2619
raise errors.BzrCommandError(gettext(
2620
'--exclude-common-ancestry requires -r with two revisions'))
2303
2622
if levels is None:
2306
raise errors.BzrCommandError(
2307
'--levels and --include-merges are mutually exclusive')
2625
raise errors.BzrCommandError(gettext(
2626
'{0} and {1} are mutually exclusive').format(
2627
'--levels', '--include-merged'))
2309
2629
if change is not None:
2310
2630
if len(change) > 1:
2311
2631
raise errors.RangeInChangeOption()
2312
2632
if revision is not None:
2313
raise errors.BzrCommandError(
2314
'--revision and --change are mutually exclusive')
2633
raise errors.BzrCommandError(gettext(
2634
'{0} and {1} are mutually exclusive').format(
2635
'--revision', '--change'))
2316
2637
revision = change
2693
3043
self.outf.write("%s\n" % pattern)
2695
3045
if not name_pattern_list:
2696
raise errors.BzrCommandError("ignore requires at least one "
2697
"NAME_PATTERN or --default-rules.")
3046
raise errors.BzrCommandError(gettext("ignore requires at least one "
3047
"NAME_PATTERN or --default-rules."))
2698
3048
name_pattern_list = [globbing.normalize_pattern(p)
2699
3049
for p in name_pattern_list]
2700
3050
bad_patterns = ''
3051
bad_patterns_count = 0
2701
3052
for p in name_pattern_list:
2702
3053
if not globbing.Globster.is_pattern_valid(p):
3054
bad_patterns_count += 1
2703
3055
bad_patterns += ('\n %s' % p)
2704
3056
if bad_patterns:
2705
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
3057
msg = (ngettext('Invalid ignore pattern found. %s',
3058
'Invalid ignore patterns found. %s',
3059
bad_patterns_count) % bad_patterns)
2706
3060
ui.ui_factory.show_error(msg)
2707
3061
raise errors.InvalidPattern('')
2708
3062
for name_pattern in name_pattern_list:
2709
3063
if (name_pattern[0] == '/' or
2710
3064
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2711
raise errors.BzrCommandError(
2712
"NAME_PATTERN should not be an absolute path")
3065
raise errors.BzrCommandError(gettext(
3066
"NAME_PATTERN should not be an absolute path"))
2713
3067
tree, relpath = WorkingTree.open_containing(directory)
2714
3068
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2715
3069
ignored = globbing.Globster(name_pattern_list)
2818
3173
Option('per-file-timestamps',
2819
3174
help='Set modification time of files to that of the last '
2820
3175
'revision in which it was changed.'),
3176
Option('uncommitted',
3177
help='Export the working tree contents rather than that of the '
2822
3180
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2823
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3181
root=None, filters=False, per_file_timestamps=False, uncommitted=False,
2824
3183
from bzrlib.export import export
2826
3185
if branch_or_subdir is None:
2827
tree = WorkingTree.open_containing(directory)[0]
3186
branch_or_subdir = directory
3188
(tree, b, subdir) = controldir.ControlDir.open_containing_tree_or_branch(
3190
if tree is not None:
3191
self.add_cleanup(tree.lock_read().unlock)
3195
raise errors.BzrCommandError(
3196
gettext("--uncommitted requires a working tree"))
2831
b, subdir = Branch.open_containing(branch_or_subdir)
2834
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
3199
export_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2836
export(rev_tree, dest, format, root, subdir, filtered=filters,
3201
export(export_tree, dest, format, root, subdir, filtered=filters,
2837
3202
per_file_timestamps=per_file_timestamps)
2838
3203
except errors.NoSuchExportFormat, e:
2839
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3204
raise errors.BzrCommandError(
3205
gettext('Unsupported export format: %s') % e.format)
2842
3208
class cmd_cat(Command):
2880
3246
old_file_id = rev_tree.path2id(relpath)
3248
# TODO: Split out this code to something that generically finds the
3249
# best id for a path across one or more trees; it's like
3250
# find_ids_across_trees but restricted to find just one. -- mbp
2882
3252
if name_from_revision:
2883
3253
# Try in revision if requested
2884
3254
if old_file_id is None:
2885
raise errors.BzrCommandError(
2886
"%r is not present in revision %s" % (
3255
raise errors.BzrCommandError(gettext(
3256
"{0!r} is not present in revision {1}").format(
2887
3257
filename, rev_tree.get_revision_id()))
2889
content = rev_tree.get_file_text(old_file_id)
3259
actual_file_id = old_file_id
2891
3261
cur_file_id = tree.path2id(relpath)
2893
if cur_file_id is not None:
2894
# Then try with the actual file id
2896
content = rev_tree.get_file_text(cur_file_id)
2898
except errors.NoSuchId:
2899
# The actual file id didn't exist at that time
2901
if not found and old_file_id is not None:
2902
# Finally try with the old file id
2903
content = rev_tree.get_file_text(old_file_id)
2906
# Can't be found anywhere
2907
raise errors.BzrCommandError(
2908
"%r is not present in revision %s" % (
3262
if cur_file_id is not None and rev_tree.has_id(cur_file_id):
3263
actual_file_id = cur_file_id
3264
elif old_file_id is not None:
3265
actual_file_id = old_file_id
3267
raise errors.BzrCommandError(gettext(
3268
"{0!r} is not present in revision {1}").format(
2909
3269
filename, rev_tree.get_revision_id()))
2911
from bzrlib.filters import (
2912
ContentFilterContext,
2913
filtered_output_bytes,
2915
filters = rev_tree._content_filter_stack(relpath)
2916
chunks = content.splitlines(True)
2917
content = filtered_output_bytes(chunks, filters,
2918
ContentFilterContext(relpath, rev_tree))
2920
self.outf.writelines(content)
3271
from bzrlib.filter_tree import ContentFilterTree
3272
filter_tree = ContentFilterTree(rev_tree,
3273
rev_tree._content_filter_stack)
3274
content = filter_tree.get_file_text(actual_file_id)
2923
self.outf.write(content)
3276
content = rev_tree.get_file_text(actual_file_id)
3278
self.outf.write(content)
2926
3281
class cmd_local_time_offset(Command):
2987
3342
to trigger updates to external systems like bug trackers. The --fixes
2988
3343
option can be used to record the association between a revision and
2989
3344
one or more bugs. See ``bzr help bugs`` for details.
2991
A selective commit may fail in some cases where the committed
2992
tree would be invalid. Consider::
2997
bzr commit foo -m "committing foo"
2998
bzr mv foo/bar foo/baz
3001
bzr commit foo/bar -m "committing bar but not baz"
3003
In the example above, the last commit will fail by design. This gives
3004
the user the opportunity to decide whether they want to commit the
3005
rename at the same time, separately first, or not at all. (As a general
3006
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3008
# TODO: Run hooks on tree to-be-committed, and after commit.
3010
# TODO: Strict commit that fails if there are deleted files.
3011
# (what does "deleted files" mean ??)
3013
# TODO: Give better message for -s, --summary, used by tla people
3015
# XXX: verbose currently does nothing
3017
3347
_see_also = ['add', 'bugs', 'hooks', 'uncommit']
3018
3348
takes_args = ['selected*']
3050
3380
Option('show-diff', short_name='p',
3051
3381
help='When no message is supplied, show the diff along'
3052
3382
' with the status summary in the message editor.'),
3384
help='When committing to a foreign version control '
3385
'system do not push data that can not be natively '
3054
3388
aliases = ['ci', 'checkin']
3056
3390
def _iter_bug_fix_urls(self, fixes, branch):
3391
default_bugtracker = None
3057
3392
# Configure the properties for bug fixing attributes.
3058
3393
for fixed_bug in fixes:
3059
3394
tokens = fixed_bug.split(':')
3060
if len(tokens) != 2:
3061
raise errors.BzrCommandError(
3395
if len(tokens) == 1:
3396
if default_bugtracker is None:
3397
branch_config = branch.get_config()
3398
default_bugtracker = branch_config.get_user_option(
3400
if default_bugtracker is None:
3401
raise errors.BzrCommandError(gettext(
3402
"No tracker specified for bug %s. Use the form "
3403
"'tracker:id' or specify a default bug tracker "
3404
"using the `bugtracker` option.\nSee "
3405
"\"bzr help bugs\" for more information on this "
3406
"feature. Commit refused.") % fixed_bug)
3407
tag = default_bugtracker
3409
elif len(tokens) != 2:
3410
raise errors.BzrCommandError(gettext(
3062
3411
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3063
3412
"See \"bzr help bugs\" for more information on this "
3064
"feature.\nCommit refused." % fixed_bug)
3065
tag, bug_id = tokens
3413
"feature.\nCommit refused.") % fixed_bug)
3415
tag, bug_id = tokens
3067
3417
yield bugtracker.get_bug_url(tag, branch, bug_id)
3068
3418
except errors.UnknownBugTrackerAbbreviation:
3069
raise errors.BzrCommandError(
3070
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3419
raise errors.BzrCommandError(gettext(
3420
'Unrecognized bug %s. Commit refused.') % fixed_bug)
3071
3421
except errors.MalformedBugIdentifier, e:
3072
raise errors.BzrCommandError(
3073
"%s\nCommit refused." % (str(e),))
3422
raise errors.BzrCommandError(gettext(
3423
"%s\nCommit refused.") % (str(e),))
3075
3425
def run(self, message=None, file=None, verbose=False, selected_list=None,
3076
3426
unchanged=False, strict=False, local=False, fixes=None,
3077
author=None, show_diff=False, exclude=None, commit_time=None):
3427
author=None, show_diff=False, exclude=None, commit_time=None,
3078
3429
from bzrlib.errors import (
3079
3430
PointlessCommit,
3080
3431
ConflictsInTree,
3161
3507
# make_commit_message_template_encoded returns user encoding.
3162
3508
# We probably want to be using edit_commit_message instead to
3164
start_message = generate_commit_message_template(commit_obj)
3165
my_message = edit_commit_message_encoded(text,
3166
start_message=start_message)
3167
if my_message is None:
3168
raise errors.BzrCommandError("please specify a commit"
3169
" message with either --message or --file")
3170
if my_message == "":
3171
raise errors.BzrCommandError("empty commit message specified")
3510
my_message = set_commit_message(commit_obj)
3511
if my_message is None:
3512
start_message = generate_commit_message_template(commit_obj)
3513
my_message = edit_commit_message_encoded(text,
3514
start_message=start_message)
3515
if my_message is None:
3516
raise errors.BzrCommandError(gettext("please specify a commit"
3517
" message with either --message or --file"))
3518
if my_message == "":
3519
raise errors.BzrCommandError(gettext("Empty commit message specified."
3520
" Please specify a commit message with either"
3521
" --message or --file or leave a blank message"
3522
" with --message \"\"."))
3172
3523
return my_message
3174
3525
# The API permits a commit with a filter of [] to mean 'select nothing'
3182
3533
reporter=None, verbose=verbose, revprops=properties,
3183
3534
authors=author, timestamp=commit_stamp,
3184
3535
timezone=offset,
3185
exclude=tree.safe_relpath_files(exclude))
3536
exclude=tree.safe_relpath_files(exclude),
3186
3538
except PointlessCommit:
3187
raise errors.BzrCommandError("No changes to commit."
3188
" Use --unchanged to commit anyhow.")
3539
raise errors.BzrCommandError(gettext("No changes to commit."
3540
" Please 'bzr add' the files you want to commit, or use"
3541
" --unchanged to force an empty commit."))
3189
3542
except ConflictsInTree:
3190
raise errors.BzrCommandError('Conflicts detected in working '
3543
raise errors.BzrCommandError(gettext('Conflicts detected in working '
3191
3544
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3193
3546
except StrictCommitFailed:
3194
raise errors.BzrCommandError("Commit refused because there are"
3195
" unknown files in the working tree.")
3547
raise errors.BzrCommandError(gettext("Commit refused because there are"
3548
" unknown files in the working tree."))
3196
3549
except errors.BoundBranchOutOfDate, e:
3197
e.extra_help = ("\n"
3550
e.extra_help = (gettext("\n"
3198
3551
'To commit to master branch, run update and then commit.\n'
3199
3552
'You can also pass --local to commit to continue working '
3274
3627
class cmd_upgrade(Command):
3275
__doc__ = """Upgrade branch storage to current format.
3277
The check command or bzr developers may sometimes advise you to run
3278
this command. When the default format has changed you may also be warned
3279
during other operations to upgrade.
3628
__doc__ = """Upgrade a repository, branch or working tree to a newer format.
3630
When the default format has changed after a major new release of
3631
Bazaar, you may be informed during certain operations that you
3632
should upgrade. Upgrading to a newer format may improve performance
3633
or make new features available. It may however limit interoperability
3634
with older repositories or with older versions of Bazaar.
3636
If you wish to upgrade to a particular format rather than the
3637
current default, that can be specified using the --format option.
3638
As a consequence, you can use the upgrade command this way to
3639
"downgrade" to an earlier format, though some conversions are
3640
a one way process (e.g. changing from the 1.x default to the
3641
2.x default) so downgrading is not always possible.
3643
A backup.bzr.~#~ directory is created at the start of the conversion
3644
process (where # is a number). By default, this is left there on
3645
completion. If the conversion fails, delete the new .bzr directory
3646
and rename this one back in its place. Use the --clean option to ask
3647
for the backup.bzr directory to be removed on successful conversion.
3648
Alternatively, you can delete it by hand if everything looks good
3651
If the location given is a shared repository, dependent branches
3652
are also converted provided the repository converts successfully.
3653
If the conversion of a branch fails, remaining branches are still
3656
For more information on upgrades, see the Bazaar Upgrade Guide,
3657
http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3282
_see_also = ['check']
3660
_see_also = ['check', 'reconcile', 'formats']
3283
3661
takes_args = ['url?']
3284
3662
takes_options = [
3285
RegistryOption('format',
3286
help='Upgrade to a specific format. See "bzr help'
3287
' formats" for details.',
3288
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3289
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3290
value_switches=True, title='Branch format'),
3663
RegistryOption('format',
3664
help='Upgrade to a specific format. See "bzr help'
3665
' formats" for details.',
3666
lazy_registry=('bzrlib.controldir', 'format_registry'),
3667
converter=lambda name: controldir.format_registry.make_bzrdir(name),
3668
value_switches=True, title='Branch format'),
3670
help='Remove the backup.bzr directory if successful.'),
3672
help="Show what would be done, but don't actually do anything."),
3293
def run(self, url='.', format=None):
3675
def run(self, url='.', format=None, clean=False, dry_run=False):
3294
3676
from bzrlib.upgrade import upgrade
3295
upgrade(url, format)
3677
exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3679
if len(exceptions) == 1:
3680
# Compatibility with historical behavior
3298
3686
class cmd_whoami(Command):
3691
4104
The source of the merge can be specified either in the form of a branch,
3692
4105
or in the form of a path to a file containing a merge directive generated
3693
4106
with bzr send. If neither is specified, the default is the upstream branch
3694
or the branch most recently merged using --remember.
3696
When merging a branch, by default the tip will be merged. To pick a different
3697
revision, pass --revision. If you specify two values, the first will be used as
3698
BASE and the second one as OTHER. Merging individual revisions, or a subset of
3699
available revisions, like this is commonly referred to as "cherrypicking".
3701
Revision numbers are always relative to the branch being merged.
3703
By default, bzr will try to merge in all new work from the other
3704
branch, automatically determining an appropriate base. If this
3705
fails, you may need to give an explicit base.
4107
or the branch most recently merged using --remember. The source of the
4108
merge may also be specified in the form of a path to a file in another
4109
branch: in this case, only the modifications to that file are merged into
4110
the current working tree.
4112
When merging from a branch, by default bzr will try to merge in all new
4113
work from the other branch, automatically determining an appropriate base
4114
revision. If this fails, you may need to give an explicit base.
4116
To pick a different ending revision, pass "--revision OTHER". bzr will
4117
try to merge in all new work up to and including revision OTHER.
4119
If you specify two values, "--revision BASE..OTHER", only revisions BASE
4120
through OTHER, excluding BASE but including OTHER, will be merged. If this
4121
causes some revisions to be skipped, i.e. if the destination branch does
4122
not already contain revision BASE, such a merge is commonly referred to as
4123
a "cherrypick". Unlike a normal merge, Bazaar does not currently track
4124
cherrypicks. The changes look like a normal commit, and the history of the
4125
changes from the other branch is not stored in the commit.
4127
Revision numbers are always relative to the source branch.
3707
4129
Merge will do its best to combine the changes in two branches, but there
3708
4130
are some kinds of problems only a human can fix. When it encounters those,
3712
4134
Use bzr resolve when you have fixed a problem. See also bzr conflicts.
3714
If there is no default branch set, the first merge will set it. After
3715
that, you can omit the branch to use the default. To change the
3716
default, use --remember. The value will only be saved if the remote
3717
location can be accessed.
4136
If there is no default branch set, the first merge will set it (use
4137
--no-remember to avoid setting it). After that, you can omit the branch
4138
to use the default. To change the default, use --remember. The value will
4139
only be saved if the remote location can be accessed.
3719
4141
The results of the merge are placed into the destination working
3720
4142
directory, where they can be reviewed (with bzr diff), tested, and then
3721
4143
committed to record the result of the merge.
3723
4145
merge refuses to run if there are any uncommitted changes, unless
3724
--force is given. The --force option can also be used to create a
4146
--force is given. If --force is given, then the changes from the source
4147
will be merged with the current working tree, including any uncommitted
4148
changes in the tree. The --force option can also be used to create a
3725
4149
merge revision which has more than two parents.
3727
4151
If one would like to merge changes from the working tree of the other
3825
4253
mergeable = None
3827
4255
if uncommitted:
3828
raise errors.BzrCommandError('Cannot use --uncommitted'
3829
' with bundles or merge directives.')
4256
raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4257
' with bundles or merge directives.'))
3831
4259
if revision is not None:
3832
raise errors.BzrCommandError(
3833
'Cannot use -r with merge directives or bundles')
4260
raise errors.BzrCommandError(gettext(
4261
'Cannot use -r with merge directives or bundles'))
3834
4262
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3835
4263
mergeable, None)
3837
4265
if merger is None and uncommitted:
3838
4266
if revision is not None and len(revision) > 0:
3839
raise errors.BzrCommandError('Cannot use --uncommitted and'
3840
' --revision at the same time.')
4267
raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4268
' --revision at the same time.'))
3841
4269
merger = self.get_merger_from_uncommitted(tree, location, None)
3842
4270
allow_pending = False
3851
4279
self.sanity_check_merger(merger)
3852
4280
if (merger.base_rev_id == merger.other_rev_id and
3853
4281
merger.other_rev_id is not None):
3854
note('Nothing to do.')
4282
# check if location is a nonexistent file (and not a branch) to
4283
# disambiguate the 'Nothing to do'
4284
if merger.interesting_files:
4285
if not merger.other_tree.has_filename(
4286
merger.interesting_files[0]):
4287
note(gettext("merger: ") + str(merger))
4288
raise errors.PathsDoNotExist([location])
4289
note(gettext('Nothing to do.'))
4291
if pull and not preview:
3857
4292
if merger.interesting_files is not None:
3858
raise errors.BzrCommandError('Cannot pull individual files')
4293
raise errors.BzrCommandError(gettext('Cannot pull individual files'))
3859
4294
if (merger.base_rev_id == tree.last_revision()):
3860
4295
result = tree.pull(merger.other_branch, False,
3861
4296
merger.other_rev_id)
3862
4297
result.report(self.outf)
3864
4299
if merger.this_basis is None:
3865
raise errors.BzrCommandError(
4300
raise errors.BzrCommandError(gettext(
3866
4301
"This branch has no commits."
3867
" (perhaps you would prefer 'bzr pull')")
4302
" (perhaps you would prefer 'bzr pull')"))
3869
4304
return self._do_preview(merger)
3870
4305
elif interactive:
3968
4403
if other_revision_id is None:
3969
4404
other_revision_id = _mod_revision.ensure_null(
3970
4405
other_branch.last_revision())
3971
# Remember where we merge from
3972
if ((remember or tree.branch.get_submit_branch() is None) and
3973
user_location is not None):
4406
# Remember where we merge from. We need to remember if:
4407
# - user specify a location (and we don't merge from the parent
4409
# - user ask to remember or there is no previous location set to merge
4410
# from and user didn't ask to *not* remember
4411
if (user_location is not None
4413
or (remember is None
4414
and tree.branch.get_submit_branch() is None)))):
3974
4415
tree.branch.set_submit_branch(other_branch.base)
3975
_merge_tags_if_possible(other_branch, tree.branch)
4416
# Merge tags (but don't set them in the master branch yet, the user
4417
# might revert this merge). Commit will propagate them.
4418
_merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
3976
4419
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
3977
4420
other_revision_id, base_revision_id, other_branch, base_branch)
3978
4421
if other_path != '':
4319
4765
theirs_only=False,
4320
4766
log_format=None, long=False, short=False, line=False,
4321
4767
show_ids=False, verbose=False, this=False, other=False,
4322
include_merges=False, revision=None, my_revision=None,
4768
include_merged=None, revision=None, my_revision=None,
4770
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
4324
4771
from bzrlib.missing import find_unmerged, iter_log_revisions
4325
4772
def message(s):
4326
4773
if not is_quiet():
4327
4774
self.outf.write(s)
4776
if symbol_versioning.deprecated_passed(include_merges):
4777
ui.ui_factory.show_user_warning(
4778
'deprecated_command_option',
4779
deprecated_name='--include-merges',
4780
recommended_name='--include-merged',
4781
deprecated_in_version='2.5',
4782
command=self.invoked_as)
4783
if include_merged is None:
4784
include_merged = include_merges
4786
raise errors.BzrCommandError(gettext(
4787
'{0} and {1} are mutually exclusive').format(
4788
'--include-merges', '--include-merged'))
4789
if include_merged is None:
4790
include_merged = False
4330
4792
mine_only = this
4484
4950
@display_command
4485
4951
def run(self, verbose=False):
4486
import bzrlib.plugin
4487
from inspect import getdoc
4489
for name, plugin in bzrlib.plugin.plugins().items():
4490
version = plugin.__version__
4491
if version == 'unknown':
4493
name_ver = '%s %s' % (name, version)
4494
d = getdoc(plugin.module)
4496
doc = d.split('\n')[0]
4498
doc = '(no description)'
4499
result.append((name_ver, doc, plugin.path()))
4500
for name_ver, doc, path in sorted(result):
4501
self.outf.write("%s\n" % name_ver)
4502
self.outf.write(" %s\n" % doc)
4504
self.outf.write(" %s\n" % path)
4505
self.outf.write("\n")
4952
from bzrlib import plugin
4953
# Don't give writelines a generator as some codecs don't like that
4954
self.outf.writelines(
4955
list(plugin.describe_plugins(show_paths=verbose)))
4508
4958
class cmd_testament(Command):
4570
5022
self.add_cleanup(branch.lock_read().unlock)
4571
5023
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4572
5024
self.add_cleanup(tree.lock_read().unlock)
5025
if wt is not None and revision is None:
4574
5026
file_id = wt.path2id(relpath)
4576
5028
file_id = tree.path2id(relpath)
4577
5029
if file_id is None:
4578
5030
raise errors.NotVersionedError(filename)
4579
file_version = tree.inventory[file_id].revision
4580
5031
if wt is not None and revision is None:
4581
5032
# If there is a tree and we're not annotating historical
4582
5033
# versions, annotate the working tree's content.
4583
5034
annotate_file_tree(wt, file_id, self.outf, long, all,
4584
5035
show_ids=show_ids)
4586
annotate_file(branch, file_version, file_id, long, all, self.outf,
5037
annotate_file_tree(tree, file_id, self.outf, long, all,
5038
show_ids=show_ids, branch=branch)
4590
5041
class cmd_re_sign(Command):
4598
5049
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4599
5050
if revision_id_list is not None and revision is not None:
4600
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
5051
raise errors.BzrCommandError(gettext('You can only supply one of revision_id or --revision'))
4601
5052
if revision_id_list is None and revision is None:
4602
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
5053
raise errors.BzrCommandError(gettext('You must supply either --revision or a revision_id'))
4603
5054
b = WorkingTree.open_containing(directory)[0].branch
4604
5055
self.add_cleanup(b.lock_write().unlock)
4605
5056
return self._run(b, revision_id_list, revision)
4607
5058
def _run(self, b, revision_id_list, revision):
4608
5059
import bzrlib.gpg as gpg
4609
gpg_strategy = gpg.GPGStrategy(b.get_config())
5060
gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
4610
5061
if revision_id_list is not None:
4611
5062
b.repository.start_write_group()
4675
5126
location = b.get_old_bound_location()
4676
5127
except errors.UpgradeRequired:
4677
raise errors.BzrCommandError('No location supplied. '
4678
'This format does not remember old locations.')
5128
raise errors.BzrCommandError(gettext('No location supplied. '
5129
'This format does not remember old locations.'))
4680
5131
if location is None:
4681
5132
if b.get_bound_location() is not None:
4682
raise errors.BzrCommandError('Branch is already bound')
5133
raise errors.BzrCommandError(gettext('Branch is already bound'))
4684
raise errors.BzrCommandError('No location supplied '
4685
'and no previous location known')
5135
raise errors.BzrCommandError(gettext('No location supplied '
5136
'and no previous location known'))
4686
5137
b_other = Branch.open(location)
4688
5139
b.bind(b_other)
4689
5140
except errors.DivergedBranches:
4690
raise errors.BzrCommandError('These branches have diverged.'
4691
' Try merging, and then bind again.')
5141
raise errors.BzrCommandError(gettext('These branches have diverged.'
5142
' Try merging, and then bind again.'))
4692
5143
if b.get_config().has_explicit_nickname():
4693
5144
b.nick = b_other.nick
4760
5212
self.add_cleanup(tree.lock_write().unlock)
4762
5214
self.add_cleanup(b.lock_write().unlock)
4763
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5215
return self._run(b, tree, dry_run, verbose, revision, force,
4765
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5218
def _run(self, b, tree, dry_run, verbose, revision, force, local,
4766
5220
from bzrlib.log import log_formatter, show_log
4767
5221
from bzrlib.uncommit import uncommit
4798
5252
end_revision=last_revno)
4801
self.outf.write('Dry-run, pretending to remove'
4802
' the above revisions.\n')
5255
self.outf.write(gettext('Dry-run, pretending to remove'
5256
' the above revisions.\n'))
4804
self.outf.write('The above revision(s) will be removed.\n')
5258
self.outf.write(gettext('The above revision(s) will be removed.\n'))
4807
5261
if not ui.ui_factory.confirm_action(
4808
'Uncommit these revisions',
5262
gettext(u'Uncommit these revisions'),
4809
5263
'bzrlib.builtins.uncommit',
4811
self.outf.write('Canceled\n')
5265
self.outf.write(gettext('Canceled\n'))
4814
5268
mutter('Uncommitting from {%s} to {%s}',
4815
5269
last_rev_id, rev_id)
4816
5270
uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
4817
revno=revno, local=local)
4818
self.outf.write('You can restore the old tip by running:\n'
4819
' bzr pull . -r revid:%s\n' % last_rev_id)
5271
revno=revno, local=local, keep_tags=keep_tags)
5272
self.outf.write(gettext('You can restore the old tip by running:\n'
5273
' bzr pull . -r revid:%s\n') % last_rev_id)
4822
5276
class cmd_break_lock(Command):
4922
5384
return host, port
4924
5386
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5387
protocol=None, client_timeout=None):
4926
5388
from bzrlib import transport
4927
5389
if directory is None:
4928
5390
directory = os.getcwd()
4929
5391
if protocol is None:
4930
5392
protocol = transport.transport_server_registry.get()
4931
5393
host, port = self.get_host_and_port(port)
4932
url = urlutils.local_path_to_url(directory)
5394
url = transport.location_to_url(directory)
4933
5395
if not allow_writes:
4934
5396
url = 'readonly+' + url
4935
t = transport.get_transport(url)
4936
protocol(t, host, port, inet)
5397
t = transport.get_transport_from_url(url)
5399
protocol(t, host, port, inet, client_timeout)
5400
except TypeError, e:
5401
# We use symbol_versioning.deprecated_in just so that people
5402
# grepping can find it here.
5403
# symbol_versioning.deprecated_in((2, 5, 0))
5404
symbol_versioning.warn(
5405
'Got TypeError(%s)\ntrying to call protocol: %s.%s\n'
5406
'Most likely it needs to be updated to support a'
5407
' "timeout" parameter (added in bzr 2.5.0)'
5408
% (e, protocol.__module__, protocol),
5410
protocol(t, host, port, inet)
4939
5413
class cmd_join(Command):
5345
5825
self.add_cleanup(branch.lock_write().unlock)
5347
5827
if tag_name is None:
5348
raise errors.BzrCommandError("No tag specified to delete.")
5828
raise errors.BzrCommandError(gettext("No tag specified to delete."))
5349
5829
branch.tags.delete_tag(tag_name)
5350
self.outf.write('Deleted tag %s.\n' % tag_name)
5830
note(gettext('Deleted tag %s.') % tag_name)
5353
5833
if len(revision) != 1:
5354
raise errors.BzrCommandError(
5834
raise errors.BzrCommandError(gettext(
5355
5835
"Tags can only be placed on a single revision, "
5357
5837
revision_id = revision[0].as_revision_id(branch)
5359
5839
revision_id = branch.last_revision()
5360
5840
if tag_name is None:
5361
5841
tag_name = branch.automatic_tag_name(revision_id)
5362
5842
if tag_name is None:
5363
raise errors.BzrCommandError(
5364
"Please specify a tag name.")
5365
if (not force) and branch.tags.has_tag(tag_name):
5843
raise errors.BzrCommandError(gettext(
5844
"Please specify a tag name."))
5846
existing_target = branch.tags.lookup_tag(tag_name)
5847
except errors.NoSuchTag:
5848
existing_target = None
5849
if not force and existing_target not in (None, revision_id):
5366
5850
raise errors.TagAlreadyExists(tag_name)
5367
branch.tags.set_tag(tag_name, revision_id)
5368
self.outf.write('Created tag %s.\n' % tag_name)
5851
if existing_target == revision_id:
5852
note(gettext('Tag %s already exists for that revision.') % tag_name)
5854
branch.tags.set_tag(tag_name, revision_id)
5855
if existing_target is None:
5856
note(gettext('Created tag %s.') % tag_name)
5858
note(gettext('Updated tag %s.') % tag_name)
5371
5861
class cmd_tags(Command):
5403
5888
self.add_cleanup(branch.lock_read().unlock)
5405
graph = branch.repository.get_graph()
5406
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5407
revid1, revid2 = rev1.rev_id, rev2.rev_id
5408
# only show revisions between revid1 and revid2 (inclusive)
5409
tags = [(tag, revid) for tag, revid in tags if
5410
graph.is_between(revid, revid1, revid2)]
5413
elif sort == 'time':
5415
for tag, revid in tags:
5417
revobj = branch.repository.get_revision(revid)
5418
except errors.NoSuchRevision:
5419
timestamp = sys.maxint # place them at the end
5421
timestamp = revobj.timestamp
5422
timestamps[revid] = timestamp
5423
tags.sort(key=lambda x: timestamps[x[1]])
5890
# Restrict to the specified range
5891
tags = self._tags_for_range(branch, revision)
5893
sort = tag_sort_methods.get()
5424
5895
if not show_ids:
5425
5896
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5426
5897
for index, (tag, revid) in enumerate(tags):
5437
5910
for tag, revspec in tags:
5438
5911
self.outf.write('%-20s %s\n' % (tag, revspec))
5913
def _tags_for_range(self, branch, revision):
5915
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5916
revid1, revid2 = rev1.rev_id, rev2.rev_id
5917
# _get_revision_range will always set revid2 if it's not specified.
5918
# If revid1 is None, it means we want to start from the branch
5919
# origin which is always a valid ancestor. If revid1 == revid2, the
5920
# ancestry check is useless.
5921
if revid1 and revid1 != revid2:
5922
# FIXME: We really want to use the same graph than
5923
# branch.iter_merge_sorted_revisions below, but this is not
5924
# easily available -- vila 2011-09-23
5925
if branch.repository.get_graph().is_ancestor(revid2, revid1):
5926
# We don't want to output anything in this case...
5928
# only show revisions between revid1 and revid2 (inclusive)
5929
tagged_revids = branch.tags.get_reverse_tag_dict()
5931
for r in branch.iter_merge_sorted_revisions(
5932
start_revision_id=revid2, stop_revision_id=revid1,
5933
stop_rule='include'):
5934
revid_tags = tagged_revids.get(r[0], None)
5936
found.extend([(tag, r[0]) for tag in revid_tags])
5441
5940
class cmd_reconfigure(Command):
5442
5941
__doc__ = """Reconfigure the type of a bzr directory.
5456
5955
takes_args = ['location?']
5457
5956
takes_options = [
5458
5957
RegistryOption.from_kwargs(
5460
title='Target type',
5461
help='The type to reconfigure the directory to.',
5960
help='The relation between branch and tree.',
5462
5961
value_switches=True, enum_switch=False,
5463
5962
branch='Reconfigure to be an unbound branch with no working tree.',
5464
5963
tree='Reconfigure to be an unbound branch with a working tree.',
5465
5964
checkout='Reconfigure to be a bound branch with a working tree.',
5466
5965
lightweight_checkout='Reconfigure to be a lightweight'
5467
5966
' checkout (with no local history).',
5968
RegistryOption.from_kwargs(
5970
title='Repository type',
5971
help='Location fo the repository.',
5972
value_switches=True, enum_switch=False,
5468
5973
standalone='Reconfigure to be a standalone branch '
5469
5974
'(i.e. stop using shared repository).',
5470
5975
use_shared='Reconfigure to use a shared repository.',
5977
RegistryOption.from_kwargs(
5979
title='Trees in Repository',
5980
help='Whether new branches in the repository have trees.',
5981
value_switches=True, enum_switch=False,
5471
5982
with_trees='Reconfigure repository to create '
5472
5983
'working trees on branches by default.',
5473
5984
with_no_trees='Reconfigure repository to not create '
5490
def run(self, location=None, target_type=None, bind_to=None, force=False,
5493
directory = bzrdir.BzrDir.open(location)
6001
def run(self, location=None, bind_to=None, force=False,
6002
tree_type=None, repository_type=None, repository_trees=None,
6003
stacked_on=None, unstacked=None):
6004
directory = controldir.ControlDir.open(location)
5494
6005
if stacked_on and unstacked:
5495
raise BzrCommandError("Can't use both --stacked-on and --unstacked")
6006
raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
5496
6007
elif stacked_on is not None:
5497
6008
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5498
6009
elif unstacked:
5500
6011
# At the moment you can use --stacked-on and a different
5501
6012
# reconfiguration shape at the same time; there seems no good reason
5503
if target_type is None:
6014
if (tree_type is None and
6015
repository_type is None and
6016
repository_trees is None):
5504
6017
if stacked_on or unstacked:
5507
raise errors.BzrCommandError('No target configuration '
5509
elif target_type == 'branch':
6020
raise errors.BzrCommandError(gettext('No target configuration '
6022
reconfiguration = None
6023
if tree_type == 'branch':
5510
6024
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5511
elif target_type == 'tree':
6025
elif tree_type == 'tree':
5512
6026
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5513
elif target_type == 'checkout':
6027
elif tree_type == 'checkout':
5514
6028
reconfiguration = reconfigure.Reconfigure.to_checkout(
5515
6029
directory, bind_to)
5516
elif target_type == 'lightweight-checkout':
6030
elif tree_type == 'lightweight-checkout':
5517
6031
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5518
6032
directory, bind_to)
5519
elif target_type == 'use-shared':
6034
reconfiguration.apply(force)
6035
reconfiguration = None
6036
if repository_type == 'use-shared':
5520
6037
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5521
elif target_type == 'standalone':
6038
elif repository_type == 'standalone':
5522
6039
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5523
elif target_type == 'with-trees':
6041
reconfiguration.apply(force)
6042
reconfiguration = None
6043
if repository_trees == 'with-trees':
5524
6044
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5525
6045
directory, True)
5526
elif target_type == 'with-no-trees':
6046
elif repository_trees == 'with-no-trees':
5527
6047
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5528
6048
directory, False)
5529
reconfiguration.apply(force)
6050
reconfiguration.apply(force)
6051
reconfiguration = None
5532
6054
class cmd_switch(Command):
5581
6103
had_explicit_nick = False
5582
6104
if create_branch:
5583
6105
if branch is None:
5584
raise errors.BzrCommandError('cannot create branch without'
6106
raise errors.BzrCommandError(gettext('cannot create branch without'
5586
6108
to_location = directory_service.directories.dereference(
5588
6110
if '/' not in to_location and '\\' not in to_location:
5589
6111
# This path is meant to be relative to the existing branch
5590
6112
this_url = self._get_branch_location(control_dir)
5591
to_location = urlutils.join(this_url, '..', to_location)
6113
# Perhaps the target control dir supports colocated branches?
6115
root = controldir.ControlDir.open(this_url,
6116
possible_transports=[control_dir.user_transport])
6117
except errors.NotBranchError:
6120
colocated = root._format.colocated_branches
6122
to_location = urlutils.join_segment_parameters(this_url,
6123
{"branch": urlutils.escape(to_location)})
6125
to_location = urlutils.join(
6126
this_url, '..', urlutils.escape(to_location))
5592
6127
to_branch = branch.bzrdir.sprout(to_location,
5593
6128
possible_transports=[branch.bzrdir.root_transport],
5594
6129
source_branch=branch).open_branch()
6131
# Perhaps it's a colocated branch?
5597
to_branch = Branch.open(to_location)
5598
except errors.NotBranchError:
5599
this_url = self._get_branch_location(control_dir)
5600
to_branch = Branch.open(
5601
urlutils.join(this_url, '..', to_location))
6133
to_branch = control_dir.open_branch(to_location)
6134
except (errors.NotBranchError, errors.NoColocatedBranchSupport):
6136
to_branch = Branch.open(to_location)
6137
except errors.NotBranchError:
6138
this_url = self._get_branch_location(control_dir)
6139
to_branch = Branch.open(
6141
this_url, '..', urlutils.escape(to_location)))
5602
6142
if revision is not None:
5603
6143
revision = revision.as_revision_id(to_branch)
5604
6144
switch.switch(control_dir, to_branch, force, revision_id=revision)
5605
6145
if had_explicit_nick:
5606
6146
branch = control_dir.open_branch() #get the new branch!
5607
6147
branch.nick = to_branch.nick
5608
note('Switched to branch: %s',
6148
note(gettext('Switched to branch: %s'),
5609
6149
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5611
6151
def _get_branch_location(self, control_dir):
5720
6260
name = current_view
5723
raise errors.BzrCommandError(
5724
"Both --delete and a file list specified")
6263
raise errors.BzrCommandError(gettext(
6264
"Both --delete and a file list specified"))
5726
raise errors.BzrCommandError(
5727
"Both --delete and --switch specified")
6266
raise errors.BzrCommandError(gettext(
6267
"Both --delete and --switch specified"))
5729
6269
tree.views.set_view_info(None, {})
5730
self.outf.write("Deleted all views.\n")
6270
self.outf.write(gettext("Deleted all views.\n"))
5731
6271
elif name is None:
5732
raise errors.BzrCommandError("No current view to delete")
6272
raise errors.BzrCommandError(gettext("No current view to delete"))
5734
6274
tree.views.delete_view(name)
5735
self.outf.write("Deleted '%s' view.\n" % name)
6275
self.outf.write(gettext("Deleted '%s' view.\n") % name)
5738
raise errors.BzrCommandError(
5739
"Both --switch and a file list specified")
6278
raise errors.BzrCommandError(gettext(
6279
"Both --switch and a file list specified"))
5741
raise errors.BzrCommandError(
5742
"Both --switch and --all specified")
6281
raise errors.BzrCommandError(gettext(
6282
"Both --switch and --all specified"))
5743
6283
elif switch == 'off':
5744
6284
if current_view is None:
5745
raise errors.BzrCommandError("No current view to disable")
6285
raise errors.BzrCommandError(gettext("No current view to disable"))
5746
6286
tree.views.set_view_info(None, view_dict)
5747
self.outf.write("Disabled '%s' view.\n" % (current_view))
6287
self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
5749
6289
tree.views.set_view_info(switch, view_dict)
5750
6290
view_str = views.view_display_str(tree.views.lookup_view())
5751
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6291
self.outf.write(gettext("Using '{0}' view: {1}\n").format(switch, view_str))
5754
self.outf.write('Views defined:\n')
6294
self.outf.write(gettext('Views defined:\n'))
5755
6295
for view in sorted(view_dict):
5756
6296
if view == current_view:
5760
6300
view_str = views.view_display_str(view_dict[view])
5761
6301
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5763
self.outf.write('No views defined.\n')
6303
self.outf.write(gettext('No views defined.\n'))
5764
6304
elif file_list:
5765
6305
if name is None:
5766
6306
# No name given and no current view set
5768
6308
elif name == 'off':
5769
raise errors.BzrCommandError(
5770
"Cannot change the 'off' pseudo view")
6309
raise errors.BzrCommandError(gettext(
6310
"Cannot change the 'off' pseudo view"))
5771
6311
tree.views.set_view(name, sorted(file_list))
5772
6312
view_str = views.view_display_str(tree.views.lookup_view())
5773
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6313
self.outf.write(gettext("Using '{0}' view: {1}\n").format(name, view_str))
5775
6315
# list the files
5776
6316
if name is None:
5777
6317
# No name given and no current view set
5778
self.outf.write('No current view.\n')
6318
self.outf.write(gettext('No current view.\n'))
5780
6320
view_str = views.view_display_str(tree.views.lookup_view(name))
5781
self.outf.write("'%s' view is: %s\n" % (name, view_str))
6321
self.outf.write(gettext("'{0}' view is: {1}\n").format(name, view_str))
5784
6324
class cmd_hooks(Command):
6016
6570
self.outf.write('%s %s\n' % (path, location))
6573
class cmd_export_pot(Command):
6574
__doc__ = """Export command helps and error messages in po format."""
6577
takes_options = [Option('plugin',
6578
help='Export help text from named command '\
6579
'(defaults to all built in commands).',
6581
Option('include-duplicates',
6582
help='Output multiple copies of the same msgid '
6583
'string if it appears more than once.'),
6586
def run(self, plugin=None, include_duplicates=False):
6587
from bzrlib.export_pot import export_pot
6588
export_pot(self.outf, plugin, include_duplicates)
6019
6591
def _register_lazy_builtins():
6020
6592
# register lazy builtins from other modules; called at startup and should
6021
6593
# be only called once.
6022
6594
for (name, aliases, module_name) in [
6023
6595
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6596
('cmd_config', [], 'bzrlib.config'),
6024
6597
('cmd_dpush', [], 'bzrlib.foreign'),
6025
6598
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6026
6599
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6027
6600
('cmd_conflicts', [], 'bzrlib.conflicts'),
6028
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6601
('cmd_sign_my_commits', [], 'bzrlib.commit_signature_commands'),
6602
('cmd_verify_signatures', [],
6603
'bzrlib.commit_signature_commands'),
6604
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6030
6606
builtin_command_registry.register_lazy(name, aliases, module_name)