327
339
def run(self, revision_id=None, revision=None, directory=u'.'):
328
340
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')
341
raise errors.BzrCommandError(gettext('You can only supply one of'
342
' revision_id or --revision'))
331
343
if revision_id is None and revision is None:
332
raise errors.BzrCommandError('You must supply either'
333
' --revision or a revision_id')
344
raise errors.BzrCommandError(gettext('You must supply either'
345
' --revision or a revision_id'))
335
b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
347
b = controldir.ControlDir.open_containing_tree_or_branch(directory)[1]
337
349
revisions = b.repository.revisions
338
350
if revisions is None:
339
raise errors.BzrCommandError('Repository %r does not support '
340
'access to raw revision texts')
351
raise errors.BzrCommandError(gettext('Repository %r does not support '
352
'access to raw revision texts'))
342
354
b.repository.lock_read()
550
561
_see_also = ['info']
551
562
takes_args = ['location?']
552
563
takes_options = [
553
Option('tree', help='Show revno of working tree'),
564
Option('tree', help='Show revno of working tree.'),
557
def run(self, tree=False, location=u'.'):
569
def run(self, tree=False, location=u'.', revision=None):
570
if revision is not None and tree:
571
raise errors.BzrCommandError(gettext("--tree and --revision can "
572
"not be used together"))
560
576
wt = WorkingTree.open_containing(location)[0]
561
577
self.add_cleanup(wt.lock_read().unlock)
562
578
except (errors.NoWorkingTree, errors.NotLocalUrl):
563
579
raise errors.NoWorkingTree(location)
564
581
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
583
b = Branch.open_containing(location)[0]
572
584
self.add_cleanup(b.lock_read().unlock)
586
if len(revision) != 1:
587
raise errors.BzrCommandError(gettext(
588
"Tags can only be placed on a single revision, "
590
revid = revision[0].as_revision_id(b)
592
revid = b.last_revision()
594
revno_t = b.revision_id_to_dotted_revno(revid)
595
except errors.NoSuchRevision:
597
revno = ".".join(str(n) for n in revno_t)
574
598
self.cleanup_now()
575
self.outf.write(str(revno) + '\n')
599
self.outf.write(revno + '\n')
578
602
class cmd_revision_info(Command):
726
758
takes_args = ['dir+']
762
help='No error if existing, make parent directories as needed.',
727
766
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)
769
def add_file_with_parents(cls, wt, relpath):
770
if wt.path2id(relpath) is not None:
772
cls.add_file_with_parents(wt, osutils.dirname(relpath))
776
def add_file_single(cls, wt, relpath):
779
def run(self, dir_list, parents=False):
781
add_file = self.add_file_with_parents
783
add_file = self.add_file_single
785
wt, relpath = WorkingTree.open_containing(dir)
790
if e.errno != errno.EEXIST:
739
raise errors.NotVersionedError(path=base)
794
add_file(wt, relpath)
796
self.outf.write(gettext('added %s\n') % dir)
742
799
class cmd_relpath(Command):
849
906
return self.run_auto(names_list, after, dry_run)
851
raise errors.BzrCommandError('--dry-run requires --auto.')
908
raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
852
909
if names_list is None:
854
911
if len(names_list) < 2:
855
raise errors.BzrCommandError("missing file argument")
912
raise errors.BzrCommandError(gettext("missing file argument"))
856
913
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
914
for file_name in rel_names[0:-1]:
916
raise errors.BzrCommandError(gettext("can not move root of branch"))
857
917
self.add_cleanup(tree.lock_tree_write().unlock)
858
918
self._run(tree, names_list, rel_names, after)
860
920
def run_auto(self, names_list, after, dry_run):
861
921
if names_list is not None and len(names_list) > 1:
862
raise errors.BzrCommandError('Only one path may be specified to'
922
raise errors.BzrCommandError(gettext('Only one path may be specified to'
865
raise errors.BzrCommandError('--after cannot be specified with'
925
raise errors.BzrCommandError(gettext('--after cannot be specified with'
867
927
work_tree, file_list = WorkingTree.open_containing_paths(
868
928
names_list, default_directory='.')
869
929
self.add_cleanup(work_tree.lock_tree_write().unlock)
1177
1244
# error by the feedback given to them. RBC 20080227.
1178
1245
stacked_on = parent_url
1179
1246
if not stacked_on:
1180
raise errors.BzrCommandError(
1181
"Could not determine branch to refer to.")
1247
raise errors.BzrCommandError(gettext(
1248
"Could not determine branch to refer to."))
1183
1250
# Get the destination location
1184
1251
if location is None:
1185
1252
stored_loc = br_from.get_push_location()
1186
1253
if stored_loc is None:
1187
raise errors.BzrCommandError(
1188
"No push location known or specified.")
1254
raise errors.BzrCommandError(gettext(
1255
"No push location known or specified."))
1190
1257
display_url = urlutils.unescape_for_display(stored_loc,
1191
1258
self.outf.encoding)
1192
self.outf.write("Using saved push location: %s\n" % display_url)
1259
note(gettext("Using saved push location: %s") % display_url)
1193
1260
location = stored_loc
1195
1262
_show_push_branch(br_from, revision_id, location, self.outf,
1273
1340
revision_id = br_from.last_revision()
1274
1341
if to_location is None:
1275
to_location = urlutils.derive_to_location(from_location)
1342
to_location = getattr(br_from, "name", None)
1343
if to_location is None:
1344
to_location = urlutils.derive_to_location(from_location)
1276
1345
to_transport = transport.get_transport(to_location)
1278
1347
to_transport.mkdir('.')
1279
1348
except errors.FileExists:
1280
if not use_existing_dir:
1281
raise errors.BzrCommandError('Target directory "%s" '
1282
'already exists.' % to_location)
1350
to_dir = controldir.ControlDir.open_from_transport(
1352
except errors.NotBranchError:
1353
if not use_existing_dir:
1354
raise errors.BzrCommandError(gettext('Target directory "%s" '
1355
'already exists.') % to_location)
1285
bzrdir.BzrDir.open_from_transport(to_transport)
1360
to_dir.open_branch()
1286
1361
except errors.NotBranchError:
1289
1364
raise errors.AlreadyBranchError(to_location)
1290
1365
except errors.NoSuchFile:
1291
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1366
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)
1372
# preserve whatever source format we have.
1373
to_dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1374
possible_transports=[to_transport],
1375
accelerator_tree=accelerator_tree,
1376
hardlink=hardlink, stacked=stacked,
1377
force_new_repo=standalone,
1378
create_tree_if_local=not no_tree,
1379
source_branch=br_from)
1380
branch = to_dir.open_branch(
1381
possible_transports=[
1382
br_from.bzrdir.root_transport, to_transport])
1383
except errors.NoSuchRevision:
1384
to_transport.delete_tree('.')
1385
msg = gettext("The branch {0} has no revision {1}.").format(
1386
from_location, revision)
1387
raise errors.BzrCommandError(msg)
1389
branch = br_from.sprout(to_dir, revision_id=revision_id)
1308
1390
_merge_tags_if_possible(br_from, branch)
1309
1391
# If the source branch is stacked, the new branch may
1310
1392
# be stacked whether we asked for that explicitly or not.
1311
1393
# We therefore need a try/except here and not just 'if stacked:'
1313
note('Created new stacked branch referring to %s.' %
1395
note(gettext('Created new stacked branch referring to %s.') %
1314
1396
branch.get_stacked_on_url())
1315
1397
except (errors.NotStacked, errors.UnstackableBranchFormat,
1316
1398
errors.UnstackableRepositoryFormat), e:
1317
note('Branched %d revision(s).' % branch.revno())
1399
note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
1319
1401
# Bind to the parent
1320
1402
parent_branch = Branch.open(from_location)
1321
1403
branch.bind(parent_branch)
1322
note('New branch bound to %s' % from_location)
1404
note(gettext('New branch bound to %s') % from_location)
1324
1406
# Switch to the new branch
1325
1407
wt, _ = WorkingTree.open_containing('.')
1326
1408
_mod_switch.switch(wt.bzrdir, branch)
1327
note('Switched to branch: %s',
1409
note(gettext('Switched to branch: %s'),
1328
1410
urlutils.unescape_for_display(branch.base, 'utf-8'))
1413
class cmd_branches(Command):
1414
__doc__ = """List the branches available at the current location.
1416
This command will print the names of all the branches at the current
1420
takes_args = ['location?']
1422
Option('recursive', short_name='R',
1423
help='Recursively scan for branches rather than '
1424
'just looking in the specified location.')]
1426
def run(self, location=".", recursive=False):
1428
t = transport.get_transport(location)
1429
if not t.listable():
1430
raise errors.BzrCommandError(
1431
"Can't scan this type of location.")
1432
for b in controldir.ControlDir.find_branches(t):
1433
self.outf.write("%s\n" % urlutils.unescape_for_display(
1434
urlutils.relative_url(t.base, b.base),
1435
self.outf.encoding).rstrip("/"))
1437
dir = controldir.ControlDir.open_containing(location)[0]
1438
for branch in dir.list_branches():
1439
if branch.name is None:
1440
self.outf.write(gettext(" (default)\n"))
1442
self.outf.write(" %s\n" % branch.name.encode(
1443
self.outf.encoding))
1331
1446
class cmd_checkout(Command):
1332
1447
__doc__ = """Create a new checkout of an existing branch.
1435
1550
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
1551
__doc__ = """Update a working tree to a new revision.
1553
This will perform a merge of the destination revision (the tip of the
1554
branch, or the specified revision) into the working tree, and then make
1555
that revision the basis revision for the working tree.
1557
You can use this to visit an older revision, or to update a working tree
1558
that is out of date from its branch.
1560
If there are any uncommitted changes in the tree, they will be carried
1561
across and remain as uncommitted changes after the update. To discard
1562
these changes, use 'bzr revert'. The uncommitted changes may conflict
1563
with the changes brought in by the change in basis revision.
1565
If the tree's branch is bound to a master branch, bzr will also update
1449
1566
the branch from the master.
1568
You cannot update just a single file or directory, because each Bazaar
1569
working tree has just a single basis revision. If you want to restore a
1570
file that has been removed locally, use 'bzr revert' instead of 'bzr
1571
update'. If you want to restore a file to its state in a previous
1572
revision, use 'bzr revert' with a '-r' option, or use 'bzr cat' to write
1573
out the old content of that file to a new location.
1575
The 'dir' argument, if given, must be the location of the root of a
1576
working tree to update. By default, the working tree that contains the
1577
current working directory is used.
1452
1580
_see_also = ['pull', 'working-trees', 'status-flags']
1458
1586
aliases = ['up']
1460
def run(self, dir='.', revision=None, show_base=None):
1588
def run(self, dir=None, revision=None, show_base=None):
1461
1589
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]
1590
raise errors.BzrCommandError(gettext(
1591
"bzr update --revision takes exactly one revision"))
1593
tree = WorkingTree.open_containing('.')[0]
1595
tree, relpath = WorkingTree.open_containing(dir)
1598
raise errors.BzrCommandError(gettext(
1599
"bzr update can only update a whole tree, "
1600
"not a file or subdirectory"))
1465
1601
branch = tree.branch
1466
1602
possible_transports = []
1467
1603
master = branch.get_master_branch(
1506
1642
old_tip=old_tip,
1507
1643
show_base=show_base)
1508
1644
except errors.NoSuchRevision, e:
1509
raise errors.BzrCommandError(
1645
raise errors.BzrCommandError(gettext(
1510
1646
"branch has no revision %s\n"
1511
1647
"bzr update --revision only works"
1512
" for a revision in the branch history"
1648
" for a revision in the branch history")
1513
1649
% (e.revision))
1514
1650
revno = tree.branch.revision_id_to_dotted_revno(
1515
1651
_mod_revision.ensure_null(tree.last_revision()))
1516
note('Updated to revision %s of branch %s' %
1517
('.'.join(map(str, revno)), branch_location))
1652
note(gettext('Updated to revision {0} of branch {1}').format(
1653
'.'.join(map(str, revno)), branch_location))
1518
1654
parent_ids = tree.get_parent_ids()
1519
1655
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'.")
1656
note(gettext('Your local commits will now show as pending merges with '
1657
"'bzr status', and can be committed with 'bzr commit'."))
1522
1658
if conflicts != 0:
2390
2535
Option('show-diff',
2391
2536
short_name='p',
2392
2537
help='Show changes made in each revision as a patch.'),
2393
Option('include-merges',
2538
Option('include-merged',
2394
2539
help='Show merged revisions like --levels 0 does.'),
2540
Option('include-merges', hidden=True,
2541
help='Historical alias for --include-merged.'),
2542
Option('omit-merges',
2543
help='Do not report commits with more than one parent.'),
2395
2544
Option('exclude-common-ancestry',
2396
2545
help='Display only the revisions that are not part'
2397
' of both ancestries (require -rX..Y)'
2546
' of both ancestries (require -rX..Y).'
2399
2548
Option('signatures',
2400
help='Show digital signature validity'),
2549
help='Show digital signature validity.'),
2552
help='Show revisions whose properties match this '
2555
ListOption('match-message',
2556
help='Show revisions whose message matches this '
2559
ListOption('match-committer',
2560
help='Show revisions whose committer matches this '
2563
ListOption('match-author',
2564
help='Show revisions whose authors match this '
2567
ListOption('match-bugs',
2568
help='Show revisions whose bugs match this '
2402
2572
encoding_type = 'replace'
2424
2601
_get_info_for_log_files,
2426
2603
direction = (forward and 'forward') or 'reverse'
2604
if symbol_versioning.deprecated_passed(include_merges):
2605
ui.ui_factory.show_user_warning(
2606
'deprecated_command_option',
2607
deprecated_name='--include-merges',
2608
recommended_name='--include-merged',
2609
deprecated_in_version='2.5',
2610
command=self.invoked_as)
2611
if include_merged is None:
2612
include_merged = include_merges
2614
raise errors.BzrCommandError(gettext(
2615
'{0} and {1} are mutually exclusive').format(
2616
'--include-merges', '--include-merged'))
2617
if include_merged is None:
2618
include_merged = False
2427
2619
if (exclude_common_ancestry
2428
2620
and (revision is None or len(revision) != 2)):
2429
raise errors.BzrCommandError(
2430
'--exclude-common-ancestry requires -r with two revisions')
2621
raise errors.BzrCommandError(gettext(
2622
'--exclude-common-ancestry requires -r with two revisions'))
2432
2624
if levels is None:
2435
raise errors.BzrCommandError(
2436
'--levels and --include-merges are mutually exclusive')
2627
raise errors.BzrCommandError(gettext(
2628
'{0} and {1} are mutually exclusive').format(
2629
'--levels', '--include-merged'))
2438
2631
if change is not None:
2439
2632
if len(change) > 1:
2440
2633
raise errors.RangeInChangeOption()
2441
2634
if revision is not None:
2442
raise errors.BzrCommandError(
2443
'--revision and --change are mutually exclusive')
2635
raise errors.BzrCommandError(gettext(
2636
'{0} and {1} are mutually exclusive').format(
2637
'--revision', '--change'))
2445
2639
revision = change
2839
3045
self.outf.write("%s\n" % pattern)
2841
3047
if not name_pattern_list:
2842
raise errors.BzrCommandError("ignore requires at least one "
2843
"NAME_PATTERN or --default-rules.")
3048
raise errors.BzrCommandError(gettext("ignore requires at least one "
3049
"NAME_PATTERN or --default-rules."))
2844
3050
name_pattern_list = [globbing.normalize_pattern(p)
2845
3051
for p in name_pattern_list]
2846
3052
bad_patterns = ''
3053
bad_patterns_count = 0
2847
3054
for p in name_pattern_list:
2848
3055
if not globbing.Globster.is_pattern_valid(p):
3056
bad_patterns_count += 1
2849
3057
bad_patterns += ('\n %s' % p)
2850
3058
if bad_patterns:
2851
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
3059
msg = (ngettext('Invalid ignore pattern found. %s',
3060
'Invalid ignore patterns found. %s',
3061
bad_patterns_count) % bad_patterns)
2852
3062
ui.ui_factory.show_error(msg)
2853
3063
raise errors.InvalidPattern('')
2854
3064
for name_pattern in name_pattern_list:
2855
3065
if (name_pattern[0] == '/' or
2856
3066
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2857
raise errors.BzrCommandError(
2858
"NAME_PATTERN should not be an absolute path")
3067
raise errors.BzrCommandError(gettext(
3068
"NAME_PATTERN should not be an absolute path"))
2859
3069
tree, relpath = WorkingTree.open_containing(directory)
2860
3070
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2861
3071
ignored = globbing.Globster(name_pattern_list)
2965
3175
Option('per-file-timestamps',
2966
3176
help='Set modification time of files to that of the last '
2967
3177
'revision in which it was changed.'),
3178
Option('uncommitted',
3179
help='Export the working tree contents rather than that of the '
2969
3182
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2970
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3183
root=None, filters=False, per_file_timestamps=False, uncommitted=False,
2971
3185
from bzrlib.export import export
2973
3187
if branch_or_subdir is None:
2974
tree = WorkingTree.open_containing(directory)[0]
3188
branch_or_subdir = directory
3190
(tree, b, subdir) = controldir.ControlDir.open_containing_tree_or_branch(
3192
if tree is not None:
3193
self.add_cleanup(tree.lock_read().unlock)
3197
raise errors.BzrCommandError(
3198
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)
3201
export_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2983
export(rev_tree, dest, format, root, subdir, filtered=filters,
3203
export(export_tree, dest, format, root, subdir, filtered=filters,
2984
3204
per_file_timestamps=per_file_timestamps)
2985
3205
except errors.NoSuchExportFormat, e:
2986
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3206
raise errors.BzrCommandError(
3207
gettext('Unsupported export format: %s') % e.format)
2989
3210
class cmd_cat(Command):
3027
3248
old_file_id = rev_tree.path2id(relpath)
3250
# TODO: Split out this code to something that generically finds the
3251
# best id for a path across one or more trees; it's like
3252
# find_ids_across_trees but restricted to find just one. -- mbp
3029
3254
if name_from_revision:
3030
3255
# Try in revision if requested
3031
3256
if old_file_id is None:
3032
raise errors.BzrCommandError(
3033
"%r is not present in revision %s" % (
3257
raise errors.BzrCommandError(gettext(
3258
"{0!r} is not present in revision {1}").format(
3034
3259
filename, rev_tree.get_revision_id()))
3036
content = rev_tree.get_file_text(old_file_id)
3261
actual_file_id = old_file_id
3038
3263
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" % (
3264
if cur_file_id is not None and rev_tree.has_id(cur_file_id):
3265
actual_file_id = cur_file_id
3266
elif old_file_id is not None:
3267
actual_file_id = old_file_id
3269
raise errors.BzrCommandError(gettext(
3270
"{0!r} is not present in revision {1}").format(
3056
3271
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)
3273
from bzrlib.filter_tree import ContentFilterTree
3274
filter_tree = ContentFilterTree(rev_tree,
3275
rev_tree._content_filter_stack)
3276
content = filter_tree.get_file_text(actual_file_id)
3070
self.outf.write(content)
3278
content = rev_tree.get_file_text(actual_file_id)
3280
self.outf.write(content)
3073
3283
class cmd_local_time_offset(Command):
3180
3390
aliases = ['ci', 'checkin']
3182
3392
def _iter_bug_fix_urls(self, fixes, branch):
3393
default_bugtracker = None
3183
3394
# Configure the properties for bug fixing attributes.
3184
3395
for fixed_bug in fixes:
3185
3396
tokens = fixed_bug.split(':')
3186
if len(tokens) != 2:
3187
raise errors.BzrCommandError(
3397
if len(tokens) == 1:
3398
if default_bugtracker is None:
3399
branch_config = branch.get_config()
3400
default_bugtracker = branch_config.get_user_option(
3402
if default_bugtracker is None:
3403
raise errors.BzrCommandError(gettext(
3404
"No tracker specified for bug %s. Use the form "
3405
"'tracker:id' or specify a default bug tracker "
3406
"using the `bugtracker` option.\nSee "
3407
"\"bzr help bugs\" for more information on this "
3408
"feature. Commit refused.") % fixed_bug)
3409
tag = default_bugtracker
3411
elif len(tokens) != 2:
3412
raise errors.BzrCommandError(gettext(
3188
3413
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3189
3414
"See \"bzr help bugs\" for more information on this "
3190
"feature.\nCommit refused." % fixed_bug)
3191
tag, bug_id = tokens
3415
"feature.\nCommit refused.") % fixed_bug)
3417
tag, bug_id = tokens
3193
3419
yield bugtracker.get_bug_url(tag, branch, bug_id)
3194
3420
except errors.UnknownBugTrackerAbbreviation:
3195
raise errors.BzrCommandError(
3196
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3421
raise errors.BzrCommandError(gettext(
3422
'Unrecognized bug %s. Commit refused.') % fixed_bug)
3197
3423
except errors.MalformedBugIdentifier, e:
3198
raise errors.BzrCommandError(
3199
"%s\nCommit refused." % (str(e),))
3424
raise errors.BzrCommandError(gettext(
3425
"%s\nCommit refused.") % (str(e),))
3201
3427
def run(self, message=None, file=None, verbose=False, selected_list=None,
3202
3428
unchanged=False, strict=False, local=False, fixes=None,
3309
3538
exclude=tree.safe_relpath_files(exclude),
3311
3540
except PointlessCommit:
3312
raise errors.BzrCommandError("No changes to commit."
3541
raise errors.BzrCommandError(gettext("No changes to commit."
3313
3542
" Please 'bzr add' the files you want to commit, or use"
3314
" --unchanged to force an empty commit.")
3543
" --unchanged to force an empty commit."))
3315
3544
except ConflictsInTree:
3316
raise errors.BzrCommandError('Conflicts detected in working '
3545
raise errors.BzrCommandError(gettext('Conflicts detected in working '
3317
3546
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3319
3548
except StrictCommitFailed:
3320
raise errors.BzrCommandError("Commit refused because there are"
3321
" unknown files in the working tree.")
3549
raise errors.BzrCommandError(gettext("Commit refused because there are"
3550
" unknown files in the working tree."))
3322
3551
except errors.BoundBranchOutOfDate, e:
3323
e.extra_help = ("\n"
3552
e.extra_help = (gettext("\n"
3324
3553
'To commit to master branch, run update and then commit.\n'
3325
3554
'You can also pass --local to commit to continue working '
4009
4255
mergeable = None
4011
4257
if uncommitted:
4012
raise errors.BzrCommandError('Cannot use --uncommitted'
4013
' with bundles or merge directives.')
4258
raise errors.BzrCommandError(gettext('Cannot use --uncommitted'
4259
' with bundles or merge directives.'))
4015
4261
if revision is not None:
4016
raise errors.BzrCommandError(
4017
'Cannot use -r with merge directives or bundles')
4262
raise errors.BzrCommandError(gettext(
4263
'Cannot use -r with merge directives or bundles'))
4018
4264
merger, verified = _mod_merge.Merger.from_mergeable(tree,
4019
4265
mergeable, None)
4021
4267
if merger is None and uncommitted:
4022
4268
if revision is not None and len(revision) > 0:
4023
raise errors.BzrCommandError('Cannot use --uncommitted and'
4024
' --revision at the same time.')
4269
raise errors.BzrCommandError(gettext('Cannot use --uncommitted and'
4270
' --revision at the same time.'))
4025
4271
merger = self.get_merger_from_uncommitted(tree, location, None)
4026
4272
allow_pending = False
4040
4286
if merger.interesting_files:
4041
4287
if not merger.other_tree.has_filename(
4042
4288
merger.interesting_files[0]):
4043
note("merger: " + str(merger))
4289
note(gettext("merger: ") + str(merger))
4044
4290
raise errors.PathsDoNotExist([location])
4045
note('Nothing to do.')
4291
note(gettext('Nothing to do.'))
4047
4293
if pull and not preview:
4048
4294
if merger.interesting_files is not None:
4049
raise errors.BzrCommandError('Cannot pull individual files')
4295
raise errors.BzrCommandError(gettext('Cannot pull individual files'))
4050
4296
if (merger.base_rev_id == tree.last_revision()):
4051
4297
result = tree.pull(merger.other_branch, False,
4052
4298
merger.other_rev_id)
4053
4299
result.report(self.outf)
4055
4301
if merger.this_basis is None:
4056
raise errors.BzrCommandError(
4302
raise errors.BzrCommandError(gettext(
4057
4303
"This branch has no commits."
4058
" (perhaps you would prefer 'bzr pull')")
4304
" (perhaps you would prefer 'bzr pull')"))
4060
4306
return self._do_preview(merger)
4061
4307
elif interactive:
4519
4767
theirs_only=False,
4520
4768
log_format=None, long=False, short=False, line=False,
4521
4769
show_ids=False, verbose=False, this=False, other=False,
4522
include_merges=False, revision=None, my_revision=None,
4770
include_merged=None, revision=None, my_revision=None,
4772
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
4524
4773
from bzrlib.missing import find_unmerged, iter_log_revisions
4525
4774
def message(s):
4526
4775
if not is_quiet():
4527
4776
self.outf.write(s)
4778
if symbol_versioning.deprecated_passed(include_merges):
4779
ui.ui_factory.show_user_warning(
4780
'deprecated_command_option',
4781
deprecated_name='--include-merges',
4782
recommended_name='--include-merged',
4783
deprecated_in_version='2.5',
4784
command=self.invoked_as)
4785
if include_merged is None:
4786
include_merged = include_merges
4788
raise errors.BzrCommandError(gettext(
4789
'{0} and {1} are mutually exclusive').format(
4790
'--include-merges', '--include-merged'))
4791
if include_merged is None:
4792
include_merged = False
4530
4794
mine_only = this
4783
5051
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4784
5052
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')
5053
raise errors.BzrCommandError(gettext('You can only supply one of revision_id or --revision'))
4786
5054
if revision_id_list is None and revision is None:
4787
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
5055
raise errors.BzrCommandError(gettext('You must supply either --revision or a revision_id'))
4788
5056
b = WorkingTree.open_containing(directory)[0].branch
4789
5057
self.add_cleanup(b.lock_write().unlock)
4790
5058
return self._run(b, revision_id_list, revision)
4792
5060
def _run(self, b, revision_id_list, revision):
4793
5061
import bzrlib.gpg as gpg
4794
gpg_strategy = gpg.GPGStrategy(b.get_config())
5062
gpg_strategy = gpg.GPGStrategy(b.get_config_stack())
4795
5063
if revision_id_list is not None:
4796
5064
b.repository.start_write_group()
4860
5128
location = b.get_old_bound_location()
4861
5129
except errors.UpgradeRequired:
4862
raise errors.BzrCommandError('No location supplied. '
4863
'This format does not remember old locations.')
5130
raise errors.BzrCommandError(gettext('No location supplied. '
5131
'This format does not remember old locations.'))
4865
5133
if location is None:
4866
5134
if b.get_bound_location() is not None:
4867
raise errors.BzrCommandError('Branch is already bound')
5135
raise errors.BzrCommandError(gettext('Branch is already bound'))
4869
raise errors.BzrCommandError('No location supplied '
4870
'and no previous location known')
5137
raise errors.BzrCommandError(gettext('No location supplied '
5138
'and no previous location known'))
4871
5139
b_other = Branch.open(location)
4873
5141
b.bind(b_other)
4874
5142
except errors.DivergedBranches:
4875
raise errors.BzrCommandError('These branches have diverged.'
4876
' Try merging, and then bind again.')
5143
raise errors.BzrCommandError(gettext('These branches have diverged.'
5144
' Try merging, and then bind again.'))
4877
5145
if b.get_config().has_explicit_nickname():
4878
5146
b.nick = b_other.nick
4945
5214
self.add_cleanup(tree.lock_write().unlock)
4947
5216
self.add_cleanup(b.lock_write().unlock)
4948
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
5217
return self._run(b, tree, dry_run, verbose, revision, force,
4950
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
5220
def _run(self, b, tree, dry_run, verbose, revision, force, local,
4951
5222
from bzrlib.log import log_formatter, show_log
4952
5223
from bzrlib.uncommit import uncommit
4983
5254
end_revision=last_revno)
4986
self.outf.write('Dry-run, pretending to remove'
4987
' the above revisions.\n')
5257
self.outf.write(gettext('Dry-run, pretending to remove'
5258
' the above revisions.\n'))
4989
self.outf.write('The above revision(s) will be removed.\n')
5260
self.outf.write(gettext('The above revision(s) will be removed.\n'))
4992
5263
if not ui.ui_factory.confirm_action(
4993
u'Uncommit these revisions',
5264
gettext(u'Uncommit these revisions'),
4994
5265
'bzrlib.builtins.uncommit',
4996
self.outf.write('Canceled\n')
5267
self.outf.write(gettext('Canceled\n'))
4999
5270
mutter('Uncommitting from {%s} to {%s}',
5000
5271
last_rev_id, rev_id)
5001
5272
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)
5273
revno=revno, local=local, keep_tags=keep_tags)
5274
self.outf.write(gettext('You can restore the old tip by running:\n'
5275
' bzr pull . -r revid:%s\n') % last_rev_id)
5007
5278
class cmd_break_lock(Command):
5113
5386
return host, port
5115
5388
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5389
protocol=None, client_timeout=None):
5117
5390
from bzrlib import transport
5118
5391
if directory is None:
5119
5392
directory = os.getcwd()
5120
5393
if protocol is None:
5121
5394
protocol = transport.transport_server_registry.get()
5122
5395
host, port = self.get_host_and_port(port)
5123
url = urlutils.local_path_to_url(directory)
5396
url = transport.location_to_url(directory)
5124
5397
if not allow_writes:
5125
5398
url = 'readonly+' + url
5126
t = transport.get_transport(url)
5127
protocol(t, host, port, inet)
5399
t = transport.get_transport_from_url(url)
5401
protocol(t, host, port, inet, client_timeout)
5402
except TypeError, e:
5403
# We use symbol_versioning.deprecated_in just so that people
5404
# grepping can find it here.
5405
# symbol_versioning.deprecated_in((2, 5, 0))
5406
symbol_versioning.warn(
5407
'Got TypeError(%s)\ntrying to call protocol: %s.%s\n'
5408
'Most likely it needs to be updated to support a'
5409
' "timeout" parameter (added in bzr 2.5.0)'
5410
% (e, protocol.__module__, protocol),
5412
protocol(t, host, port, inet)
5130
5415
class cmd_join(Command):
5542
5827
self.add_cleanup(branch.lock_write().unlock)
5544
5829
if tag_name is None:
5545
raise errors.BzrCommandError("No tag specified to delete.")
5830
raise errors.BzrCommandError(gettext("No tag specified to delete."))
5546
5831
branch.tags.delete_tag(tag_name)
5547
note('Deleted tag %s.' % tag_name)
5832
note(gettext('Deleted tag %s.') % tag_name)
5550
5835
if len(revision) != 1:
5551
raise errors.BzrCommandError(
5836
raise errors.BzrCommandError(gettext(
5552
5837
"Tags can only be placed on a single revision, "
5554
5839
revision_id = revision[0].as_revision_id(branch)
5556
5841
revision_id = branch.last_revision()
5557
5842
if tag_name is None:
5558
5843
tag_name = branch.automatic_tag_name(revision_id)
5559
5844
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):
5845
raise errors.BzrCommandError(gettext(
5846
"Please specify a tag name."))
5848
existing_target = branch.tags.lookup_tag(tag_name)
5849
except errors.NoSuchTag:
5850
existing_target = None
5851
if not force and existing_target not in (None, revision_id):
5563
5852
raise errors.TagAlreadyExists(tag_name)
5564
branch.tags.set_tag(tag_name, revision_id)
5565
note('Created tag %s.' % tag_name)
5853
if existing_target == revision_id:
5854
note(gettext('Tag %s already exists for that revision.') % tag_name)
5856
branch.tags.set_tag(tag_name, revision_id)
5857
if existing_target is None:
5858
note(gettext('Created tag %s.') % tag_name)
5860
note(gettext('Updated tag %s.') % tag_name)
5568
5863
class cmd_tags(Command):
5619
5912
for tag, revspec in tags:
5620
5913
self.outf.write('%-20s %s\n' % (tag, revspec))
5915
def _tags_for_range(self, branch, revision):
5917
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5918
revid1, revid2 = rev1.rev_id, rev2.rev_id
5919
# _get_revision_range will always set revid2 if it's not specified.
5920
# If revid1 is None, it means we want to start from the branch
5921
# origin which is always a valid ancestor. If revid1 == revid2, the
5922
# ancestry check is useless.
5923
if revid1 and revid1 != revid2:
5924
# FIXME: We really want to use the same graph than
5925
# branch.iter_merge_sorted_revisions below, but this is not
5926
# easily available -- vila 2011-09-23
5927
if branch.repository.get_graph().is_ancestor(revid2, revid1):
5928
# We don't want to output anything in this case...
5930
# only show revisions between revid1 and revid2 (inclusive)
5931
tagged_revids = branch.tags.get_reverse_tag_dict()
5933
for r in branch.iter_merge_sorted_revisions(
5934
start_revision_id=revid2, stop_revision_id=revid1,
5935
stop_rule='include'):
5936
revid_tags = tagged_revids.get(r[0], None)
5938
found.extend([(tag, r[0]) for tag in revid_tags])
5623
5942
class cmd_reconfigure(Command):
5624
5943
__doc__ = """Reconfigure the type of a bzr directory.
5638
5957
takes_args = ['location?']
5639
5958
takes_options = [
5640
5959
RegistryOption.from_kwargs(
5642
title='Target type',
5643
help='The type to reconfigure the directory to.',
5962
help='The relation between branch and tree.',
5644
5963
value_switches=True, enum_switch=False,
5645
5964
branch='Reconfigure to be an unbound branch with no working tree.',
5646
5965
tree='Reconfigure to be an unbound branch with a working tree.',
5647
5966
checkout='Reconfigure to be a bound branch with a working tree.',
5648
5967
lightweight_checkout='Reconfigure to be a lightweight'
5649
5968
' checkout (with no local history).',
5970
RegistryOption.from_kwargs(
5972
title='Repository type',
5973
help='Location fo the repository.',
5974
value_switches=True, enum_switch=False,
5650
5975
standalone='Reconfigure to be a standalone branch '
5651
5976
'(i.e. stop using shared repository).',
5652
5977
use_shared='Reconfigure to use a shared repository.',
5979
RegistryOption.from_kwargs(
5981
title='Trees in Repository',
5982
help='Whether new branches in the repository have trees.',
5983
value_switches=True, enum_switch=False,
5653
5984
with_trees='Reconfigure repository to create '
5654
5985
'working trees on branches by default.',
5655
5986
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)
6003
def run(self, location=None, bind_to=None, force=False,
6004
tree_type=None, repository_type=None, repository_trees=None,
6005
stacked_on=None, unstacked=None):
6006
directory = controldir.ControlDir.open(location)
5676
6007
if stacked_on and unstacked:
5677
raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
6008
raise errors.BzrCommandError(gettext("Can't use both --stacked-on and --unstacked"))
5678
6009
elif stacked_on is not None:
5679
6010
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5680
6011
elif unstacked:
5682
6013
# At the moment you can use --stacked-on and a different
5683
6014
# reconfiguration shape at the same time; there seems no good reason
5685
if target_type is None:
6016
if (tree_type is None and
6017
repository_type is None and
6018
repository_trees is None):
5686
6019
if stacked_on or unstacked:
5689
raise errors.BzrCommandError('No target configuration '
5691
elif target_type == 'branch':
6022
raise errors.BzrCommandError(gettext('No target configuration '
6024
reconfiguration = None
6025
if tree_type == 'branch':
5692
6026
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5693
elif target_type == 'tree':
6027
elif tree_type == 'tree':
5694
6028
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5695
elif target_type == 'checkout':
6029
elif tree_type == 'checkout':
5696
6030
reconfiguration = reconfigure.Reconfigure.to_checkout(
5697
6031
directory, bind_to)
5698
elif target_type == 'lightweight-checkout':
6032
elif tree_type == 'lightweight-checkout':
5699
6033
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5700
6034
directory, bind_to)
5701
elif target_type == 'use-shared':
6036
reconfiguration.apply(force)
6037
reconfiguration = None
6038
if repository_type == 'use-shared':
5702
6039
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5703
elif target_type == 'standalone':
6040
elif repository_type == 'standalone':
5704
6041
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5705
elif target_type == 'with-trees':
6043
reconfiguration.apply(force)
6044
reconfiguration = None
6045
if repository_trees == 'with-trees':
5706
6046
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5707
6047
directory, True)
5708
elif target_type == 'with-no-trees':
6048
elif repository_trees == 'with-no-trees':
5709
6049
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5710
6050
directory, False)
5711
reconfiguration.apply(force)
6052
reconfiguration.apply(force)
6053
reconfiguration = None
5714
6056
class cmd_switch(Command):
5763
6105
had_explicit_nick = False
5764
6106
if create_branch:
5765
6107
if branch is None:
5766
raise errors.BzrCommandError('cannot create branch without'
6108
raise errors.BzrCommandError(gettext('cannot create branch without'
5768
6110
to_location = directory_service.directories.dereference(
5770
6112
if '/' not in to_location and '\\' not in to_location:
5771
6113
# This path is meant to be relative to the existing branch
5772
6114
this_url = self._get_branch_location(control_dir)
5773
to_location = urlutils.join(this_url, '..', to_location)
6115
# Perhaps the target control dir supports colocated branches?
6117
root = controldir.ControlDir.open(this_url,
6118
possible_transports=[control_dir.user_transport])
6119
except errors.NotBranchError:
6122
colocated = root._format.colocated_branches
6124
to_location = urlutils.join_segment_parameters(this_url,
6125
{"branch": urlutils.escape(to_location)})
6127
to_location = urlutils.join(
6128
this_url, '..', urlutils.escape(to_location))
5774
6129
to_branch = branch.bzrdir.sprout(to_location,
5775
6130
possible_transports=[branch.bzrdir.root_transport],
5776
6131
source_branch=branch).open_branch()
6133
# 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))
6135
to_branch = control_dir.open_branch(to_location)
6136
except (errors.NotBranchError, errors.NoColocatedBranchSupport):
6138
to_branch = Branch.open(to_location)
6139
except errors.NotBranchError:
6140
this_url = self._get_branch_location(control_dir)
6141
to_branch = Branch.open(
6143
this_url, '..', urlutils.escape(to_location)))
5784
6144
if revision is not None:
5785
6145
revision = revision.as_revision_id(to_branch)
5786
6146
switch.switch(control_dir, to_branch, force, revision_id=revision)
5787
6147
if had_explicit_nick:
5788
6148
branch = control_dir.open_branch() #get the new branch!
5789
6149
branch.nick = to_branch.nick
5790
note('Switched to branch: %s',
6150
note(gettext('Switched to branch: %s'),
5791
6151
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5793
6153
def _get_branch_location(self, control_dir):
5902
6262
name = current_view
5905
raise errors.BzrCommandError(
5906
"Both --delete and a file list specified")
6265
raise errors.BzrCommandError(gettext(
6266
"Both --delete and a file list specified"))
5908
raise errors.BzrCommandError(
5909
"Both --delete and --switch specified")
6268
raise errors.BzrCommandError(gettext(
6269
"Both --delete and --switch specified"))
5911
6271
tree.views.set_view_info(None, {})
5912
self.outf.write("Deleted all views.\n")
6272
self.outf.write(gettext("Deleted all views.\n"))
5913
6273
elif name is None:
5914
raise errors.BzrCommandError("No current view to delete")
6274
raise errors.BzrCommandError(gettext("No current view to delete"))
5916
6276
tree.views.delete_view(name)
5917
self.outf.write("Deleted '%s' view.\n" % name)
6277
self.outf.write(gettext("Deleted '%s' view.\n") % name)
5920
raise errors.BzrCommandError(
5921
"Both --switch and a file list specified")
6280
raise errors.BzrCommandError(gettext(
6281
"Both --switch and a file list specified"))
5923
raise errors.BzrCommandError(
5924
"Both --switch and --all specified")
6283
raise errors.BzrCommandError(gettext(
6284
"Both --switch and --all specified"))
5925
6285
elif switch == 'off':
5926
6286
if current_view is None:
5927
raise errors.BzrCommandError("No current view to disable")
6287
raise errors.BzrCommandError(gettext("No current view to disable"))
5928
6288
tree.views.set_view_info(None, view_dict)
5929
self.outf.write("Disabled '%s' view.\n" % (current_view))
6289
self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
5931
6291
tree.views.set_view_info(switch, view_dict)
5932
6292
view_str = views.view_display_str(tree.views.lookup_view())
5933
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6293
self.outf.write(gettext("Using '{0}' view: {1}\n").format(switch, view_str))
5936
self.outf.write('Views defined:\n')
6296
self.outf.write(gettext('Views defined:\n'))
5937
6297
for view in sorted(view_dict):
5938
6298
if view == current_view:
5942
6302
view_str = views.view_display_str(view_dict[view])
5943
6303
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5945
self.outf.write('No views defined.\n')
6305
self.outf.write(gettext('No views defined.\n'))
5946
6306
elif file_list:
5947
6307
if name is None:
5948
6308
# No name given and no current view set
5950
6310
elif name == 'off':
5951
raise errors.BzrCommandError(
5952
"Cannot change the 'off' pseudo view")
6311
raise errors.BzrCommandError(gettext(
6312
"Cannot change the 'off' pseudo view"))
5953
6313
tree.views.set_view(name, sorted(file_list))
5954
6314
view_str = views.view_display_str(tree.views.lookup_view())
5955
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6315
self.outf.write(gettext("Using '{0}' view: {1}\n").format(name, view_str))
5957
6317
# list the files
5958
6318
if name is None:
5959
6319
# No name given and no current view set
5960
self.outf.write('No current view.\n')
6320
self.outf.write(gettext('No current view.\n'))
5962
6322
view_str = views.view_display_str(tree.views.lookup_view(name))
5963
self.outf.write("'%s' view is: %s\n" % (name, view_str))
6323
self.outf.write(gettext("'{0}' view is: {1}\n").format(name, view_str))
5966
6326
class cmd_hooks(Command):