86
def _get_branch_location(control_dir, possible_transports=None):
87
"""Return location of branch for this control dir."""
89
this_branch = control_dir.open_branch(
90
possible_transports=possible_transports)
91
# This may be a heavy checkout, where we want the master branch
92
master_location = this_branch.get_bound_location()
93
if master_location is not None:
94
return master_location
95
# If not, use a local sibling
96
return this_branch.base
97
except errors.NotBranchError:
98
format = control_dir.find_branch_format()
99
if getattr(format, 'get_reference', None) is not None:
100
return format.get_reference(control_dir)
102
return control_dir.root_transport.base
105
def _is_colocated(control_dir, possible_transports=None):
106
"""Check if the branch in control_dir is colocated.
108
:param control_dir: Control directory
109
:return: Boolean indicating whether
111
# This path is meant to be relative to the existing branch
112
this_url = _get_branch_location(control_dir,
113
possible_transports=possible_transports)
114
# Perhaps the target control dir supports colocated branches?
116
root = controldir.ControlDir.open(this_url,
117
possible_transports=possible_transports)
118
except errors.NotBranchError:
119
return (False, this_url)
122
wt = control_dir.open_workingtree()
123
except (errors.NoWorkingTree, errors.NotLocalUrl):
124
return (False, this_url)
127
root._format.colocated_branches and
128
control_dir.control_url == root.control_url,
132
def lookup_new_sibling_branch(control_dir, location, possible_transports=None):
133
"""Lookup the location for a new sibling branch.
135
:param control_dir: Control directory relative to which to look up
137
:param location: Name of the new branch
138
:return: Full location to the new branch
140
location = directory_service.directories.dereference(location)
141
if '/' not in location and '\\' not in location:
142
(colocated, this_url) = _is_colocated(control_dir, possible_transports)
145
return urlutils.join_segment_parameters(this_url,
146
{"branch": urlutils.escape(location)})
148
return urlutils.join(this_url, '..', urlutils.escape(location))
152
def lookup_sibling_branch(control_dir, location, possible_transports=None):
153
"""Lookup sibling branch.
155
:param control_dir: Control directory relative to which to lookup the
157
:param location: Location to look up
158
:return: branch to open
161
# Perhaps it's a colocated branch?
162
return control_dir.open_branch(location,
163
possible_transports=possible_transports)
164
except (errors.NotBranchError, errors.NoColocatedBranchSupport):
166
return Branch.open(location)
167
except errors.NotBranchError:
168
this_url = _get_branch_location(control_dir)
171
this_url, '..', urlutils.escape(location)))
80
174
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
81
175
def tree_files(file_list, default_branch=u'.', canonicalize=True,
556
649
_see_also = ['info']
557
650
takes_args = ['location?']
558
651
takes_options = [
559
Option('tree', help='Show revno of working tree'),
652
Option('tree', help='Show revno of working tree.'),
563
def run(self, tree=False, location=u'.'):
657
def run(self, tree=False, location=u'.', revision=None):
658
if revision is not None and tree:
659
raise errors.BzrCommandError(gettext("--tree and --revision can "
660
"not be used together"))
566
664
wt = WorkingTree.open_containing(location)[0]
567
665
self.add_cleanup(wt.lock_read().unlock)
568
666
except (errors.NoWorkingTree, errors.NotLocalUrl):
569
667
raise errors.NoWorkingTree(location)
570
669
revid = wt.last_revision()
572
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
573
except errors.NoSuchRevision:
575
revno = ".".join(str(n) for n in revno_t)
577
671
b = Branch.open_containing(location)[0]
578
672
self.add_cleanup(b.lock_read().unlock)
674
if len(revision) != 1:
675
raise errors.BzrCommandError(gettext(
676
"Tags can only be placed on a single revision, "
678
revid = revision[0].as_revision_id(b)
680
revid = b.last_revision()
682
revno_t = b.revision_id_to_dotted_revno(revid)
683
except errors.NoSuchRevision:
685
revno = ".".join(str(n) for n in revno_t)
580
686
self.cleanup_now()
581
self.outf.write(str(revno) + '\n')
687
self.outf.write(revno + '\n')
584
690
class cmd_revision_info(Command):
736
846
takes_args = ['dir+']
850
help='No error if existing, make parent directories as needed.',
737
854
encoding_type = 'replace'
739
def run(self, dir_list):
741
wt, dd = WorkingTree.open_containing(d)
742
base = os.path.dirname(dd)
743
id = wt.path2id(base)
747
self.outf.write('added %s\n' % d)
857
def add_file_with_parents(cls, wt, relpath):
858
if wt.path2id(relpath) is not None:
860
cls.add_file_with_parents(wt, osutils.dirname(relpath))
864
def add_file_single(cls, wt, relpath):
867
def run(self, dir_list, parents=False):
869
add_file = self.add_file_with_parents
871
add_file = self.add_file_single
873
wt, relpath = WorkingTree.open_containing(dir)
878
if e.errno != errno.EEXIST:
749
raise errors.NotVersionedError(path=base)
882
add_file(wt, relpath)
884
self.outf.write(gettext('added %s\n') % dir)
752
887
class cmd_relpath(Command):
859
994
return self.run_auto(names_list, after, dry_run)
861
raise errors.BzrCommandError('--dry-run requires --auto.')
996
raise errors.BzrCommandError(gettext('--dry-run requires --auto.'))
862
997
if names_list is None:
864
999
if len(names_list) < 2:
865
raise errors.BzrCommandError("missing file argument")
1000
raise errors.BzrCommandError(gettext("missing file argument"))
866
1001
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
1002
for file_name in rel_names[0:-1]:
1004
raise errors.BzrCommandError(gettext("can not move root of branch"))
867
1005
self.add_cleanup(tree.lock_tree_write().unlock)
868
1006
self._run(tree, names_list, rel_names, after)
870
1008
def run_auto(self, names_list, after, dry_run):
871
1009
if names_list is not None and len(names_list) > 1:
872
raise errors.BzrCommandError('Only one path may be specified to'
1010
raise errors.BzrCommandError(gettext('Only one path may be specified to'
875
raise errors.BzrCommandError('--after cannot be specified with'
1013
raise errors.BzrCommandError(gettext('--after cannot be specified with'
877
1015
work_tree, file_list = WorkingTree.open_containing_paths(
878
1016
names_list, default_directory='.')
879
1017
self.add_cleanup(work_tree.lock_tree_write().unlock)
1187
1332
# error by the feedback given to them. RBC 20080227.
1188
1333
stacked_on = parent_url
1189
1334
if not stacked_on:
1190
raise errors.BzrCommandError(
1191
"Could not determine branch to refer to.")
1335
raise errors.BzrCommandError(gettext(
1336
"Could not determine branch to refer to."))
1193
1338
# Get the destination location
1194
1339
if location is None:
1195
1340
stored_loc = br_from.get_push_location()
1196
1341
if stored_loc is None:
1197
raise errors.BzrCommandError(
1198
"No push location known or specified.")
1342
parent_loc = br_from.get_parent()
1344
raise errors.BzrCommandError(gettext(
1345
"No push location known or specified. To push to the "
1346
"parent branch (at %s), use 'bzr push :parent'." %
1347
urlutils.unescape_for_display(parent_loc,
1348
self.outf.encoding)))
1350
raise errors.BzrCommandError(gettext(
1351
"No push location known or specified."))
1200
1353
display_url = urlutils.unescape_for_display(stored_loc,
1201
1354
self.outf.encoding)
1202
note("Using saved push location: %s" % display_url)
1355
note(gettext("Using saved push location: %s") % display_url)
1203
1356
location = stored_loc
1205
1358
_show_push_branch(br_from, revision_id, location, self.outf,
1283
1436
revision_id = br_from.last_revision()
1284
1437
if to_location is None:
1285
to_location = urlutils.derive_to_location(from_location)
1438
to_location = getattr(br_from, "name", None)
1440
to_location = urlutils.derive_to_location(from_location)
1286
1441
to_transport = transport.get_transport(to_location)
1288
1443
to_transport.mkdir('.')
1289
1444
except errors.FileExists:
1290
if not use_existing_dir:
1291
raise errors.BzrCommandError('Target directory "%s" '
1292
'already exists.' % to_location)
1446
to_dir = controldir.ControlDir.open_from_transport(
1448
except errors.NotBranchError:
1449
if not use_existing_dir:
1450
raise errors.BzrCommandError(gettext('Target directory "%s" '
1451
'already exists.') % to_location)
1295
bzrdir.BzrDir.open_from_transport(to_transport)
1456
to_dir.open_branch()
1296
1457
except errors.NotBranchError:
1299
1460
raise errors.AlreadyBranchError(to_location)
1300
1461
except errors.NoSuchFile:
1301
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1462
raise errors.BzrCommandError(gettext('Parent of "%s" does not exist.')
1304
# preserve whatever source format we have.
1305
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1306
possible_transports=[to_transport],
1307
accelerator_tree=accelerator_tree,
1308
hardlink=hardlink, stacked=stacked,
1309
force_new_repo=standalone,
1310
create_tree_if_local=not no_tree,
1311
source_branch=br_from)
1312
branch = dir.open_branch()
1313
except errors.NoSuchRevision:
1314
to_transport.delete_tree('.')
1315
msg = "The branch %s has no revision %s." % (from_location,
1317
raise errors.BzrCommandError(msg)
1468
# preserve whatever source format we have.
1469
to_dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1470
possible_transports=[to_transport],
1471
accelerator_tree=accelerator_tree,
1472
hardlink=hardlink, stacked=stacked,
1473
force_new_repo=standalone,
1474
create_tree_if_local=not no_tree,
1475
source_branch=br_from)
1476
branch = to_dir.open_branch(
1477
possible_transports=[
1478
br_from.bzrdir.root_transport, to_transport])
1479
except errors.NoSuchRevision:
1480
to_transport.delete_tree('.')
1481
msg = gettext("The branch {0} has no revision {1}.").format(
1482
from_location, revision)
1483
raise errors.BzrCommandError(msg)
1486
to_repo = to_dir.open_repository()
1487
except errors.NoRepositoryPresent:
1488
to_repo = to_dir.create_repository()
1489
to_repo.fetch(br_from.repository, revision_id=revision_id)
1490
branch = br_from.sprout(to_dir, revision_id=revision_id)
1318
1491
_merge_tags_if_possible(br_from, branch)
1319
1492
# If the source branch is stacked, the new branch may
1320
1493
# be stacked whether we asked for that explicitly or not.
1321
1494
# We therefore need a try/except here and not just 'if stacked:'
1323
note('Created new stacked branch referring to %s.' %
1496
note(gettext('Created new stacked branch referring to %s.') %
1324
1497
branch.get_stacked_on_url())
1325
1498
except (errors.NotStacked, errors.UnstackableBranchFormat,
1326
1499
errors.UnstackableRepositoryFormat), e:
1327
note('Branched %d revision(s).' % branch.revno())
1500
note(ngettext('Branched %d revision.', 'Branched %d revisions.', branch.revno()) % branch.revno())
1329
1502
# Bind to the parent
1330
1503
parent_branch = Branch.open(from_location)
1331
1504
branch.bind(parent_branch)
1332
note('New branch bound to %s' % from_location)
1505
note(gettext('New branch bound to %s') % from_location)
1334
1507
# Switch to the new branch
1335
1508
wt, _ = WorkingTree.open_containing('.')
1336
1509
_mod_switch.switch(wt.bzrdir, branch)
1337
note('Switched to branch: %s',
1510
note(gettext('Switched to branch: %s'),
1338
1511
urlutils.unescape_for_display(branch.base, 'utf-8'))
1341
1514
class cmd_branches(Command):
1342
1515
__doc__ = """List the branches available at the current location.
1344
This command will print the names of all the branches at the current location.
1517
This command will print the names of all the branches at the current
1347
1521
takes_args = ['location?']
1523
Option('recursive', short_name='R',
1524
help='Recursively scan for branches rather than '
1525
'just looking in the specified location.')]
1349
def run(self, location="."):
1350
dir = bzrdir.BzrDir.open_containing(location)[0]
1351
for branch in dir.list_branches():
1352
if branch.name is None:
1353
self.outf.write(" (default)\n")
1355
self.outf.write(" %s\n" % branch.name.encode(self.outf.encoding))
1527
def run(self, location=".", recursive=False):
1529
t = transport.get_transport(location)
1530
if not t.listable():
1531
raise errors.BzrCommandError(
1532
"Can't scan this type of location.")
1533
for b in controldir.ControlDir.find_branches(t):
1534
self.outf.write("%s\n" % urlutils.unescape_for_display(
1535
urlutils.relative_url(t.base, b.base),
1536
self.outf.encoding).rstrip("/"))
1538
dir = controldir.ControlDir.open_containing(location)[0]
1540
active_branch = dir.open_branch(name="")
1541
except errors.NotBranchError:
1542
active_branch = None
1543
branches = dir.get_branches()
1545
for name, branch in branches.iteritems():
1548
active = (active_branch is not None and
1549
active_branch.base == branch.base)
1550
names[name] = active
1551
# Only mention the current branch explicitly if it's not
1552
# one of the colocated branches
1553
if not any(names.values()) and active_branch is not None:
1554
self.outf.write("* %s\n" % gettext("(default)"))
1555
for name in sorted(names.keys()):
1556
active = names[name]
1561
self.outf.write("%s %s\n" % (
1562
prefix, name.encode(self.outf.encoding)))
1358
1565
class cmd_checkout(Command):
1462
1669
class cmd_update(Command):
1463
__doc__ = """Update a tree to have the latest code committed to its branch.
1465
This will perform a merge into the working tree, and may generate
1466
conflicts. If you have any local changes, you will still
1467
need to commit them after the update for the update to be complete.
1469
If you want to discard your local changes, you can just do a
1470
'bzr revert' instead of 'bzr commit' after the update.
1472
If you want to restore a file that has been removed locally, use
1473
'bzr revert' instead of 'bzr update'.
1475
If the tree's branch is bound to a master branch, it will also update
1670
__doc__ = """Update a working tree to a new revision.
1672
This will perform a merge of the destination revision (the tip of the
1673
branch, or the specified revision) into the working tree, and then make
1674
that revision the basis revision for the working tree.
1676
You can use this to visit an older revision, or to update a working tree
1677
that is out of date from its branch.
1679
If there are any uncommitted changes in the tree, they will be carried
1680
across and remain as uncommitted changes after the update. To discard
1681
these changes, use 'bzr revert'. The uncommitted changes may conflict
1682
with the changes brought in by the change in basis revision.
1684
If the tree's branch is bound to a master branch, bzr will also update
1476
1685
the branch from the master.
1687
You cannot update just a single file or directory, because each Bazaar
1688
working tree has just a single basis revision. If you want to restore a
1689
file that has been removed locally, use 'bzr revert' instead of 'bzr
1690
update'. If you want to restore a file to its state in a previous
1691
revision, use 'bzr revert' with a '-r' option, or use 'bzr cat' to write
1692
out the old content of that file to a new location.
1694
The 'dir' argument, if given, must be the location of the root of a
1695
working tree to update. By default, the working tree that contains the
1696
current working directory is used.
1479
1699
_see_also = ['pull', 'working-trees', 'status-flags']
1533
1761
old_tip=old_tip,
1534
1762
show_base=show_base)
1535
1763
except errors.NoSuchRevision, e:
1536
raise errors.BzrCommandError(
1764
raise errors.BzrCommandError(gettext(
1537
1765
"branch has no revision %s\n"
1538
1766
"bzr update --revision only works"
1539
" for a revision in the branch history"
1767
" for a revision in the branch history")
1540
1768
% (e.revision))
1541
1769
revno = tree.branch.revision_id_to_dotted_revno(
1542
1770
_mod_revision.ensure_null(tree.last_revision()))
1543
note('Updated to revision %s of branch %s' %
1544
('.'.join(map(str, revno)), branch_location))
1771
note(gettext('Updated to revision {0} of branch {1}').format(
1772
'.'.join(map(str, revno)), branch_location))
1545
1773
parent_ids = tree.get_parent_ids()
1546
1774
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1547
note('Your local commits will now show as pending merges with '
1548
"'bzr status', and can be committed with 'bzr commit'.")
1775
note(gettext('Your local commits will now show as pending merges with '
1776
"'bzr status', and can be committed with 'bzr commit'."))
1549
1777
if conflicts != 0:
1941
2174
def run(self, location, format=None, no_trees=False):
1942
2175
if format is None:
1943
format = bzrdir.format_registry.make_bzrdir('default')
2176
format = controldir.format_registry.make_bzrdir('default')
1945
2178
if location is None:
1948
2181
to_transport = transport.get_transport(location)
1949
to_transport.ensure_base()
1951
newdir = format.initialize_on_transport(to_transport)
1952
repo = newdir.create_repository(shared=True)
1953
repo.set_make_working_trees(not no_trees)
2183
(repo, newdir, require_stacking, repository_policy) = (
2184
format.initialize_on_transport_ex(to_transport,
2185
create_prefix=True, make_working_trees=not no_trees,
2186
shared_repo=True, force_new_repo=True,
2187
use_existing_dir=True,
2188
repo_format_name=format.repository_format.get_format_string()))
1954
2189
if not is_quiet():
1955
2190
from bzrlib.info import show_bzrdir_info
1956
show_bzrdir_info(repo.bzrdir, verbose=0, outfile=self.outf)
2191
show_bzrdir_info(newdir, verbose=0, outfile=self.outf)
1959
2194
class cmd_diff(Command):
2480
2722
_get_info_for_log_files,
2482
2724
direction = (forward and 'forward') or 'reverse'
2725
if symbol_versioning.deprecated_passed(include_merges):
2726
ui.ui_factory.show_user_warning(
2727
'deprecated_command_option',
2728
deprecated_name='--include-merges',
2729
recommended_name='--include-merged',
2730
deprecated_in_version='2.5',
2731
command=self.invoked_as)
2732
if include_merged is None:
2733
include_merged = include_merges
2735
raise errors.BzrCommandError(gettext(
2736
'{0} and {1} are mutually exclusive').format(
2737
'--include-merges', '--include-merged'))
2738
if include_merged is None:
2739
include_merged = False
2483
2740
if (exclude_common_ancestry
2484
2741
and (revision is None or len(revision) != 2)):
2485
raise errors.BzrCommandError(
2486
'--exclude-common-ancestry requires -r with two revisions')
2742
raise errors.BzrCommandError(gettext(
2743
'--exclude-common-ancestry requires -r with two revisions'))
2488
2745
if levels is None:
2491
raise errors.BzrCommandError(
2492
'--levels and --include-merges are mutually exclusive')
2748
raise errors.BzrCommandError(gettext(
2749
'{0} and {1} are mutually exclusive').format(
2750
'--levels', '--include-merged'))
2494
2752
if change is not None:
2495
2753
if len(change) > 1:
2496
2754
raise errors.RangeInChangeOption()
2497
2755
if revision is not None:
2498
raise errors.BzrCommandError(
2499
'--revision and --change are mutually exclusive')
2756
raise errors.BzrCommandError(gettext(
2757
'{0} and {1} are mutually exclusive').format(
2758
'--revision', '--change'))
2501
2760
revision = change
2907
3166
self.outf.write("%s\n" % pattern)
2909
3168
if not name_pattern_list:
2910
raise errors.BzrCommandError("ignore requires at least one "
2911
"NAME_PATTERN or --default-rules.")
3169
raise errors.BzrCommandError(gettext("ignore requires at least one "
3170
"NAME_PATTERN or --default-rules."))
2912
3171
name_pattern_list = [globbing.normalize_pattern(p)
2913
3172
for p in name_pattern_list]
2914
3173
bad_patterns = ''
3174
bad_patterns_count = 0
2915
3175
for p in name_pattern_list:
2916
3176
if not globbing.Globster.is_pattern_valid(p):
3177
bad_patterns_count += 1
2917
3178
bad_patterns += ('\n %s' % p)
2918
3179
if bad_patterns:
2919
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
3180
msg = (ngettext('Invalid ignore pattern found. %s',
3181
'Invalid ignore patterns found. %s',
3182
bad_patterns_count) % bad_patterns)
2920
3183
ui.ui_factory.show_error(msg)
2921
3184
raise errors.InvalidPattern('')
2922
3185
for name_pattern in name_pattern_list:
2923
3186
if (name_pattern[0] == '/' or
2924
3187
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2925
raise errors.BzrCommandError(
2926
"NAME_PATTERN should not be an absolute path")
3188
raise errors.BzrCommandError(gettext(
3189
"NAME_PATTERN should not be an absolute path"))
2927
3190
tree, relpath = WorkingTree.open_containing(directory)
2928
3191
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2929
3192
ignored = globbing.Globster(name_pattern_list)
3033
3296
Option('per-file-timestamps',
3034
3297
help='Set modification time of files to that of the last '
3035
3298
'revision in which it was changed.'),
3299
Option('uncommitted',
3300
help='Export the working tree contents rather than that of the '
3037
3303
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
3038
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
3304
root=None, filters=False, per_file_timestamps=False, uncommitted=False,
3039
3306
from bzrlib.export import export
3041
3308
if branch_or_subdir is None:
3042
tree = WorkingTree.open_containing(directory)[0]
3309
branch_or_subdir = directory
3311
(tree, b, subdir) = controldir.ControlDir.open_containing_tree_or_branch(
3313
if tree is not None:
3314
self.add_cleanup(tree.lock_read().unlock)
3318
raise errors.BzrCommandError(
3319
gettext("--uncommitted requires a working tree"))
3046
b, subdir = Branch.open_containing(branch_or_subdir)
3049
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
3322
export_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
3051
export(rev_tree, dest, format, root, subdir, filtered=filters,
3324
export(export_tree, dest, format, root, subdir, filtered=filters,
3052
3325
per_file_timestamps=per_file_timestamps)
3053
3326
except errors.NoSuchExportFormat, e:
3054
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3327
raise errors.BzrCommandError(
3328
gettext('Unsupported export format: %s') % e.format)
3057
3331
class cmd_cat(Command):
3237
3511
aliases = ['ci', 'checkin']
3239
3513
def _iter_bug_fix_urls(self, fixes, branch):
3514
default_bugtracker = None
3240
3515
# Configure the properties for bug fixing attributes.
3241
3516
for fixed_bug in fixes:
3242
3517
tokens = fixed_bug.split(':')
3243
if len(tokens) != 2:
3244
raise errors.BzrCommandError(
3518
if len(tokens) == 1:
3519
if default_bugtracker is None:
3520
branch_config = branch.get_config()
3521
default_bugtracker = branch_config.get_user_option(
3523
if default_bugtracker is None:
3524
raise errors.BzrCommandError(gettext(
3525
"No tracker specified for bug %s. Use the form "
3526
"'tracker:id' or specify a default bug tracker "
3527
"using the `bugtracker` option.\nSee "
3528
"\"bzr help bugs\" for more information on this "
3529
"feature. Commit refused.") % fixed_bug)
3530
tag = default_bugtracker
3532
elif len(tokens) != 2:
3533
raise errors.BzrCommandError(gettext(
3245
3534
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3246
3535
"See \"bzr help bugs\" for more information on this "
3247
"feature.\nCommit refused." % fixed_bug)
3248
tag, bug_id = tokens
3536
"feature.\nCommit refused.") % fixed_bug)
3538
tag, bug_id = tokens
3250
3540
yield bugtracker.get_bug_url(tag, branch, bug_id)
3251
3541
except errors.UnknownBugTrackerAbbreviation:
3252
raise errors.BzrCommandError(
3253
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3542
raise errors.BzrCommandError(gettext(
3543
'Unrecognized bug %s. Commit refused.') % fixed_bug)
3254
3544
except errors.MalformedBugIdentifier, e:
3255
raise errors.BzrCommandError(
3256
"%s\nCommit refused." % (str(e),))
3545
raise errors.BzrCommandError(gettext(
3546
"%s\nCommit refused.") % (str(e),))
3258
3548
def run(self, message=None, file=None, verbose=False, selected_list=None,
3259
3549
unchanged=False, strict=False, local=False, fixes=None,
4579
4898
theirs_only=False,
4580
4899
log_format=None, long=False, short=False, line=False,
4581
4900
show_ids=False, verbose=False, this=False, other=False,
4582
include_merges=False, revision=None, my_revision=None,
4901
include_merged=None, revision=None, my_revision=None,
4903
include_merges=symbol_versioning.DEPRECATED_PARAMETER):
4584
4904
from bzrlib.missing import find_unmerged, iter_log_revisions
4585
4905
def message(s):
4586
4906
if not is_quiet():
4587
4907
self.outf.write(s)
4909
if symbol_versioning.deprecated_passed(include_merges):
4910
ui.ui_factory.show_user_warning(
4911
'deprecated_command_option',
4912
deprecated_name='--include-merges',
4913
recommended_name='--include-merged',
4914
deprecated_in_version='2.5',
4915
command=self.invoked_as)
4916
if include_merged is None:
4917
include_merged = include_merges
4919
raise errors.BzrCommandError(gettext(
4920
'{0} and {1} are mutually exclusive').format(
4921
'--include-merges', '--include-merged'))
4922
if include_merged is None:
4923
include_merged = False
4590
4925
mine_only = this
5043
5385
end_revision=last_revno)
5046
self.outf.write('Dry-run, pretending to remove'
5047
' the above revisions.\n')
5388
self.outf.write(gettext('Dry-run, pretending to remove'
5389
' the above revisions.\n'))
5049
self.outf.write('The above revision(s) will be removed.\n')
5391
self.outf.write(gettext('The above revision(s) will be removed.\n'))
5052
5394
if not ui.ui_factory.confirm_action(
5053
u'Uncommit these revisions',
5395
gettext(u'Uncommit these revisions'),
5054
5396
'bzrlib.builtins.uncommit',
5056
self.outf.write('Canceled\n')
5398
self.outf.write(gettext('Canceled\n'))
5059
5401
mutter('Uncommitting from {%s} to {%s}',
5060
5402
last_rev_id, rev_id)
5061
5403
uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
5062
revno=revno, local=local)
5063
self.outf.write('You can restore the old tip by running:\n'
5064
' bzr pull . -r revid:%s\n' % last_rev_id)
5404
revno=revno, local=local, keep_tags=keep_tags)
5405
self.outf.write(gettext('You can restore the old tip by running:\n'
5406
' bzr pull . -r revid:%s\n') % last_rev_id)
5067
5409
class cmd_break_lock(Command):
5173
5517
return host, port
5175
5519
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5520
protocol=None, client_timeout=None):
5177
5521
from bzrlib import transport
5178
5522
if directory is None:
5179
5523
directory = os.getcwd()
5180
5524
if protocol is None:
5181
5525
protocol = transport.transport_server_registry.get()
5182
5526
host, port = self.get_host_and_port(port)
5183
url = urlutils.local_path_to_url(directory)
5527
url = transport.location_to_url(directory)
5184
5528
if not allow_writes:
5185
5529
url = 'readonly+' + url
5186
t = transport.get_transport(url)
5187
protocol(t, host, port, inet)
5530
t = transport.get_transport_from_url(url)
5532
protocol(t, host, port, inet, client_timeout)
5533
except TypeError, e:
5534
# We use symbol_versioning.deprecated_in just so that people
5535
# grepping can find it here.
5536
# symbol_versioning.deprecated_in((2, 5, 0))
5537
symbol_versioning.warn(
5538
'Got TypeError(%s)\ntrying to call protocol: %s.%s\n'
5539
'Most likely it needs to be updated to support a'
5540
' "timeout" parameter (added in bzr 2.5.0)'
5541
% (e, protocol.__module__, protocol),
5543
protocol(t, host, port, inet)
5190
5546
class cmd_join(Command):
5602
5958
self.add_cleanup(branch.lock_write().unlock)
5604
5960
if tag_name is None:
5605
raise errors.BzrCommandError("No tag specified to delete.")
5961
raise errors.BzrCommandError(gettext("No tag specified to delete."))
5606
5962
branch.tags.delete_tag(tag_name)
5607
note('Deleted tag %s.' % tag_name)
5963
note(gettext('Deleted tag %s.') % tag_name)
5610
5966
if len(revision) != 1:
5611
raise errors.BzrCommandError(
5967
raise errors.BzrCommandError(gettext(
5612
5968
"Tags can only be placed on a single revision, "
5614
5970
revision_id = revision[0].as_revision_id(branch)
5616
5972
revision_id = branch.last_revision()
5617
5973
if tag_name is None:
5618
5974
tag_name = branch.automatic_tag_name(revision_id)
5619
5975
if tag_name is None:
5620
raise errors.BzrCommandError(
5621
"Please specify a tag name.")
5622
if (not force) and branch.tags.has_tag(tag_name):
5976
raise errors.BzrCommandError(gettext(
5977
"Please specify a tag name."))
5979
existing_target = branch.tags.lookup_tag(tag_name)
5980
except errors.NoSuchTag:
5981
existing_target = None
5982
if not force and existing_target not in (None, revision_id):
5623
5983
raise errors.TagAlreadyExists(tag_name)
5624
branch.tags.set_tag(tag_name, revision_id)
5625
note('Created tag %s.' % tag_name)
5984
if existing_target == revision_id:
5985
note(gettext('Tag %s already exists for that revision.') % tag_name)
5987
branch.tags.set_tag(tag_name, revision_id)
5988
if existing_target is None:
5989
note(gettext('Created tag %s.') % tag_name)
5991
note(gettext('Updated tag %s.') % tag_name)
5628
5994
class cmd_tags(Command):
5679
6043
for tag, revspec in tags:
5680
6044
self.outf.write('%-20s %s\n' % (tag, revspec))
6046
def _tags_for_range(self, branch, revision):
6048
rev1, rev2 = _get_revision_range(revision, branch, self.name())
6049
revid1, revid2 = rev1.rev_id, rev2.rev_id
6050
# _get_revision_range will always set revid2 if it's not specified.
6051
# If revid1 is None, it means we want to start from the branch
6052
# origin which is always a valid ancestor. If revid1 == revid2, the
6053
# ancestry check is useless.
6054
if revid1 and revid1 != revid2:
6055
# FIXME: We really want to use the same graph than
6056
# branch.iter_merge_sorted_revisions below, but this is not
6057
# easily available -- vila 2011-09-23
6058
if branch.repository.get_graph().is_ancestor(revid2, revid1):
6059
# We don't want to output anything in this case...
6061
# only show revisions between revid1 and revid2 (inclusive)
6062
tagged_revids = branch.tags.get_reverse_tag_dict()
6064
for r in branch.iter_merge_sorted_revisions(
6065
start_revision_id=revid2, stop_revision_id=revid1,
6066
stop_rule='include'):
6067
revid_tags = tagged_revids.get(r[0], None)
6069
found.extend([(tag, r[0]) for tag in revid_tags])
5683
6073
class cmd_reconfigure(Command):
5684
6074
__doc__ = """Reconfigure the type of a bzr directory.
5698
6088
takes_args = ['location?']
5699
6089
takes_options = [
5700
6090
RegistryOption.from_kwargs(
5702
title='Target type',
5703
help='The type to reconfigure the directory to.',
6093
help='The relation between branch and tree.',
5704
6094
value_switches=True, enum_switch=False,
5705
6095
branch='Reconfigure to be an unbound branch with no working tree.',
5706
6096
tree='Reconfigure to be an unbound branch with a working tree.',
5707
6097
checkout='Reconfigure to be a bound branch with a working tree.',
5708
6098
lightweight_checkout='Reconfigure to be a lightweight'
5709
6099
' checkout (with no local history).',
6101
RegistryOption.from_kwargs(
6103
title='Repository type',
6104
help='Location fo the repository.',
6105
value_switches=True, enum_switch=False,
5710
6106
standalone='Reconfigure to be a standalone branch '
5711
6107
'(i.e. stop using shared repository).',
5712
6108
use_shared='Reconfigure to use a shared repository.',
6110
RegistryOption.from_kwargs(
6112
title='Trees in Repository',
6113
help='Whether new branches in the repository have trees.',
6114
value_switches=True, enum_switch=False,
5713
6115
with_trees='Reconfigure repository to create '
5714
6116
'working trees on branches by default.',
5715
6117
with_no_trees='Reconfigure repository to not create '
5742
6144
# At the moment you can use --stacked-on and a different
5743
6145
# reconfiguration shape at the same time; there seems no good reason
5745
if target_type is None:
6147
if (tree_type is None and
6148
repository_type is None and
6149
repository_trees is None):
5746
6150
if stacked_on or unstacked:
5749
raise errors.BzrCommandError('No target configuration '
5751
elif target_type == 'branch':
6153
raise errors.BzrCommandError(gettext('No target configuration '
6155
reconfiguration = None
6156
if tree_type == 'branch':
5752
6157
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5753
elif target_type == 'tree':
6158
elif tree_type == 'tree':
5754
6159
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5755
elif target_type == 'checkout':
6160
elif tree_type == 'checkout':
5756
6161
reconfiguration = reconfigure.Reconfigure.to_checkout(
5757
6162
directory, bind_to)
5758
elif target_type == 'lightweight-checkout':
6163
elif tree_type == 'lightweight-checkout':
5759
6164
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5760
6165
directory, bind_to)
5761
elif target_type == 'use-shared':
6167
reconfiguration.apply(force)
6168
reconfiguration = None
6169
if repository_type == 'use-shared':
5762
6170
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5763
elif target_type == 'standalone':
6171
elif repository_type == 'standalone':
5764
6172
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5765
elif target_type == 'with-trees':
6174
reconfiguration.apply(force)
6175
reconfiguration = None
6176
if repository_trees == 'with-trees':
5766
6177
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5767
6178
directory, True)
5768
elif target_type == 'with-no-trees':
6179
elif repository_trees == 'with-no-trees':
5769
6180
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5770
6181
directory, False)
5771
reconfiguration.apply(force)
6183
reconfiguration.apply(force)
6184
reconfiguration = None
5774
6187
class cmd_switch(Command):
5809
6222
from bzrlib import switch
5810
6223
tree_location = directory
5811
6224
revision = _get_one_revision('switch', revision)
5812
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
6225
possible_transports = []
6226
control_dir = controldir.ControlDir.open_containing(tree_location,
6227
possible_transports=possible_transports)[0]
5813
6228
if to_location is None:
5814
6229
if revision is None:
5815
raise errors.BzrCommandError('You must supply either a'
5816
' revision or a location')
6230
raise errors.BzrCommandError(gettext('You must supply either a'
6231
' revision or a location'))
5817
6232
to_location = tree_location
5819
branch = control_dir.open_branch()
6234
branch = control_dir.open_branch(
6235
possible_transports=possible_transports)
5820
6236
had_explicit_nick = branch.get_config().has_explicit_nickname()
5821
6237
except errors.NotBranchError:
5823
6239
had_explicit_nick = False
5824
6240
if create_branch:
5825
6241
if branch is None:
5826
raise errors.BzrCommandError('cannot create branch without'
5828
to_location = directory_service.directories.dereference(
5830
if '/' not in to_location and '\\' not in to_location:
5831
# This path is meant to be relative to the existing branch
5832
this_url = self._get_branch_location(control_dir)
5833
to_location = urlutils.join(this_url, '..', to_location)
6242
raise errors.BzrCommandError(
6243
gettext('cannot create branch without source branch'))
6244
to_location = lookup_new_sibling_branch(control_dir, to_location,
6245
possible_transports=possible_transports)
5834
6246
to_branch = branch.bzrdir.sprout(to_location,
5835
possible_transports=[branch.bzrdir.root_transport],
5836
source_branch=branch).open_branch()
6247
possible_transports=possible_transports,
6248
source_branch=branch).open_branch()
5839
to_branch = Branch.open(to_location)
5840
except errors.NotBranchError:
5841
this_url = self._get_branch_location(control_dir)
5842
to_branch = Branch.open(
5843
urlutils.join(this_url, '..', to_location))
6250
to_branch = lookup_sibling_branch(control_dir, to_location)
5844
6251
if revision is not None:
5845
6252
revision = revision.as_revision_id(to_branch)
5846
6253
switch.switch(control_dir, to_branch, force, revision_id=revision)
5847
6254
if had_explicit_nick:
5848
6255
branch = control_dir.open_branch() #get the new branch!
5849
6256
branch.nick = to_branch.nick
5850
note('Switched to branch: %s',
6257
note(gettext('Switched to branch: %s'),
5851
6258
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5853
def _get_branch_location(self, control_dir):
5854
"""Return location of branch for this control dir."""
5856
this_branch = control_dir.open_branch()
5857
# This may be a heavy checkout, where we want the master branch
5858
master_location = this_branch.get_bound_location()
5859
if master_location is not None:
5860
return master_location
5861
# If not, use a local sibling
5862
return this_branch.base
5863
except errors.NotBranchError:
5864
format = control_dir.find_branch_format()
5865
if getattr(format, 'get_reference', None) is not None:
5866
return format.get_reference(control_dir)
5868
return control_dir.root_transport.base
5871
6262
class cmd_view(Command):
5962
6353
name = current_view
5965
raise errors.BzrCommandError(
5966
"Both --delete and a file list specified")
6356
raise errors.BzrCommandError(gettext(
6357
"Both --delete and a file list specified"))
5968
raise errors.BzrCommandError(
5969
"Both --delete and --switch specified")
6359
raise errors.BzrCommandError(gettext(
6360
"Both --delete and --switch specified"))
5971
6362
tree.views.set_view_info(None, {})
5972
self.outf.write("Deleted all views.\n")
6363
self.outf.write(gettext("Deleted all views.\n"))
5973
6364
elif name is None:
5974
raise errors.BzrCommandError("No current view to delete")
6365
raise errors.BzrCommandError(gettext("No current view to delete"))
5976
6367
tree.views.delete_view(name)
5977
self.outf.write("Deleted '%s' view.\n" % name)
6368
self.outf.write(gettext("Deleted '%s' view.\n") % name)
5980
raise errors.BzrCommandError(
5981
"Both --switch and a file list specified")
6371
raise errors.BzrCommandError(gettext(
6372
"Both --switch and a file list specified"))
5983
raise errors.BzrCommandError(
5984
"Both --switch and --all specified")
6374
raise errors.BzrCommandError(gettext(
6375
"Both --switch and --all specified"))
5985
6376
elif switch == 'off':
5986
6377
if current_view is None:
5987
raise errors.BzrCommandError("No current view to disable")
6378
raise errors.BzrCommandError(gettext("No current view to disable"))
5988
6379
tree.views.set_view_info(None, view_dict)
5989
self.outf.write("Disabled '%s' view.\n" % (current_view))
6380
self.outf.write(gettext("Disabled '%s' view.\n") % (current_view))
5991
6382
tree.views.set_view_info(switch, view_dict)
5992
6383
view_str = views.view_display_str(tree.views.lookup_view())
5993
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6384
self.outf.write(gettext("Using '{0}' view: {1}\n").format(switch, view_str))
5996
self.outf.write('Views defined:\n')
6387
self.outf.write(gettext('Views defined:\n'))
5997
6388
for view in sorted(view_dict):
5998
6389
if view == current_view:
6002
6393
view_str = views.view_display_str(view_dict[view])
6003
6394
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
6005
self.outf.write('No views defined.\n')
6396
self.outf.write(gettext('No views defined.\n'))
6006
6397
elif file_list:
6007
6398
if name is None:
6008
6399
# No name given and no current view set
6010
6401
elif name == 'off':
6011
raise errors.BzrCommandError(
6012
"Cannot change the 'off' pseudo view")
6402
raise errors.BzrCommandError(gettext(
6403
"Cannot change the 'off' pseudo view"))
6013
6404
tree.views.set_view(name, sorted(file_list))
6014
6405
view_str = views.view_display_str(tree.views.lookup_view())
6015
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6406
self.outf.write(gettext("Using '{0}' view: {1}\n").format(name, view_str))
6017
6408
# list the files
6018
6409
if name is None:
6019
6410
# No name given and no current view set
6020
self.outf.write('No current view.\n')
6411
self.outf.write(gettext('No current view.\n'))
6022
6413
view_str = views.view_display_str(tree.views.lookup_view(name))
6023
self.outf.write("'%s' view is: %s\n" % (name, view_str))
6414
self.outf.write(gettext("'{0}' view is: {1}\n").format(name, view_str))
6026
6417
class cmd_hooks(Command):