327
337
def run(self, revision_id=None, revision=None, directory=u'.'):
328
338
if revision_id is not None and revision is not None:
329
raise errors.BzrCommandError('You can only supply one of'
330
' revision_id or --revision')
339
raise errors.BzrCommandError(gettext('You can only supply one of'
340
' revision_id or --revision'))
331
341
if revision_id is None and revision is None:
332
raise errors.BzrCommandError('You must supply either'
333
' --revision or a revision_id')
342
raise errors.BzrCommandError(gettext('You must supply either'
343
' --revision or a revision_id'))
335
b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
345
b = controldir.ControlDir.open_containing_tree_or_branch(directory)[1]
337
347
revisions = b.repository.revisions
338
348
if revisions is None:
339
raise errors.BzrCommandError('Repository %r does not support '
340
'access to raw revision texts')
349
raise errors.BzrCommandError(gettext('Repository %r does not support '
350
'access to raw revision texts'))
342
352
b.repository.lock_read()
550
559
_see_also = ['info']
551
560
takes_args = ['location?']
552
561
takes_options = [
553
Option('tree', help='Show revno of working tree'),
562
Option('tree', help='Show revno of working tree.'),
557
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"))
560
574
wt = WorkingTree.open_containing(location)[0]
561
575
self.add_cleanup(wt.lock_read().unlock)
562
576
except (errors.NoWorkingTree, errors.NotLocalUrl):
563
577
raise errors.NoWorkingTree(location)
564
579
revid = wt.last_revision()
566
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
567
except errors.NoSuchRevision:
569
revno = ".".join(str(n) for n in revno_t)
571
581
b = Branch.open_containing(location)[0]
572
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)
574
596
self.cleanup_now()
575
self.outf.write(str(revno) + '\n')
597
self.outf.write(revno + '\n')
578
600
class cmd_revision_info(Command):
726
756
takes_args = ['dir+']
760
help='No error if existing, make parent directories as needed.',
727
764
encoding_type = 'replace'
729
def run(self, dir_list):
731
wt, dd = WorkingTree.open_containing(d)
732
base = os.path.dirname(dd)
733
id = wt.path2id(base)
737
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:
739
raise errors.NotVersionedError(path=base)
792
add_file(wt, relpath)
794
self.outf.write(gettext('added %s\n') % dir)
742
797
class cmd_relpath(Command):
849
904
return self.run_auto(names_list, after, dry_run)
851
raise errors.BzrCommandError('--dry-run requires --auto.')
906
raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
852
907
if names_list is None:
854
909
if len(names_list) < 2:
855
raise errors.BzrCommandError("missing file argument")
910
raise errors.BzrCommandError(gettext("missing file argument"))
856
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"))
857
915
self.add_cleanup(tree.lock_tree_write().unlock)
858
916
self._run(tree, names_list, rel_names, after)
860
918
def run_auto(self, names_list, after, dry_run):
861
919
if names_list is not None and len(names_list) > 1:
862
raise errors.BzrCommandError('Only one path may be specified to'
920
raise errors.BzrCommandError(gettext('Only one path may be specified to'
865
raise errors.BzrCommandError('--after cannot be specified with'
923
raise errors.BzrCommandError(gettext('--after cannot be specified with'
867
925
work_tree, file_list = WorkingTree.open_containing_paths(
868
926
names_list, default_directory='.')
869
927
self.add_cleanup(work_tree.lock_tree_write().unlock)
1177
1242
# error by the feedback given to them. RBC 20080227.
1178
1243
stacked_on = parent_url
1179
1244
if not stacked_on:
1180
raise errors.BzrCommandError(
1181
"Could not determine branch to refer to.")
1245
raise errors.BzrCommandError(gettext(
1246
"Could not determine branch to refer to."))
1183
1248
# Get the destination location
1184
1249
if location is None:
1185
1250
stored_loc = br_from.get_push_location()
1186
1251
if stored_loc is None:
1187
raise errors.BzrCommandError(
1188
"No push location known or specified.")
1252
raise errors.BzrCommandError(gettext(
1253
"No push location known or specified."))
1190
1255
display_url = urlutils.unescape_for_display(stored_loc,
1191
1256
self.outf.encoding)
1192
self.outf.write("Using saved push location: %s\n" % display_url)
1257
note(gettext("Using saved push location: %s") % display_url)
1193
1258
location = stored_loc
1195
1260
_show_push_branch(br_from, revision_id, location, self.outf,
1273
1338
revision_id = br_from.last_revision()
1274
1339
if to_location is None:
1275
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)
1276
1343
to_transport = transport.get_transport(to_location)
1278
1345
to_transport.mkdir('.')
1279
1346
except errors.FileExists:
1280
if not use_existing_dir:
1281
raise errors.BzrCommandError('Target directory "%s" '
1282
'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)
1285
bzrdir.BzrDir.open_from_transport(to_transport)
1358
to_dir.open_branch()
1286
1359
except errors.NotBranchError:
1289
1362
raise errors.AlreadyBranchError(to_location)
1290
1363
except errors.NoSuchFile:
1291
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1364
raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
1294
# preserve whatever source format we have.
1295
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1296
possible_transports=[to_transport],
1297
accelerator_tree=accelerator_tree,
1298
hardlink=hardlink, stacked=stacked,
1299
force_new_repo=standalone,
1300
create_tree_if_local=not no_tree,
1301
source_branch=br_from)
1302
branch = dir.open_branch()
1303
except errors.NoSuchRevision:
1304
to_transport.delete_tree('.')
1305
msg = "The branch %s has no revision %s." % (from_location,
1307
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)
1308
1388
_merge_tags_if_possible(br_from, branch)
1309
1389
# If the source branch is stacked, the new branch may
1310
1390
# be stacked whether we asked for that explicitly or not.
1311
1391
# We therefore need a try/except here and not just 'if stacked:'
1313
note('Created new stacked branch referring to %s.' %
1393
note(gettext('Created new stacked branch referring to %s.') %
1314
1394
branch.get_stacked_on_url())
1315
1395
except (errors.NotStacked, errors.UnstackableBranchFormat,
1316
1396
errors.UnstackableRepositoryFormat), e:
1317
note('Branched %d revision(s).' % branch.revno())
1397
note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
1319
1399
# Bind to the parent
1320
1400
parent_branch = Branch.open(from_location)
1321
1401
branch.bind(parent_branch)
1322
note('New branch bound to %s' % from_location)
1402
note(gettext('New branch bound to %s') % from_location)
1324
1404
# Switch to the new branch
1325
1405
wt, _ = WorkingTree.open_containing('.')
1326
1406
_mod_switch.switch(wt.bzrdir, branch)
1327
note('Switched to branch: %s',
1407
note(gettext('Switched to branch: %s'),
1328
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))
1331
1444
class cmd_checkout(Command):
1332
1445
__doc__ = """Create a new checkout of an existing branch.
1435
1548
class cmd_update(Command):
1436
__doc__ = """Update a tree to have the latest code committed to its branch.
1438
This will perform a merge into the working tree, and may generate
1439
conflicts. If you have any local changes, you will still
1440
need to commit them after the update for the update to be complete.
1442
If you want to discard your local changes, you can just do a
1443
'bzr revert' instead of 'bzr commit' after the update.
1445
If you want to restore a file that has been removed locally, use
1446
'bzr revert' instead of 'bzr update'.
1448
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
1449
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.
1452
1578
_see_also = ['pull', 'working-trees', 'status-flags']
1458
1584
aliases = ['up']
1460
def run(self, dir='.', revision=None, show_base=None):
1586
def run(self, dir=None, revision=None, show_base=None):
1461
1587
if revision is not None and len(revision) != 1:
1462
raise errors.BzrCommandError(
1463
"bzr update --revision takes exactly one revision")
1464
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"))
1465
1599
branch = tree.branch
1466
1600
possible_transports = []
1467
1601
master = branch.get_master_branch(
1506
1640
old_tip=old_tip,
1507
1641
show_base=show_base)
1508
1642
except errors.NoSuchRevision, e:
1509
raise errors.BzrCommandError(
1643
raise errors.BzrCommandError(gettext(
1510
1644
"branch has no revision %s\n"
1511
1645
"bzr update --revision only works"
1512
" for a revision in the branch history"
1646
" for a revision in the branch history")
1513
1647
% (e.revision))
1514
1648
revno = tree.branch.revision_id_to_dotted_revno(
1515
1649
_mod_revision.ensure_null(tree.last_revision()))
1516
note('Updated to revision %s of branch %s' %
1517
('.'.join(map(str, revno)), branch_location))
1650
note(gettext('Updated to revision {0} of branch {1}').format(
1651
'.'.join(map(str, revno)), branch_location))
1518
1652
parent_ids = tree.get_parent_ids()
1519
1653
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1520
note('Your local commits will now show as pending merges with '
1521
"'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'."))
1522
1656
if conflicts != 0:
2390
2533
Option('show-diff',
2391
2534
short_name='p',
2392
2535
help='Show changes made in each revision as a patch.'),
2393
Option('include-merges',
2536
Option('include-merged',
2394
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.'),
2395
2542
Option('exclude-common-ancestry',
2396
2543
help='Display only the revisions that are not part'
2397
' of both ancestries (require -rX..Y)'
2544
' of both ancestries (require -rX..Y).'
2399
2546
Option('signatures',
2400
help='Show digital signature validity'),
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 '
2402
2570
encoding_type = 'replace'
2424
2599
_get_info_for_log_files,
2426
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
2427
2617
if (exclude_common_ancestry
2428
2618
and (revision is None or len(revision) != 2)):
2429
raise errors.BzrCommandError(
2430
'--exclude-common-ancestry requires -r with two revisions')
2619
raise errors.BzrCommandError(gettext(
2620
'--exclude-common-ancestry requires -r with two revisions'))
2432
2622
if levels is None:
2435
raise errors.BzrCommandError(
2436
'--levels and --include-merges are mutually exclusive')
2625
raise errors.BzrCommandError(gettext(
2626
'{0} and {1} are mutually exclusive').format(
2627
'--levels', '--include-merged'))
2438
2629
if change is not None:
2439
2630
if len(change) > 1:
2440
2631
raise errors.RangeInChangeOption()
2441
2632
if revision is not None:
2442
raise errors.BzrCommandError(
2443
'--revision and --change are mutually exclusive')
2633
raise errors.BzrCommandError(gettext(
2634
'{0} and {1} are mutually exclusive').format(
2635
'--revision', '--change'))
2445
2637
revision = change
2839
3043
self.outf.write("%s\n" % pattern)
2841
3045
if not name_pattern_list:
2842
raise errors.BzrCommandError("ignore requires at least one "
2843
"NAME_PATTERN or --default-rules.")
3046
raise errors.BzrCommandError(gettext("ignore requires at least one "
3047
"NAME_PATTERN or --default-rules."))
2844
3048
name_pattern_list = [globbing.normalize_pattern(p)
2845
3049
for p in name_pattern_list]
2846
3050
bad_patterns = ''
3051
bad_patterns_count = 0
2847
3052
for p in name_pattern_list:
2848
3053
if not globbing.Globster.is_pattern_valid(p):
3054
bad_patterns_count += 1
2849
3055
bad_patterns += ('\n %s' % p)
2850
3056
if bad_patterns:
2851
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)
2852
3060
ui.ui_factory.show_error(msg)
2853
3061
raise errors.InvalidPattern('')
2854
3062
for name_pattern in name_pattern_list:
2855
3063
if (name_pattern[0] == '/' or
2856
3064
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2857
raise errors.BzrCommandError(
2858
"NAME_PATTERN should not be an absolute path")
3065
raise errors.BzrCommandError(gettext(
3066
"NAME_PATTERN should not be an absolute path"))
2859
3067
tree, relpath = WorkingTree.open_containing(directory)
2860
3068
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2861
3069
ignored = globbing.Globster(name_pattern_list)
2965
3173
Option('per-file-timestamps',
2966
3174
help='Set modification time of files to that of the last '
2967
3175
'revision in which it was changed.'),
3176
Option('uncommitted',
3177
help='Export the working tree contents rather than that of the '
2969
3180
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2970
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3181
root=None, filters=False, per_file_timestamps=False, uncommitted=False,
2971
3183
from bzrlib.export import export
2973
3185
if branch_or_subdir is None:
2974
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"))
2978
b, subdir = Branch.open_containing(branch_or_subdir)
2981
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)
2983
export(rev_tree, dest, format, root, subdir, filtered=filters,
3201
export(export_tree, dest, format, root, subdir, filtered=filters,
2984
3202
per_file_timestamps=per_file_timestamps)
2985
3203
except errors.NoSuchExportFormat, e:
2986
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3204
raise errors.BzrCommandError(
3205
gettext('Unsupported export format: %s') % e.format)
2989
3208
class cmd_cat(Command):
3027
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
3029
3252
if name_from_revision:
3030
3253
# Try in revision if requested
3031
3254
if old_file_id is None:
3032
raise errors.BzrCommandError(
3033
"%r is not present in revision %s" % (
3255
raise errors.BzrCommandError(gettext(
3256
"{0!r} is not present in revision {1}").format(
3034
3257
filename, rev_tree.get_revision_id()))
3036
content = rev_tree.get_file_text(old_file_id)
3259
actual_file_id = old_file_id
3038
3261
cur_file_id = tree.path2id(relpath)
3040
if cur_file_id is not None:
3041
# Then try with the actual file id
3043
content = rev_tree.get_file_text(cur_file_id)
3045
except errors.NoSuchId:
3046
# The actual file id didn't exist at that time
3048
if not found and old_file_id is not None:
3049
# Finally try with the old file id
3050
content = rev_tree.get_file_text(old_file_id)
3053
# Can't be found anywhere
3054
raise errors.BzrCommandError(
3055
"%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(
3056
3269
filename, rev_tree.get_revision_id()))
3058
from bzrlib.filters import (
3059
ContentFilterContext,
3060
filtered_output_bytes,
3062
filters = rev_tree._content_filter_stack(relpath)
3063
chunks = content.splitlines(True)
3064
content = filtered_output_bytes(chunks, filters,
3065
ContentFilterContext(relpath, rev_tree))
3067
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)
3070
self.outf.write(content)
3276
content = rev_tree.get_file_text(actual_file_id)
3278
self.outf.write(content)
3073
3281
class cmd_local_time_offset(Command):
3180
3388
aliases = ['ci', 'checkin']
3182
3390
def _iter_bug_fix_urls(self, fixes, branch):
3391
default_bugtracker = None
3183
3392
# Configure the properties for bug fixing attributes.
3184
3393
for fixed_bug in fixes:
3185
3394
tokens = fixed_bug.split(':')
3186
if len(tokens) != 2:
3187
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(
3188
3411
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3189
3412
"See \"bzr help bugs\" for more information on this "
3190
"feature.\nCommit refused." % fixed_bug)
3191
tag, bug_id = tokens
3413
"feature.\nCommit refused.") % fixed_bug)
3415
tag, bug_id = tokens
3193
3417
yield bugtracker.get_bug_url(tag, branch, bug_id)
3194
3418
except errors.UnknownBugTrackerAbbreviation:
3195
raise errors.BzrCommandError(
3196
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3419
raise errors.BzrCommandError(gettext(
3420
'Unrecognized bug %s. Commit refused.') % fixed_bug)
3197
3421
except errors.MalformedBugIdentifier, e:
3198
raise errors.BzrCommandError(
3199
"%s\nCommit refused." % (str(e),))
3422
raise errors.BzrCommandError(gettext(
3423
"%s\nCommit refused.") % (str(e),))
3201
3425
def run(self, message=None, file=None, verbose=False, selected_list=None,
3202
3426
unchanged=False, strict=False, local=False, fixes=None,
3309
3536
exclude=tree.safe_relpath_files(exclude),
3311
3538
except PointlessCommit:
3312
raise errors.BzrCommandError("No changes to commit."
3539
raise errors.BzrCommandError(gettext("No changes to commit."
3313
3540
" Please 'bzr add' the files you want to commit, or use"
3314
" --unchanged to force an empty commit.")
3541
" --unchanged to force an empty commit."))
3315
3542
except ConflictsInTree:
3316
raise errors.BzrCommandError('Conflicts detected in working '
3543
raise errors.BzrCommandError(gettext('Conflicts detected in working '
3317
3544
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3319
3546
except StrictCommitFailed:
3320
raise errors.BzrCommandError("Commit refused because there are"
3321
" unknown files in the working tree.")
3547
raise errors.BzrCommandError(gettext("Commit refused because there are"
3548
" unknown files in the working tree."))
3322
3549
except errors.BoundBranchOutOfDate, e:
3323
e.extra_help = ("\n"
3550
e.extra_help = (gettext("\n"
3324
3551
'To commit to master branch, run update and then commit.\n'
3325
3552
'You can also pass --local to commit to continue working '
4009
4253
mergeable = None
4011
4255
if uncommitted:
4012
raise errors.BzrCommandError('Cannot use --uncommitted'
4013
' with bundles or merge directives.')
4256
raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4257
' with bundles or merge directives.'))
4015
4259
if revision is not None:
4016
raise errors.BzrCommandError(
4017
'Cannot use -r with merge directives or bundles')
4260
raise errors.BzrCommandError(gettext(
4261
'Cannot use -r with merge directives or bundles'))
4018
4262
merger, verified = _mod_merge.Merger.from_mergeable(tree,
4019
4263
mergeable, None)
4021
4265
if merger is None and uncommitted:
4022
4266
if revision is not None and len(revision) > 0:
4023
raise errors.BzrCommandError('Cannot use --uncommitted and'
4024
' --revision at the same time.')
4267
raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4268
' --revision at the same time.'))
4025
4269
merger = self.get_merger_from_uncommitted(tree, location, None)
4026
4270
allow_pending = False
4040
4284
if merger.interesting_files:
4041
4285
if not merger.other_tree.has_filename(
4042
4286
merger.interesting_files[0]):
4043
note("merger: " + str(merger))
4287
note(gettext("merger: ") + str(merger))
4044
4288
raise errors.PathsDoNotExist([location])
4045
note('Nothing to do.')
4289
note(gettext('Nothing to do.'))
4047
4291
if pull and not preview:
4048
4292
if merger.interesting_files is not None:
4049
raise errors.BzrCommandError('Cannot pull individual files')
4293
raise errors.BzrCommandError(gettext('Cannot pull individual files'))
4050
4294
if (merger.base_rev_id == tree.last_revision()):
4051
4295
result = tree.pull(merger.other_branch, False,
4052
4296
merger.other_rev_id)
4053
4297
result.report(self.outf)
4055
4299
if merger.this_basis is None:
4056
raise errors.BzrCommandError(
4300
raise errors.BzrCommandError(gettext(
4057
4301
"This branch has no commits."
4058
" (perhaps you would prefer 'bzr pull')")
4302
" (perhaps you would prefer 'bzr pull')"))
4060
4304
return self._do_preview(merger)
4061
4305
elif interactive:
4519
4765
theirs_only=False,
4520
4766
log_format=None, long=False, short=False, line=False,
4521
4767
show_ids=False, verbose=False, this=False, other=False,
4522
include_merges=False, revision=None, my_revision=None,
4768
include_merged=None, revision=None, my_revision=None,
4770
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
4524
4771
from bzrlib.missing import find_unmerged, iter_log_revisions
4525
4772
def message(s):
4526
4773
if not is_quiet():
4527
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
4530
4792
mine_only = this
4783
5049
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4784
5050
if revision_id_list is not None and revision is not None:
4785
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'))
4786
5052
if revision_id_list is None and revision is None:
4787
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'))
4788
5054
b = WorkingTree.open_containing(directory)[0].branch
4789
5055
self.add_cleanup(b.lock_write().unlock)
4790
5056
return self._run(b, revision_id_list, revision)
4792
5058
def _run(self, b, revision_id_list, revision):
4793
5059
import bzrlib.gpg as gpg
4794
gpg_strategy = gpg.GPGStrategy(b.get_config())
5060
gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
4795
5061
if revision_id_list is not None:
4796
5062
b.repository.start_write_group()
4860
5126
location = b.get_old_bound_location()
4861
5127
except errors.UpgradeRequired:
4862
raise errors.BzrCommandError('No location supplied. '
4863
'This format does not remember old locations.')
5128
raise errors.BzrCommandError(gettext('No location supplied. '
5129
'This format does not remember old locations.'))
4865
5131
if location is None:
4866
5132
if b.get_bound_location() is not None:
4867
raise errors.BzrCommandError('Branch is already bound')
5133
raise errors.BzrCommandError(gettext('Branch is already bound'))
4869
raise errors.BzrCommandError('No location supplied '
4870
'and no previous location known')
5135
raise errors.BzrCommandError(gettext('No location supplied '
5136
'and no previous location known'))
4871
5137
b_other = Branch.open(location)
4873
5139
b.bind(b_other)
4874
5140
except errors.DivergedBranches:
4875
raise errors.BzrCommandError('These branches have diverged.'
4876
' Try merging, and then bind again.')
5141
raise errors.BzrCommandError(gettext('These branches have diverged.'
5142
' Try merging, and then bind again.'))
4877
5143
if b.get_config().has_explicit_nickname():
4878
5144
b.nick = b_other.nick
4945
5212
self.add_cleanup(tree.lock_write().unlock)
4947
5214
self.add_cleanup(b.lock_write().unlock)
4948
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5215
return self._run(b, tree, dry_run, verbose, revision, force,
4950
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5218
def _run(self, b, tree, dry_run, verbose, revision, force, local,
4951
5220
from bzrlib.log import log_formatter, show_log
4952
5221
from bzrlib.uncommit import uncommit
4983
5252
end_revision=last_revno)
4986
self.outf.write('Dry-run, pretending to remove'
4987
' the above revisions.\n')
5255
self.outf.write(gettext('Dry-run, pretending to remove'
5256
' the above revisions.\n'))
4989
self.outf.write('The above revision(s) will be removed.\n')
5258
self.outf.write(gettext('The above revision(s) will be removed.\n'))
4992
5261
if not ui.ui_factory.confirm_action(
4993
u'Uncommit these revisions',
5262
gettext(u'Uncommit these revisions'),
4994
5263
'bzrlib.builtins.uncommit',
4996
self.outf.write('Canceled\n')
5265
self.outf.write(gettext('Canceled\n'))
4999
5268
mutter('Uncommitting from {%s} to {%s}',
5000
5269
last_rev_id, rev_id)
5001
5270
uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
5002
revno=revno, local=local)
5003
self.outf.write('You can restore the old tip by running:\n'
5004
' 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)
5007
5276
class cmd_break_lock(Command):
5113
5384
return host, port
5115
5386
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5387
protocol=None, client_timeout=None):
5117
5388
from bzrlib import transport
5118
5389
if directory is None:
5119
5390
directory = os.getcwd()
5120
5391
if protocol is None:
5121
5392
protocol = transport.transport_server_registry.get()
5122
5393
host, port = self.get_host_and_port(port)
5123
url = urlutils.local_path_to_url(directory)
5394
url = transport.location_to_url(directory)
5124
5395
if not allow_writes:
5125
5396
url = 'readonly+' + url
5126
t = transport.get_transport(url)
5127
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)
5130
5413
class cmd_join(Command):
5542
5825
self.add_cleanup(branch.lock_write().unlock)
5544
5827
if tag_name is None:
5545
raise errors.BzrCommandError("No tag specified to delete.")
5828
raise errors.BzrCommandError(gettext("No tag specified to delete."))
5546
5829
branch.tags.delete_tag(tag_name)
5547
note('Deleted tag %s.' % tag_name)
5830
note(gettext('Deleted tag %s.') % tag_name)
5550
5833
if len(revision) != 1:
5551
raise errors.BzrCommandError(
5834
raise errors.BzrCommandError(gettext(
5552
5835
"Tags can only be placed on a single revision, "
5554
5837
revision_id = revision[0].as_revision_id(branch)
5556
5839
revision_id = branch.last_revision()
5557
5840
if tag_name is None:
5558
5841
tag_name = branch.automatic_tag_name(revision_id)
5559
5842
if tag_name is None:
5560
raise errors.BzrCommandError(
5561
"Please specify a tag name.")
5562
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):
5563
5850
raise errors.TagAlreadyExists(tag_name)
5564
branch.tags.set_tag(tag_name, revision_id)
5565
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)
5568
5861
class cmd_tags(Command):
5619
5910
for tag, revspec in tags:
5620
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])
5623
5940
class cmd_reconfigure(Command):
5624
5941
__doc__ = """Reconfigure the type of a bzr directory.
5638
5955
takes_args = ['location?']
5639
5956
takes_options = [
5640
5957
RegistryOption.from_kwargs(
5642
title='Target type',
5643
help='The type to reconfigure the directory to.',
5960
help='The relation between branch and tree.',
5644
5961
value_switches=True, enum_switch=False,
5645
5962
branch='Reconfigure to be an unbound branch with no working tree.',
5646
5963
tree='Reconfigure to be an unbound branch with a working tree.',
5647
5964
checkout='Reconfigure to be a bound branch with a working tree.',
5648
5965
lightweight_checkout='Reconfigure to be a lightweight'
5649
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,
5650
5973
standalone='Reconfigure to be a standalone branch '
5651
5974
'(i.e. stop using shared repository).',
5652
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,
5653
5982
with_trees='Reconfigure repository to create '
5654
5983
'working trees on branches by default.',
5655
5984
with_no_trees='Reconfigure repository to not create '
5672
def run(self, location=None, target_type=None, bind_to=None, force=False,
5675
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)
5676
6005
if stacked_on and unstacked:
5677
raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
6006
raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
5678
6007
elif stacked_on is not None:
5679
6008
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5680
6009
elif unstacked:
5682
6011
# At the moment you can use --stacked-on and a different
5683
6012
# reconfiguration shape at the same time; there seems no good reason
5685
if target_type is None:
6014
if (tree_type is None and
6015
repository_type is None and
6016
repository_trees is None):
5686
6017
if stacked_on or unstacked:
5689
raise errors.BzrCommandError('No target configuration '
5691
elif target_type == 'branch':
6020
raise errors.BzrCommandError(gettext('No target configuration '
6022
reconfiguration = None
6023
if tree_type == 'branch':
5692
6024
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5693
elif target_type == 'tree':
6025
elif tree_type == 'tree':
5694
6026
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5695
elif target_type == 'checkout':
6027
elif tree_type == 'checkout':
5696
6028
reconfiguration = reconfigure.Reconfigure.to_checkout(
5697
6029
directory, bind_to)
5698
elif target_type == 'lightweight-checkout':
6030
elif tree_type == 'lightweight-checkout':
5699
6031
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5700
6032
directory, bind_to)
5701
elif target_type == 'use-shared':
6034
reconfiguration.apply(force)
6035
reconfiguration = None
6036
if repository_type == 'use-shared':
5702
6037
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5703
elif target_type == 'standalone':
6038
elif repository_type == 'standalone':
5704
6039
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5705
elif target_type == 'with-trees':
6041
reconfiguration.apply(force)
6042
reconfiguration = None
6043
if repository_trees == 'with-trees':
5706
6044
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5707
6045
directory, True)
5708
elif target_type == 'with-no-trees':
6046
elif repository_trees == 'with-no-trees':
5709
6047
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5710
6048
directory, False)
5711
reconfiguration.apply(force)
6050
reconfiguration.apply(force)
6051
reconfiguration = None
5714
6054
class cmd_switch(Command):
5763
6103
had_explicit_nick = False
5764
6104
if create_branch:
5765
6105
if branch is None:
5766
raise errors.BzrCommandError('cannot create branch without'
6106
raise errors.BzrCommandError(gettext('cannot create branch without'
5768
6108
to_location = directory_service.directories.dereference(
5770
6110
if '/' not in to_location and '\\' not in to_location:
5771
6111
# This path is meant to be relative to the existing branch
5772
6112
this_url = self._get_branch_location(control_dir)
5773
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))
5774
6127
to_branch = branch.bzrdir.sprout(to_location,
5775
6128
possible_transports=[branch.bzrdir.root_transport],
5776
6129
source_branch=branch).open_branch()
6131
# Perhaps it's a colocated branch?
5779
to_branch = Branch.open(to_location)
5780
except errors.NotBranchError:
5781
this_url = self._get_branch_location(control_dir)
5782
to_branch = Branch.open(
5783
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)))
5784
6142
if revision is not None:
5785
6143
revision = revision.as_revision_id(to_branch)
5786
6144
switch.switch(control_dir, to_branch, force, revision_id=revision)
5787
6145
if had_explicit_nick:
5788
6146
branch = control_dir.open_branch() #get the new branch!
5789
6147
branch.nick = to_branch.nick
5790
note('Switched to branch: %s',
6148
note(gettext('Switched to branch: %s'),
5791
6149
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5793
6151
def _get_branch_location(self, control_dir):
5902
6260
name = current_view
5905
raise errors.BzrCommandError(
5906
"Both --delete and a file list specified")
6263
raise errors.BzrCommandError(gettext(
6264
"Both --delete and a file list specified"))
5908
raise errors.BzrCommandError(
5909
"Both --delete and --switch specified")
6266
raise errors.BzrCommandError(gettext(
6267
"Both --delete and --switch specified"))
5911
6269
tree.views.set_view_info(None, {})
5912
self.outf.write("Deleted all views.\n")
6270
self.outf.write(gettext("Deleted all views.\n"))
5913
6271
elif name is None:
5914
raise errors.BzrCommandError("No current view to delete")
6272
raise errors.BzrCommandError(gettext("No current view to delete"))
5916
6274
tree.views.delete_view(name)
5917
self.outf.write("Deleted '%s' view.\n" % name)
6275
self.outf.write(gettext("Deleted '%s' view.\n") % name)
5920
raise errors.BzrCommandError(
5921
"Both --switch and a file list specified")
6278
raise errors.BzrCommandError(gettext(
6279
"Both --switch and a file list specified"))
5923
raise errors.BzrCommandError(
5924
"Both --switch and --all specified")
6281
raise errors.BzrCommandError(gettext(
6282
"Both --switch and --all specified"))
5925
6283
elif switch == 'off':
5926
6284
if current_view is None:
5927
raise errors.BzrCommandError("No current view to disable")
6285
raise errors.BzrCommandError(gettext("No current view to disable"))
5928
6286
tree.views.set_view_info(None, view_dict)
5929
self.outf.write("Disabled '%s' view.\n" % (current_view))
6287
self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
5931
6289
tree.views.set_view_info(switch, view_dict)
5932
6290
view_str = views.view_display_str(tree.views.lookup_view())
5933
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))
5936
self.outf.write('Views defined:\n')
6294
self.outf.write(gettext('Views defined:\n'))
5937
6295
for view in sorted(view_dict):
5938
6296
if view == current_view:
5942
6300
view_str = views.view_display_str(view_dict[view])
5943
6301
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5945
self.outf.write('No views defined.\n')
6303
self.outf.write(gettext('No views defined.\n'))
5946
6304
elif file_list:
5947
6305
if name is None:
5948
6306
# No name given and no current view set
5950
6308
elif name == 'off':
5951
raise errors.BzrCommandError(
5952
"Cannot change the 'off' pseudo view")
6309
raise errors.BzrCommandError(gettext(
6310
"Cannot change the 'off' pseudo view"))
5953
6311
tree.views.set_view(name, sorted(file_list))
5954
6312
view_str = views.view_display_str(tree.views.lookup_view())
5955
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))
5957
6315
# list the files
5958
6316
if name is None:
5959
6317
# No name given and no current view set
5960
self.outf.write('No current view.\n')
6318
self.outf.write(gettext('No current view.\n'))
5962
6320
view_str = views.view_display_str(tree.views.lookup_view(name))
5963
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))
5966
6324
class cmd_hooks(Command):