326
337
def run(self, revision_id=None, revision=None, directory=u'.'):
327
338
if revision_id is not None and revision is not None:
328
raise errors.BzrCommandError('You can only supply one of'
329
' revision_id or --revision')
339
raise errors.BzrCommandError(gettext('You can only supply one of'
340
' revision_id or --revision'))
330
341
if revision_id is None and revision is None:
331
raise errors.BzrCommandError('You must supply either'
332
' --revision or a revision_id')
333
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]
335
347
revisions = b.repository.revisions
336
348
if revisions is None:
337
raise errors.BzrCommandError('Repository %r does not support '
338
'access to raw revision texts')
349
raise errors.BzrCommandError(gettext('Repository %r does not support '
350
'access to raw revision texts'))
340
352
b.repository.lock_read()
477
492
raise errors.ShelvedChanges(working)
479
494
if working.user_url != working.branch.user_url:
480
raise errors.BzrCommandError("You cannot remove the working tree"
481
" from a lightweight checkout")
495
raise errors.BzrCommandError(gettext("You cannot remove the working tree"
496
" from a lightweight checkout"))
483
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))
486
553
class cmd_revno(Command):
487
554
__doc__ = """Show current revision number.
492
559
_see_also = ['info']
493
560
takes_args = ['location?']
494
561
takes_options = [
495
Option('tree', help='Show revno of working tree'),
562
Option('tree', help='Show revno of working tree.'),
499
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"))
502
574
wt = WorkingTree.open_containing(location)[0]
503
575
self.add_cleanup(wt.lock_read().unlock)
504
576
except (errors.NoWorkingTree, errors.NotLocalUrl):
505
577
raise errors.NoWorkingTree(location)
506
579
revid = wt.last_revision()
508
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
509
except errors.NoSuchRevision:
511
revno = ".".join(str(n) for n in revno_t)
513
581
b = Branch.open_containing(location)[0]
514
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)
516
596
self.cleanup_now()
517
self.outf.write(str(revno) + '\n')
597
self.outf.write(revno + '\n')
520
600
class cmd_revision_info(Command):
668
756
takes_args = ['dir+']
760
help='No error if existing, make parent directories as needed.',
669
764
encoding_type = 'replace'
671
def run(self, dir_list):
673
wt, dd = WorkingTree.open_containing(d)
674
base = os.path.dirname(dd)
675
id = wt.path2id(base)
679
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:
681
raise errors.NotVersionedError(path=base)
792
add_file(wt, relpath)
794
self.outf.write(gettext('added %s\n') % dir)
684
797
class cmd_relpath(Command):
790
904
return self.run_auto(names_list, after, dry_run)
792
raise errors.BzrCommandError('--dry-run requires --auto.')
906
raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
793
907
if names_list is None:
795
909
if len(names_list) < 2:
796
raise errors.BzrCommandError("missing file argument")
910
raise errors.BzrCommandError(gettext("missing file argument"))
797
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"))
798
915
self.add_cleanup(tree.lock_tree_write().unlock)
799
916
self._run(tree, names_list, rel_names, after)
801
918
def run_auto(self, names_list, after, dry_run):
802
919
if names_list is not None and len(names_list) > 1:
803
raise errors.BzrCommandError('Only one path may be specified to'
920
raise errors.BzrCommandError(gettext('Only one path may be specified to'
806
raise errors.BzrCommandError('--after cannot be specified with'
923
raise errors.BzrCommandError(gettext('--after cannot be specified with'
808
925
work_tree, file_list = WorkingTree.open_containing_paths(
809
926
names_list, default_directory='.')
810
927
self.add_cleanup(work_tree.lock_tree_write().unlock)
907
1024
match the remote one, use pull --overwrite. This will work even if the two
908
1025
branches have diverged.
910
If there is no default location set, the first pull will set it. After
911
that, you can omit the location to use the default. To change the
912
default, use --remember. The value will only be saved if the remote
913
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>.
915
1036
Note: The location can be specified either in the form of a branch,
916
1037
or in the form of a path to a file containing a merge directive generated
1039
1164
do a merge (see bzr help merge) from the other branch, and commit that.
1040
1165
After that you will be able to do a push without '--overwrite'.
1042
If there is no default push location set, the first push will set it.
1043
After that, you can omit the location to use the default. To change the
1044
default, use --remember. The value will only be saved if the remote
1045
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>.
1048
1177
_see_also = ['pull', 'update', 'working-trees']
1113
1242
# error by the feedback given to them. RBC 20080227.
1114
1243
stacked_on = parent_url
1115
1244
if not stacked_on:
1116
raise errors.BzrCommandError(
1117
"Could not determine branch to refer to.")
1245
raise errors.BzrCommandError(gettext(
1246
"Could not determine branch to refer to."))
1119
1248
# Get the destination location
1120
1249
if location is None:
1121
1250
stored_loc = br_from.get_push_location()
1122
1251
if stored_loc is None:
1123
raise errors.BzrCommandError(
1124
"No push location known or specified.")
1252
raise errors.BzrCommandError(gettext(
1253
"No push location known or specified."))
1126
1255
display_url = urlutils.unescape_for_display(stored_loc,
1127
1256
self.outf.encoding)
1128
self.outf.write("Using saved push location: %s\n" % display_url)
1257
note(gettext("Using saved push location: %s") % display_url)
1129
1258
location = stored_loc
1131
1260
_show_push_branch(br_from, revision_id, location, self.outf,
1201
1338
revision_id = br_from.last_revision()
1202
1339
if to_location is None:
1203
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)
1204
1343
to_transport = transport.get_transport(to_location)
1206
1345
to_transport.mkdir('.')
1207
1346
except errors.FileExists:
1208
if not use_existing_dir:
1209
raise errors.BzrCommandError('Target directory "%s" '
1210
'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)
1213
bzrdir.BzrDir.open_from_transport(to_transport)
1358
to_dir.open_branch()
1214
1359
except errors.NotBranchError:
1217
1362
raise errors.AlreadyBranchError(to_location)
1218
1363
except errors.NoSuchFile:
1219
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1364
raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
1222
# preserve whatever source format we have.
1223
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1224
possible_transports=[to_transport],
1225
accelerator_tree=accelerator_tree,
1226
hardlink=hardlink, stacked=stacked,
1227
force_new_repo=standalone,
1228
create_tree_if_local=not no_tree,
1229
source_branch=br_from)
1230
branch = dir.open_branch()
1231
except errors.NoSuchRevision:
1232
to_transport.delete_tree('.')
1233
msg = "The branch %s has no revision %s." % (from_location,
1235
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)
1236
1388
_merge_tags_if_possible(br_from, branch)
1237
1389
# If the source branch is stacked, the new branch may
1238
1390
# be stacked whether we asked for that explicitly or not.
1239
1391
# We therefore need a try/except here and not just 'if stacked:'
1241
note('Created new stacked branch referring to %s.' %
1393
note(gettext('Created new stacked branch referring to %s.') %
1242
1394
branch.get_stacked_on_url())
1243
1395
except (errors.NotStacked, errors.UnstackableBranchFormat,
1244
1396
errors.UnstackableRepositoryFormat), e:
1245
note('Branched %d revision(s).' % branch.revno())
1397
note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
1247
1399
# Bind to the parent
1248
1400
parent_branch = Branch.open(from_location)
1249
1401
branch.bind(parent_branch)
1250
note('New branch bound to %s' % from_location)
1402
note(gettext('New branch bound to %s') % from_location)
1252
1404
# Switch to the new branch
1253
1405
wt, _ = WorkingTree.open_containing('.')
1254
1406
_mod_switch.switch(wt.bzrdir, branch)
1255
note('Switched to branch: %s',
1407
note(gettext('Switched to branch: %s'),
1256
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))
1259
1444
class cmd_checkout(Command):
1260
1445
__doc__ = """Create a new checkout of an existing branch.
1363
1548
class cmd_update(Command):
1364
__doc__ = """Update a tree to have the latest code committed to its branch.
1366
This will perform a merge into the working tree, and may generate
1367
conflicts. If you have any local changes, you will still
1368
need to commit them after the update for the update to be complete.
1370
If you want to discard your local changes, you can just do a
1371
'bzr revert' instead of 'bzr commit' after the update.
1373
If you want to restore a file that has been removed locally, use
1374
'bzr revert' instead of 'bzr update'.
1376
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
1377
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.
1380
1578
_see_also = ['pull', 'working-trees', 'status-flags']
1386
1584
aliases = ['up']
1388
def run(self, dir='.', revision=None, show_base=None):
1586
def run(self, dir=None, revision=None, show_base=None):
1389
1587
if revision is not None and len(revision) != 1:
1390
raise errors.BzrCommandError(
1391
"bzr update --revision takes exactly one revision")
1392
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"))
1393
1599
branch = tree.branch
1394
1600
possible_transports = []
1395
1601
master = branch.get_master_branch(
1434
1640
old_tip=old_tip,
1435
1641
show_base=show_base)
1436
1642
except errors.NoSuchRevision, e:
1437
raise errors.BzrCommandError(
1643
raise errors.BzrCommandError(gettext(
1438
1644
"branch has no revision %s\n"
1439
1645
"bzr update --revision only works"
1440
" for a revision in the branch history"
1646
" for a revision in the branch history")
1441
1647
% (e.revision))
1442
1648
revno = tree.branch.revision_id_to_dotted_revno(
1443
1649
_mod_revision.ensure_null(tree.last_revision()))
1444
note('Updated to revision %s of branch %s' %
1445
('.'.join(map(str, revno)), branch_location))
1650
note(gettext('Updated to revision {0} of branch {1}').format(
1651
'.'.join(map(str, revno)), branch_location))
1446
1652
parent_ids = tree.get_parent_ids()
1447
1653
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1448
note('Your local commits will now show as pending merges with '
1449
"'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'."))
1450
1656
if conflicts != 0:
2311
2533
Option('show-diff',
2312
2534
short_name='p',
2313
2535
help='Show changes made in each revision as a patch.'),
2314
Option('include-merges',
2536
Option('include-merged',
2315
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.'),
2316
2542
Option('exclude-common-ancestry',
2317
2543
help='Display only the revisions that are not part'
2318
' 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 '
2321
2570
encoding_type = 'replace'
2342
2599
_get_info_for_log_files,
2344
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
2345
2617
if (exclude_common_ancestry
2346
2618
and (revision is None or len(revision) != 2)):
2347
raise errors.BzrCommandError(
2348
'--exclude-common-ancestry requires -r with two revisions')
2619
raise errors.BzrCommandError(gettext(
2620
'--exclude-common-ancestry requires -r with two revisions'))
2350
2622
if levels is None:
2353
raise errors.BzrCommandError(
2354
'--levels and --include-merges are mutually exclusive')
2625
raise errors.BzrCommandError(gettext(
2626
'{0} and {1} are mutually exclusive').format(
2627
'--levels', '--include-merged'))
2356
2629
if change is not None:
2357
2630
if len(change) > 1:
2358
2631
raise errors.RangeInChangeOption()
2359
2632
if revision is not None:
2360
raise errors.BzrCommandError(
2361
'--revision and --change are mutually exclusive')
2633
raise errors.BzrCommandError(gettext(
2634
'{0} and {1} are mutually exclusive').format(
2635
'--revision', '--change'))
2363
2637
revision = change
2749
3043
self.outf.write("%s\n" % pattern)
2751
3045
if not name_pattern_list:
2752
raise errors.BzrCommandError("ignore requires at least one "
2753
"NAME_PATTERN or --default-rules.")
3046
raise errors.BzrCommandError(gettext("ignore requires at least one "
3047
"NAME_PATTERN or --default-rules."))
2754
3048
name_pattern_list = [globbing.normalize_pattern(p)
2755
3049
for p in name_pattern_list]
2756
3050
bad_patterns = ''
3051
bad_patterns_count = 0
2757
3052
for p in name_pattern_list:
2758
3053
if not globbing.Globster.is_pattern_valid(p):
3054
bad_patterns_count += 1
2759
3055
bad_patterns += ('\n %s' % p)
2760
3056
if bad_patterns:
2761
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)
2762
3060
ui.ui_factory.show_error(msg)
2763
3061
raise errors.InvalidPattern('')
2764
3062
for name_pattern in name_pattern_list:
2765
3063
if (name_pattern[0] == '/' or
2766
3064
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2767
raise errors.BzrCommandError(
2768
"NAME_PATTERN should not be an absolute path")
3065
raise errors.BzrCommandError(gettext(
3066
"NAME_PATTERN should not be an absolute path"))
2769
3067
tree, relpath = WorkingTree.open_containing(directory)
2770
3068
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2771
3069
ignored = globbing.Globster(name_pattern_list)
2874
3173
Option('per-file-timestamps',
2875
3174
help='Set modification time of files to that of the last '
2876
3175
'revision in which it was changed.'),
3176
Option('uncommitted',
3177
help='Export the working tree contents rather than that of the '
2878
3180
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2879
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3181
root=None, filters=False, per_file_timestamps=False, uncommitted=False,
2880
3183
from bzrlib.export import export
2882
3185
if branch_or_subdir is None:
2883
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"))
2887
b, subdir = Branch.open_containing(branch_or_subdir)
2890
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)
2892
export(rev_tree, dest, format, root, subdir, filtered=filters,
3201
export(export_tree, dest, format, root, subdir, filtered=filters,
2893
3202
per_file_timestamps=per_file_timestamps)
2894
3203
except errors.NoSuchExportFormat, e:
2895
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3204
raise errors.BzrCommandError(
3205
gettext('Unsupported export format: %s') % e.format)
2898
3208
class cmd_cat(Command):
2936
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
2938
3252
if name_from_revision:
2939
3253
# Try in revision if requested
2940
3254
if old_file_id is None:
2941
raise errors.BzrCommandError(
2942
"%r is not present in revision %s" % (
3255
raise errors.BzrCommandError(gettext(
3256
"{0!r} is not present in revision {1}").format(
2943
3257
filename, rev_tree.get_revision_id()))
2945
content = rev_tree.get_file_text(old_file_id)
3259
actual_file_id = old_file_id
2947
3261
cur_file_id = tree.path2id(relpath)
2949
if cur_file_id is not None:
2950
# Then try with the actual file id
2952
content = rev_tree.get_file_text(cur_file_id)
2954
except errors.NoSuchId:
2955
# The actual file id didn't exist at that time
2957
if not found and old_file_id is not None:
2958
# Finally try with the old file id
2959
content = rev_tree.get_file_text(old_file_id)
2962
# Can't be found anywhere
2963
raise errors.BzrCommandError(
2964
"%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(
2965
3269
filename, rev_tree.get_revision_id()))
2967
from bzrlib.filters import (
2968
ContentFilterContext,
2969
filtered_output_bytes,
2971
filters = rev_tree._content_filter_stack(relpath)
2972
chunks = content.splitlines(True)
2973
content = filtered_output_bytes(chunks, filters,
2974
ContentFilterContext(relpath, rev_tree))
2976
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)
2979
self.outf.write(content)
3276
content = rev_tree.get_file_text(actual_file_id)
3278
self.outf.write(content)
2982
3281
class cmd_local_time_offset(Command):
3043
3342
to trigger updates to external systems like bug trackers. The --fixes
3044
3343
option can be used to record the association between a revision and
3045
3344
one or more bugs. See ``bzr help bugs`` for details.
3047
A selective commit may fail in some cases where the committed
3048
tree would be invalid. Consider::
3053
bzr commit foo -m "committing foo"
3054
bzr mv foo/bar foo/baz
3057
bzr commit foo/bar -m "committing bar but not baz"
3059
In the example above, the last commit will fail by design. This gives
3060
the user the opportunity to decide whether they want to commit the
3061
rename at the same time, separately first, or not at all. (As a general
3062
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3064
# TODO: Run hooks on tree to-be-committed, and after commit.
3066
# TODO: Strict commit that fails if there are deleted files.
3067
# (what does "deleted files" mean ??)
3069
# TODO: Give better message for -s, --summary, used by tla people
3071
# XXX: verbose currently does nothing
3073
3347
_see_also = ['add', 'bugs', 'hooks', 'uncommit']
3074
3348
takes_args = ['selected*']
3106
3380
Option('show-diff', short_name='p',
3107
3381
help='When no message is supplied, show the diff along'
3108
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 '
3110
3388
aliases = ['ci', 'checkin']
3112
3390
def _iter_bug_fix_urls(self, fixes, branch):
3391
default_bugtracker = None
3113
3392
# Configure the properties for bug fixing attributes.
3114
3393
for fixed_bug in fixes:
3115
3394
tokens = fixed_bug.split(':')
3116
if len(tokens) != 2:
3117
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(
3118
3411
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3119
3412
"See \"bzr help bugs\" for more information on this "
3120
"feature.\nCommit refused." % fixed_bug)
3121
tag, bug_id = tokens
3413
"feature.\nCommit refused.") % fixed_bug)
3415
tag, bug_id = tokens
3123
3417
yield bugtracker.get_bug_url(tag, branch, bug_id)
3124
3418
except errors.UnknownBugTrackerAbbreviation:
3125
raise errors.BzrCommandError(
3126
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3419
raise errors.BzrCommandError(gettext(
3420
'Unrecognized bug %s. Commit refused.') % fixed_bug)
3127
3421
except errors.MalformedBugIdentifier, e:
3128
raise errors.BzrCommandError(
3129
"%s\nCommit refused." % (str(e),))
3422
raise errors.BzrCommandError(gettext(
3423
"%s\nCommit refused.") % (str(e),))
3131
3425
def run(self, message=None, file=None, verbose=False, selected_list=None,
3132
3426
unchanged=False, strict=False, local=False, fixes=None,
3133
author=None, show_diff=False, exclude=None, commit_time=None):
3427
author=None, show_diff=False, exclude=None, commit_time=None,
3134
3429
from bzrlib.errors import (
3135
3430
PointlessCommit,
3136
3431
ConflictsInTree,
3217
3507
# make_commit_message_template_encoded returns user encoding.
3218
3508
# We probably want to be using edit_commit_message instead to
3220
start_message = generate_commit_message_template(commit_obj)
3221
my_message = edit_commit_message_encoded(text,
3222
start_message=start_message)
3223
if my_message is None:
3224
raise errors.BzrCommandError("please specify a commit"
3225
" message with either --message or --file")
3226
if my_message == "":
3227
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 \"\"."))
3228
3523
return my_message
3230
3525
# The API permits a commit with a filter of [] to mean 'select nothing'
3238
3533
reporter=None, verbose=verbose, revprops=properties,
3239
3534
authors=author, timestamp=commit_stamp,
3240
3535
timezone=offset,
3241
exclude=tree.safe_relpath_files(exclude))
3536
exclude=tree.safe_relpath_files(exclude),
3242
3538
except PointlessCommit:
3243
raise errors.BzrCommandError("No changes to commit."
3244
" 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."))
3245
3542
except ConflictsInTree:
3246
raise errors.BzrCommandError('Conflicts detected in working '
3543
raise errors.BzrCommandError(gettext('Conflicts detected in working '
3247
3544
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3249
3546
except StrictCommitFailed:
3250
raise errors.BzrCommandError("Commit refused because there are"
3251
" unknown files in the working tree.")
3547
raise errors.BzrCommandError(gettext("Commit refused because there are"
3548
" unknown files in the working tree."))
3252
3549
except errors.BoundBranchOutOfDate, e:
3253
e.extra_help = ("\n"
3550
e.extra_help = (gettext("\n"
3254
3551
'To commit to master branch, run update and then commit.\n'
3255
3552
'You can also pass --local to commit to continue working '
3330
3627
class cmd_upgrade(Command):
3331
__doc__ = """Upgrade branch storage to current format.
3333
The check command or bzr developers may sometimes advise you to run
3334
this command. When the default format has changed you may also be warned
3335
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/.
3338
_see_also = ['check']
3660
_see_also = ['check', 'reconcile', 'formats']
3339
3661
takes_args = ['url?']
3340
3662
takes_options = [
3341
RegistryOption('format',
3342
help='Upgrade to a specific format. See "bzr help'
3343
' formats" for details.',
3344
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3345
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3346
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."),
3349
def run(self, url='.', format=None):
3675
def run(self, url='.', format=None, clean=False, dry_run=False):
3350
3676
from bzrlib.upgrade import upgrade
3351
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
3354
3686
class cmd_whoami(Command):
3747
4104
The source of the merge can be specified either in the form of a branch,
3748
4105
or in the form of a path to a file containing a merge directive generated
3749
4106
with bzr send. If neither is specified, the default is the upstream branch
3750
or the branch most recently merged using --remember.
3752
When merging a branch, by default the tip will be merged. To pick a different
3753
revision, pass --revision. If you specify two values, the first will be used as
3754
BASE and the second one as OTHER. Merging individual revisions, or a subset of
3755
available revisions, like this is commonly referred to as "cherrypicking".
3757
Revision numbers are always relative to the branch being merged.
3759
By default, bzr will try to merge in all new work from the other
3760
branch, automatically determining an appropriate base. If this
3761
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.
3763
4129
Merge will do its best to combine the changes in two branches, but there
3764
4130
are some kinds of problems only a human can fix. When it encounters those,
3768
4134
Use bzr resolve when you have fixed a problem. See also bzr conflicts.
3770
If there is no default branch set, the first merge will set it. After
3771
that, you can omit the branch to use the default. To change the
3772
default, use --remember. The value will only be saved if the remote
3773
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.
3775
4141
The results of the merge are placed into the destination working
3776
4142
directory, where they can be reviewed (with bzr diff), tested, and then
3777
4143
committed to record the result of the merge.
3779
4145
merge refuses to run if there are any uncommitted changes, unless
3780
--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
3781
4149
merge revision which has more than two parents.
3783
4151
If one would like to merge changes from the working tree of the other
3881
4253
mergeable = None
3883
4255
if uncommitted:
3884
raise errors.BzrCommandError('Cannot use --uncommitted'
3885
' with bundles or merge directives.')
4256
raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4257
' with bundles or merge directives.'))
3887
4259
if revision is not None:
3888
raise errors.BzrCommandError(
3889
'Cannot use -r with merge directives or bundles')
4260
raise errors.BzrCommandError(gettext(
4261
'Cannot use -r with merge directives or bundles'))
3890
4262
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3891
4263
mergeable, None)
3893
4265
if merger is None and uncommitted:
3894
4266
if revision is not None and len(revision) > 0:
3895
raise errors.BzrCommandError('Cannot use --uncommitted and'
3896
' --revision at the same time.')
4267
raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4268
' --revision at the same time.'))
3897
4269
merger = self.get_merger_from_uncommitted(tree, location, None)
3898
4270
allow_pending = False
3907
4279
self.sanity_check_merger(merger)
3908
4280
if (merger.base_rev_id == merger.other_rev_id and
3909
4281
merger.other_rev_id is not None):
3910
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:
3913
4292
if merger.interesting_files is not None:
3914
raise errors.BzrCommandError('Cannot pull individual files')
4293
raise errors.BzrCommandError(gettext('Cannot pull individual files'))
3915
4294
if (merger.base_rev_id == tree.last_revision()):
3916
4295
result = tree.pull(merger.other_branch, False,
3917
4296
merger.other_rev_id)
3918
4297
result.report(self.outf)
3920
4299
if merger.this_basis is None:
3921
raise errors.BzrCommandError(
4300
raise errors.BzrCommandError(gettext(
3922
4301
"This branch has no commits."
3923
" (perhaps you would prefer 'bzr pull')")
4302
" (perhaps you would prefer 'bzr pull')"))
3925
4304
return self._do_preview(merger)
3926
4305
elif interactive:
4024
4403
if other_revision_id is None:
4025
4404
other_revision_id = _mod_revision.ensure_null(
4026
4405
other_branch.last_revision())
4027
# Remember where we merge from
4028
if ((remember or tree.branch.get_submit_branch() is None) and
4029
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)))):
4030
4415
tree.branch.set_submit_branch(other_branch.base)
4031
_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)
4032
4419
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4033
4420
other_revision_id, base_revision_id, other_branch, base_branch)
4034
4421
if other_path != '':
4375
4765
theirs_only=False,
4376
4766
log_format=None, long=False, short=False, line=False,
4377
4767
show_ids=False, verbose=False, this=False, other=False,
4378
include_merges=False, revision=None, my_revision=None,
4768
include_merged=None, revision=None, my_revision=None,
4770
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
4380
4771
from bzrlib.missing import find_unmerged, iter_log_revisions
4381
4772
def message(s):
4382
4773
if not is_quiet():
4383
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
4386
4792
mine_only = this
4540
4950
@display_command
4541
4951
def run(self, verbose=False):
4542
import bzrlib.plugin
4543
from inspect import getdoc
4545
for name, plugin in bzrlib.plugin.plugins().items():
4546
version = plugin.__version__
4547
if version == 'unknown':
4549
name_ver = '%s %s' % (name, version)
4550
d = getdoc(plugin.module)
4552
doc = d.split('\n')[0]
4554
doc = '(no description)'
4555
result.append((name_ver, doc, plugin.path()))
4556
for name_ver, doc, path in sorted(result):
4557
self.outf.write("%s\n" % name_ver)
4558
self.outf.write(" %s\n" % doc)
4560
self.outf.write(" %s\n" % path)
4561
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)))
4564
4958
class cmd_testament(Command):
4626
5022
self.add_cleanup(branch.lock_read().unlock)
4627
5023
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4628
5024
self.add_cleanup(tree.lock_read().unlock)
5025
if wt is not None and revision is None:
4630
5026
file_id = wt.path2id(relpath)
4632
5028
file_id = tree.path2id(relpath)
4633
5029
if file_id is None:
4634
5030
raise errors.NotVersionedError(filename)
4635
file_version = tree.inventory[file_id].revision
4636
5031
if wt is not None and revision is None:
4637
5032
# If there is a tree and we're not annotating historical
4638
5033
# versions, annotate the working tree's content.
4639
5034
annotate_file_tree(wt, file_id, self.outf, long, all,
4640
5035
show_ids=show_ids)
4642
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)
4646
5041
class cmd_re_sign(Command):
4654
5049
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4655
5050
if revision_id_list is not None and revision is not None:
4656
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'))
4657
5052
if revision_id_list is None and revision is None:
4658
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'))
4659
5054
b = WorkingTree.open_containing(directory)[0].branch
4660
5055
self.add_cleanup(b.lock_write().unlock)
4661
5056
return self._run(b, revision_id_list, revision)
4663
5058
def _run(self, b, revision_id_list, revision):
4664
5059
import bzrlib.gpg as gpg
4665
gpg_strategy = gpg.GPGStrategy(b.get_config())
5060
gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
4666
5061
if revision_id_list is not None:
4667
5062
b.repository.start_write_group()
4731
5126
location = b.get_old_bound_location()
4732
5127
except errors.UpgradeRequired:
4733
raise errors.BzrCommandError('No location supplied. '
4734
'This format does not remember old locations.')
5128
raise errors.BzrCommandError(gettext('No location supplied. '
5129
'This format does not remember old locations.'))
4736
5131
if location is None:
4737
5132
if b.get_bound_location() is not None:
4738
raise errors.BzrCommandError('Branch is already bound')
5133
raise errors.BzrCommandError(gettext('Branch is already bound'))
4740
raise errors.BzrCommandError('No location supplied '
4741
'and no previous location known')
5135
raise errors.BzrCommandError(gettext('No location supplied '
5136
'and no previous location known'))
4742
5137
b_other = Branch.open(location)
4744
5139
b.bind(b_other)
4745
5140
except errors.DivergedBranches:
4746
raise errors.BzrCommandError('These branches have diverged.'
4747
' Try merging, and then bind again.')
5141
raise errors.BzrCommandError(gettext('These branches have diverged.'
5142
' Try merging, and then bind again.'))
4748
5143
if b.get_config().has_explicit_nickname():
4749
5144
b.nick = b_other.nick
4816
5212
self.add_cleanup(tree.lock_write().unlock)
4818
5214
self.add_cleanup(b.lock_write().unlock)
4819
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5215
return self._run(b, tree, dry_run, verbose, revision, force,
4821
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5218
def _run(self, b, tree, dry_run, verbose, revision, force, local,
4822
5220
from bzrlib.log import log_formatter, show_log
4823
5221
from bzrlib.uncommit import uncommit
4854
5252
end_revision=last_revno)
4857
self.outf.write('Dry-run, pretending to remove'
4858
' the above revisions.\n')
5255
self.outf.write(gettext('Dry-run, pretending to remove'
5256
' the above revisions.\n'))
4860
self.outf.write('The above revision(s) will be removed.\n')
5258
self.outf.write(gettext('The above revision(s) will be removed.\n'))
4863
5261
if not ui.ui_factory.confirm_action(
4864
'Uncommit these revisions',
5262
gettext(u'Uncommit these revisions'),
4865
5263
'bzrlib.builtins.uncommit',
4867
self.outf.write('Canceled\n')
5265
self.outf.write(gettext('Canceled\n'))
4870
5268
mutter('Uncommitting from {%s} to {%s}',
4871
5269
last_rev_id, rev_id)
4872
5270
uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
4873
revno=revno, local=local)
4874
self.outf.write('You can restore the old tip by running:\n'
4875
' 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)
4878
5276
class cmd_break_lock(Command):
4984
5384
return host, port
4986
5386
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5387
protocol=None, client_timeout=None):
4988
5388
from bzrlib import transport
4989
5389
if directory is None:
4990
5390
directory = os.getcwd()
4991
5391
if protocol is None:
4992
5392
protocol = transport.transport_server_registry.get()
4993
5393
host, port = self.get_host_and_port(port)
4994
url = urlutils.local_path_to_url(directory)
5394
url = transport.location_to_url(directory)
4995
5395
if not allow_writes:
4996
5396
url = 'readonly+' + url
4997
t = transport.get_transport(url)
4998
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)
5001
5413
class cmd_join(Command):
5407
5825
self.add_cleanup(branch.lock_write().unlock)
5409
5827
if tag_name is None:
5410
raise errors.BzrCommandError("No tag specified to delete.")
5828
raise errors.BzrCommandError(gettext("No tag specified to delete."))
5411
5829
branch.tags.delete_tag(tag_name)
5412
note('Deleted tag %s.' % tag_name)
5830
note(gettext('Deleted tag %s.') % tag_name)
5415
5833
if len(revision) != 1:
5416
raise errors.BzrCommandError(
5834
raise errors.BzrCommandError(gettext(
5417
5835
"Tags can only be placed on a single revision, "
5419
5837
revision_id = revision[0].as_revision_id(branch)
5421
5839
revision_id = branch.last_revision()
5422
5840
if tag_name is None:
5423
5841
tag_name = branch.automatic_tag_name(revision_id)
5424
5842
if tag_name is None:
5425
raise errors.BzrCommandError(
5426
"Please specify a tag name.")
5427
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):
5428
5850
raise errors.TagAlreadyExists(tag_name)
5429
branch.tags.set_tag(tag_name, revision_id)
5430
note('Created tag %s.' % 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)
5433
5861
class cmd_tags(Command):
5440
5868
takes_options = [
5441
5869
custom_help('directory',
5442
5870
help='Branch whose tags should be displayed.'),
5443
RegistryOption.from_kwargs('sort',
5871
RegistryOption('sort',
5444
5872
'Sort tags by different criteria.', title='Sorting',
5445
natural='Sort numeric substrings as numbers:'
5446
' suitable for version numbers. (default)',
5447
alpha='Sort tags lexicographically.',
5448
time='Sort tags chronologically.',
5873
lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5454
5879
@display_command
5880
def run(self, directory='.', sort=None, show_ids=False, revision=None):
5881
from bzrlib.tag import tag_sort_methods
5461
5882
branch, relpath = Branch.open_containing(directory)
5463
5884
tags = branch.tags.get_tag_dict().items()
5467
5888
self.add_cleanup(branch.lock_read().unlock)
5469
graph = branch.repository.get_graph()
5470
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5471
revid1, revid2 = rev1.rev_id, rev2.rev_id
5472
# only show revisions between revid1 and revid2 (inclusive)
5473
tags = [(tag, revid) for tag, revid in tags if
5474
graph.is_between(revid, revid1, revid2)]
5475
if sort == 'natural':
5476
def natural_sort_key(tag):
5477
return [f(s) for f,s in
5478
zip(itertools.cycle((unicode.lower,int)),
5479
re.split('([0-9]+)', tag[0]))]
5480
tags.sort(key=natural_sort_key)
5481
elif sort == 'alpha':
5483
elif sort == 'time':
5485
for tag, revid in tags:
5487
revobj = branch.repository.get_revision(revid)
5488
except errors.NoSuchRevision:
5489
timestamp = sys.maxint # place them at the end
5491
timestamp = revobj.timestamp
5492
timestamps[revid] = timestamp
5493
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()
5494
5895
if not show_ids:
5495
5896
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5496
5897
for index, (tag, revid) in enumerate(tags):
5507
5910
for tag, revspec in tags:
5508
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])
5511
5940
class cmd_reconfigure(Command):
5512
5941
__doc__ = """Reconfigure the type of a bzr directory.
5526
5955
takes_args = ['location?']
5527
5956
takes_options = [
5528
5957
RegistryOption.from_kwargs(
5530
title='Target type',
5531
help='The type to reconfigure the directory to.',
5960
help='The relation between branch and tree.',
5532
5961
value_switches=True, enum_switch=False,
5533
5962
branch='Reconfigure to be an unbound branch with no working tree.',
5534
5963
tree='Reconfigure to be an unbound branch with a working tree.',
5535
5964
checkout='Reconfigure to be a bound branch with a working tree.',
5536
5965
lightweight_checkout='Reconfigure to be a lightweight'
5537
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,
5538
5973
standalone='Reconfigure to be a standalone branch '
5539
5974
'(i.e. stop using shared repository).',
5540
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,
5541
5982
with_trees='Reconfigure repository to create '
5542
5983
'working trees on branches by default.',
5543
5984
with_no_trees='Reconfigure repository to not create '
5560
def run(self, location=None, target_type=None, bind_to=None, force=False,
5563
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)
5564
6005
if stacked_on and unstacked:
5565
raise BzrCommandError("Can't use both --stacked-on and --unstacked")
6006
raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
5566
6007
elif stacked_on is not None:
5567
6008
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5568
6009
elif unstacked:
5570
6011
# At the moment you can use --stacked-on and a different
5571
6012
# reconfiguration shape at the same time; there seems no good reason
5573
if target_type is None:
6014
if (tree_type is None and
6015
repository_type is None and
6016
repository_trees is None):
5574
6017
if stacked_on or unstacked:
5577
raise errors.BzrCommandError('No target configuration '
5579
elif target_type == 'branch':
6020
raise errors.BzrCommandError(gettext('No target configuration '
6022
reconfiguration = None
6023
if tree_type == 'branch':
5580
6024
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5581
elif target_type == 'tree':
6025
elif tree_type == 'tree':
5582
6026
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5583
elif target_type == 'checkout':
6027
elif tree_type == 'checkout':
5584
6028
reconfiguration = reconfigure.Reconfigure.to_checkout(
5585
6029
directory, bind_to)
5586
elif target_type == 'lightweight-checkout':
6030
elif tree_type == 'lightweight-checkout':
5587
6031
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5588
6032
directory, bind_to)
5589
elif target_type == 'use-shared':
6034
reconfiguration.apply(force)
6035
reconfiguration = None
6036
if repository_type == 'use-shared':
5590
6037
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5591
elif target_type == 'standalone':
6038
elif repository_type == 'standalone':
5592
6039
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5593
elif target_type == 'with-trees':
6041
reconfiguration.apply(force)
6042
reconfiguration = None
6043
if repository_trees == 'with-trees':
5594
6044
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5595
6045
directory, True)
5596
elif target_type == 'with-no-trees':
6046
elif repository_trees == 'with-no-trees':
5597
6047
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5598
6048
directory, False)
5599
reconfiguration.apply(force)
6050
reconfiguration.apply(force)
6051
reconfiguration = None
5602
6054
class cmd_switch(Command):
5651
6103
had_explicit_nick = False
5652
6104
if create_branch:
5653
6105
if branch is None:
5654
raise errors.BzrCommandError('cannot create branch without'
6106
raise errors.BzrCommandError(gettext('cannot create branch without'
5656
6108
to_location = directory_service.directories.dereference(
5658
6110
if '/' not in to_location and '\\' not in to_location:
5659
6111
# This path is meant to be relative to the existing branch
5660
6112
this_url = self._get_branch_location(control_dir)
5661
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))
5662
6127
to_branch = branch.bzrdir.sprout(to_location,
5663
6128
possible_transports=[branch.bzrdir.root_transport],
5664
6129
source_branch=branch).open_branch()
6131
# Perhaps it's a colocated branch?
5667
to_branch = Branch.open(to_location)
5668
except errors.NotBranchError:
5669
this_url = self._get_branch_location(control_dir)
5670
to_branch = Branch.open(
5671
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)))
5672
6142
if revision is not None:
5673
6143
revision = revision.as_revision_id(to_branch)
5674
6144
switch.switch(control_dir, to_branch, force, revision_id=revision)
5675
6145
if had_explicit_nick:
5676
6146
branch = control_dir.open_branch() #get the new branch!
5677
6147
branch.nick = to_branch.nick
5678
note('Switched to branch: %s',
6148
note(gettext('Switched to branch: %s'),
5679
6149
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5681
6151
def _get_branch_location(self, control_dir):
5790
6260
name = current_view
5793
raise errors.BzrCommandError(
5794
"Both --delete and a file list specified")
6263
raise errors.BzrCommandError(gettext(
6264
"Both --delete and a file list specified"))
5796
raise errors.BzrCommandError(
5797
"Both --delete and --switch specified")
6266
raise errors.BzrCommandError(gettext(
6267
"Both --delete and --switch specified"))
5799
6269
tree.views.set_view_info(None, {})
5800
self.outf.write("Deleted all views.\n")
6270
self.outf.write(gettext("Deleted all views.\n"))
5801
6271
elif name is None:
5802
raise errors.BzrCommandError("No current view to delete")
6272
raise errors.BzrCommandError(gettext("No current view to delete"))
5804
6274
tree.views.delete_view(name)
5805
self.outf.write("Deleted '%s' view.\n" % name)
6275
self.outf.write(gettext("Deleted '%s' view.\n") % name)
5808
raise errors.BzrCommandError(
5809
"Both --switch and a file list specified")
6278
raise errors.BzrCommandError(gettext(
6279
"Both --switch and a file list specified"))
5811
raise errors.BzrCommandError(
5812
"Both --switch and --all specified")
6281
raise errors.BzrCommandError(gettext(
6282
"Both --switch and --all specified"))
5813
6283
elif switch == 'off':
5814
6284
if current_view is None:
5815
raise errors.BzrCommandError("No current view to disable")
6285
raise errors.BzrCommandError(gettext("No current view to disable"))
5816
6286
tree.views.set_view_info(None, view_dict)
5817
self.outf.write("Disabled '%s' view.\n" % (current_view))
6287
self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
5819
6289
tree.views.set_view_info(switch, view_dict)
5820
6290
view_str = views.view_display_str(tree.views.lookup_view())
5821
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))
5824
self.outf.write('Views defined:\n')
6294
self.outf.write(gettext('Views defined:\n'))
5825
6295
for view in sorted(view_dict):
5826
6296
if view == current_view:
5830
6300
view_str = views.view_display_str(view_dict[view])
5831
6301
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5833
self.outf.write('No views defined.\n')
6303
self.outf.write(gettext('No views defined.\n'))
5834
6304
elif file_list:
5835
6305
if name is None:
5836
6306
# No name given and no current view set
5838
6308
elif name == 'off':
5839
raise errors.BzrCommandError(
5840
"Cannot change the 'off' pseudo view")
6309
raise errors.BzrCommandError(gettext(
6310
"Cannot change the 'off' pseudo view"))
5841
6311
tree.views.set_view(name, sorted(file_list))
5842
6312
view_str = views.view_display_str(tree.views.lookup_view())
5843
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))
5845
6315
# list the files
5846
6316
if name is None:
5847
6317
# No name given and no current view set
5848
self.outf.write('No current view.\n')
6318
self.outf.write(gettext('No current view.\n'))
5850
6320
view_str = views.view_display_str(tree.views.lookup_view(name))
5851
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))
5854
6324
class cmd_hooks(Command):
6098
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)
6101
6591
def _register_lazy_builtins():
6102
6592
# register lazy builtins from other modules; called at startup and should
6103
6593
# be only called once.
6108
6598
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6109
6599
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6110
6600
('cmd_conflicts', [], 'bzrlib.conflicts'),
6111
('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'),
6112
6604
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6114
6606
builtin_command_registry.register_lazy(name, aliases, module_name)