74
75
from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
77
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
78
78
def tree_files(file_list, default_branch=u'.', canonicalize=True,
80
return internal_tree_files(file_list, default_branch, canonicalize,
81
return internal_tree_files(file_list, default_branch, canonicalize,
83
except errors.FileInWrongBranch, e:
84
raise errors.BzrCommandError("%s is not in the same branch as %s" %
85
(e.path, file_list[0]))
84
88
def tree_files_for_add(file_list):
149
153
# XXX: Bad function name; should possibly also be a class method of
150
154
# WorkingTree rather than a function.
151
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
152
155
def internal_tree_files(file_list, default_branch=u'.', canonicalize=True,
153
156
apply_view=True):
154
157
"""Convert command-line paths to a WorkingTree and relative paths.
156
Deprecated: use WorkingTree.open_containing_paths instead.
158
159
This is typically used for command-line processors that take one or
159
160
more filenames, and infer the workingtree that contains them.
171
172
:return: workingtree, [relative_paths]
173
return WorkingTree.open_containing_paths(
174
file_list, default_directory='.',
174
if file_list is None or len(file_list) == 0:
175
tree = WorkingTree.open_containing(default_branch)[0]
176
if tree.supports_views() and apply_view:
177
view_files = tree.views.lookup_view()
179
file_list = view_files
180
view_str = views.view_display_str(view_files)
181
note("Ignoring files outside view. View is %s" % view_str)
182
return tree, file_list
183
tree = WorkingTree.open_containing(osutils.realpath(file_list[0]))[0]
184
return tree, safe_relpath_files(tree, file_list, canonicalize,
185
apply_view=apply_view)
188
def safe_relpath_files(tree, file_list, canonicalize=True, apply_view=True):
189
"""Convert file_list into a list of relpaths in tree.
191
:param tree: A tree to operate on.
192
:param file_list: A list of user provided paths or None.
193
:param apply_view: if True and a view is set, apply it or check that
194
specified files are within it
195
:return: A list of relative paths.
196
:raises errors.PathNotChild: When a provided path is in a different tree
199
if file_list is None:
201
if tree.supports_views() and apply_view:
202
view_files = tree.views.lookup_view()
206
# tree.relpath exists as a "thunk" to osutils, but canonical_relpath
207
# doesn't - fix that up here before we enter the loop.
209
fixer = lambda p: osutils.canonical_relpath(tree.basedir, p)
212
for filename in file_list:
214
relpath = fixer(osutils.dereference_path(filename))
215
if view_files and not osutils.is_inside_any(view_files, relpath):
216
raise errors.FileOutsideView(filename, view_files)
217
new_list.append(relpath)
218
except errors.PathNotChild:
219
raise errors.FileInWrongBranch(tree.branch, filename)
179
223
def _get_view_info_for_change_reporter(tree):
250
294
To skip the display of pending merge information altogether, use
251
295
the no-pending option or specify a file/directory.
253
To compare the working directory to a specific revision, pass a
254
single revision to the revision argument.
256
To see which files have changed in a specific revision, or between
257
two revisions, pass a revision range to the revision argument.
258
This will produce the same results as calling 'bzr diff --summarize'.
297
If a revision argument is given, the status is calculated against
298
that revision, or between two revisions if two are provided.
261
301
# TODO: --no-recurse, --recurse options
485
521
d.destroy_workingtree()
488
class cmd_repair_workingtree(Command):
489
__doc__ = """Reset the working tree state file.
491
This is not meant to be used normally, but more as a way to recover from
492
filesystem corruption, etc. This rebuilds the working inventory back to a
493
'known good' state. Any new modifications (adding a file, renaming, etc)
494
will be lost, though modified files will still be detected as such.
496
Most users will want something more like "bzr revert" or "bzr update"
497
unless the state file has become corrupted.
499
By default this attempts to recover the current state by looking at the
500
headers of the state file. If the state file is too corrupted to even do
501
that, you can supply --revision to force the state of the tree.
504
takes_options = ['revision', 'directory',
506
help='Reset the tree even if it doesn\'t appear to be'
511
def run(self, revision=None, directory='.', force=False):
512
tree, _ = WorkingTree.open_containing(directory)
513
self.add_cleanup(tree.lock_tree_write().unlock)
517
except errors.BzrError:
518
pass # There seems to be a real error here, so we'll reset
521
raise errors.BzrCommandError(
522
'The tree does not appear to be corrupt. You probably'
523
' want "bzr revert" instead. Use "--force" if you are'
524
' sure you want to reset the working tree.')
528
revision_ids = [r.as_revision_id(tree.branch) for r in revision]
530
tree.reset_state(revision_ids)
531
except errors.BzrError, e:
532
if revision_ids is None:
533
extra = (', the header appears corrupt, try passing -r -1'
534
' to set the state to the last commit')
537
raise errors.BzrCommandError('failed to reset the tree state'
541
524
class cmd_revno(Command):
542
525
__doc__ = """Show current revision number.
984
966
"branch. Local pulls are not applied to "
985
967
"the master branch."
988
help="Show base revision text in conflicts.")
990
970
takes_args = ['location?']
991
971
encoding_type = 'replace'
993
973
def run(self, location=None, remember=False, overwrite=False,
994
974
revision=None, verbose=False,
995
directory=None, local=False,
975
directory=None, local=False):
997
976
# FIXME: too much stuff is in the command class
998
977
revision_id = None
1138
1106
def run(self, location=None, remember=False, overwrite=False,
1139
1107
create_prefix=False, verbose=False, revision=None,
1140
1108
use_existing_dir=False, directory=None, stacked_on=None,
1141
stacked=False, strict=None, no_tree=False):
1109
stacked=False, strict=None):
1142
1110
from bzrlib.push import _show_push_branch
1144
1112
if directory is None:
1190
1158
_show_push_branch(br_from, revision_id, location, self.outf,
1191
1159
verbose=verbose, overwrite=overwrite, remember=remember,
1192
1160
stacked_on=stacked_on, create_prefix=create_prefix,
1193
use_existing_dir=use_existing_dir, no_tree=no_tree)
1161
use_existing_dir=use_existing_dir)
1196
1164
class cmd_branch(Command):
1206
1174
To retrieve the branch as of a particular revision, supply the --revision
1207
1175
parameter, as in "branch foo/bar -r 5".
1209
The synonyms 'clone' and 'get' for this command are deprecated.
1212
1178
_see_also = ['checkout']
1213
1179
takes_args = ['from_location', 'to_location?']
1214
takes_options = ['revision',
1215
Option('hardlink', help='Hard-link working tree files where possible.'),
1216
Option('files-from', type=str,
1217
help="Get file contents from this tree."),
1180
takes_options = ['revision', Option('hardlink',
1181
help='Hard-link working tree files where possible.'),
1218
1182
Option('no-tree',
1219
1183
help="Create a branch without a working-tree."),
1220
1184
Option('switch',
1239
1203
def run(self, from_location, to_location=None, revision=None,
1240
1204
hardlink=False, stacked=False, standalone=False, no_tree=False,
1241
use_existing_dir=False, switch=False, bind=False,
1205
use_existing_dir=False, switch=False, bind=False):
1243
1206
from bzrlib import switch as _mod_switch
1244
1207
from bzrlib.tag import _merge_tags_if_possible
1245
if self.invoked_as in ['get', 'clone']:
1246
ui.ui_factory.show_user_warning(
1247
'deprecated_command',
1248
deprecated_name=self.invoked_as,
1249
recommended_name='branch',
1250
deprecated_in_version='2.4')
1251
1208
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1253
if not (hardlink or files_from):
1254
# accelerator_tree is usually slower because you have to read N
1255
# files (no readahead, lots of seeks, etc), but allow the user to
1256
# explicitly request it
1257
accelerator_tree = None
1258
if files_from is not None and files_from != from_location:
1259
accelerator_tree = WorkingTree.open(files_from)
1260
1210
revision = _get_one_revision('branch', revision)
1261
1211
self.add_cleanup(br_from.lock_read().unlock)
1262
1212
if revision is not None:
1369
1319
to_location = branch_location
1370
1320
accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1371
1321
branch_location)
1372
if not (hardlink or files_from):
1373
# accelerator_tree is usually slower because you have to read N
1374
# files (no readahead, lots of seeks, etc), but allow the user to
1375
# explicitly request it
1376
accelerator_tree = None
1377
1322
revision = _get_one_revision('checkout', revision)
1378
if files_from is not None and files_from != branch_location:
1323
if files_from is not None:
1379
1324
accelerator_tree = WorkingTree.open(files_from)
1380
1325
if revision is not None:
1381
1326
revision_id = revision.as_revision_id(source)
1437
1382
If you want to discard your local changes, you can just do a
1438
1383
'bzr revert' instead of 'bzr commit' after the update.
1440
If you want to restore a file that has been removed locally, use
1441
'bzr revert' instead of 'bzr update'.
1443
1385
If the tree's branch is bound to a master branch, it will also update
1444
1386
the branch from the master.
1447
1389
_see_also = ['pull', 'working-trees', 'status-flags']
1448
1390
takes_args = ['dir?']
1449
takes_options = ['revision',
1451
help="Show base revision text in conflicts."),
1391
takes_options = ['revision']
1453
1392
aliases = ['up']
1455
def run(self, dir='.', revision=None, show_base=None):
1394
def run(self, dir='.', revision=None):
1456
1395
if revision is not None and len(revision) != 1:
1457
1396
raise errors.BzrCommandError(
1458
1397
"bzr update --revision takes exactly one revision")
1567
1505
class cmd_remove(Command):
1568
1506
__doc__ = """Remove files or directories.
1570
This makes Bazaar stop tracking changes to the specified files. Bazaar will
1571
delete them if they can easily be recovered using revert otherwise they
1572
will be backed up (adding an extention of the form .~#~). If no options or
1573
parameters are given Bazaar will scan for files that are being tracked by
1574
Bazaar but missing in your tree and stop tracking them for you.
1508
This makes bzr stop tracking changes to the specified files. bzr will delete
1509
them if they can easily be recovered using revert. If no options or
1510
parameters are given bzr will scan for files that are being tracked by bzr
1511
but missing in your tree and stop tracking them for you.
1576
1513
takes_args = ['file*']
1577
1514
takes_options = ['verbose',
1579
1516
RegistryOption.from_kwargs('file-deletion-strategy',
1580
1517
'The file deletion mode to be used.',
1581
1518
title='Deletion Strategy', value_switches=True, enum_switch=False,
1582
safe='Backup changed files (default).',
1519
safe='Only delete files if they can be'
1520
' safely recovered (default).',
1583
1521
keep='Delete from bzr but leave the working copy.',
1584
no_backup='Don\'t backup changed files.',
1585
1522
force='Delete all the specified files, even if they can not be '
1586
'recovered and even if they are non-empty directories. '
1587
'(deprecated, use no-backup)')]
1523
'recovered and even if they are non-empty directories.')]
1588
1524
aliases = ['rm', 'del']
1589
1525
encoding_type = 'replace'
1591
1527
def run(self, file_list, verbose=False, new=False,
1592
1528
file_deletion_strategy='safe'):
1593
if file_deletion_strategy == 'force':
1594
note("(The --force option is deprecated, rather use --no-backup "
1596
file_deletion_strategy = 'no-backup'
1598
tree, file_list = WorkingTree.open_containing_paths(file_list)
1529
tree, file_list = tree_files(file_list)
1600
1531
if file_list is not None:
1601
1532
file_list = [f for f in file_list]
1690
1621
_see_also = ['check']
1691
1622
takes_args = ['branch?']
1693
Option('canonicalize-chks',
1694
help='Make sure CHKs are in canonical form (repairs '
1699
def run(self, branch=".", canonicalize_chks=False):
1624
def run(self, branch="."):
1700
1625
from bzrlib.reconcile import reconcile
1701
1626
dir = bzrdir.BzrDir.open(branch)
1702
reconcile(dir, canonicalize_chks=canonicalize_chks)
1705
1630
class cmd_revision_history(Command):
1783
1708
Option('append-revisions-only',
1784
1709
help='Never change revnos or the existing log.'
1785
' Append revisions to it only.'),
1787
'Create a branch without a working tree.')
1710
' Append revisions to it only.')
1789
1712
def run(self, location=None, format=None, append_revisions_only=False,
1790
create_prefix=False, no_tree=False):
1713
create_prefix=False):
1791
1714
if format is None:
1792
1715
format = bzrdir.format_registry.make_bzrdir('default')
1793
1716
if location is None:
2070
1970
old_branch, new_branch,
2071
1971
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
2072
1972
file_list, revision, old, new, self.add_cleanup, apply_view=True)
2073
# GNU diff on Windows uses ANSI encoding for filenames
2074
path_encoding = osutils.get_diff_header_encoding()
2075
1973
return show_diff_trees(old_tree, new_tree, sys.stdout,
2076
1974
specific_files=specific_files,
2077
1975
external_diff_options=diff_options,
2078
1976
old_label=old_label, new_label=new_label,
2079
extra_trees=extra_trees,
2080
path_encoding=path_encoding,
1977
extra_trees=extra_trees, using=using,
2082
1978
format_cls=format)
2823
2708
"NAME_PATTERN or --default-rules.")
2824
2709
name_pattern_list = [globbing.normalize_pattern(p)
2825
2710
for p in name_pattern_list]
2827
for p in name_pattern_list:
2828
if not globbing.Globster.is_pattern_valid(p):
2829
bad_patterns += ('\n %s' % p)
2831
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2832
ui.ui_factory.show_error(msg)
2833
raise errors.InvalidPattern('')
2834
2711
for name_pattern in name_pattern_list:
2835
2712
if (name_pattern[0] == '/' or
2836
2713
(len(name_pattern) > 1 and name_pattern[1] == ':')):
3114
2991
to trigger updates to external systems like bug trackers. The --fixes
3115
2992
option can be used to record the association between a revision and
3116
2993
one or more bugs. See ``bzr help bugs`` for details.
2995
A selective commit may fail in some cases where the committed
2996
tree would be invalid. Consider::
3001
bzr commit foo -m "committing foo"
3002
bzr mv foo/bar foo/baz
3005
bzr commit foo/bar -m "committing bar but not baz"
3007
In the example above, the last commit will fail by design. This gives
3008
the user the opportunity to decide whether they want to commit the
3009
rename at the same time, separately first, or not at all. (As a general
3010
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
3012
# TODO: Run hooks on tree to-be-committed, and after commit.
3014
# TODO: Strict commit that fails if there are deleted files.
3015
# (what does "deleted files" mean ??)
3017
# TODO: Give better message for -s, --summary, used by tla people
3019
# XXX: verbose currently does nothing
3119
3021
_see_also = ['add', 'bugs', 'hooks', 'uncommit']
3120
3022
takes_args = ['selected*']
3181
3079
def run(self, message=None, file=None, verbose=False, selected_list=None,
3182
3080
unchanged=False, strict=False, local=False, fixes=None,
3183
author=None, show_diff=False, exclude=None, commit_time=None,
3081
author=None, show_diff=False, exclude=None, commit_time=None):
3185
3082
from bzrlib.errors import (
3186
3083
PointlessCommit,
3187
3084
ConflictsInTree,
3201
3098
raise errors.BzrCommandError(
3202
3099
"Could not parse --commit-time: " + str(e))
3101
# TODO: Need a blackbox test for invoking the external editor; may be
3102
# slightly problematic to run this cross-platform.
3104
# TODO: do more checks that the commit will succeed before
3105
# spending the user's valuable time typing a commit message.
3204
3107
properties = {}
3206
tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3109
tree, selected_list = tree_files(selected_list)
3207
3110
if selected_list == ['']:
3208
3111
# workaround - commit of root of tree should be exactly the same
3209
3112
# as just default commit in that tree, and succeed even though
3283
3186
reporter=None, verbose=verbose, revprops=properties,
3284
3187
authors=author, timestamp=commit_stamp,
3285
3188
timezone=offset,
3286
exclude=tree.safe_relpath_files(exclude),
3189
exclude=safe_relpath_files(tree, exclude))
3288
3190
except PointlessCommit:
3289
3191
raise errors.BzrCommandError("No changes to commit."
3290
" Please 'bzr add' the files you want to commit, or use"
3291
" --unchanged to force an empty commit.")
3192
" Use --unchanged to commit anyhow.")
3292
3193
except ConflictsInTree:
3293
3194
raise errors.BzrCommandError('Conflicts detected in working '
3294
3195
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3377
3278
class cmd_upgrade(Command):
3378
__doc__ = """Upgrade a repository, branch or working tree to a newer format.
3380
When the default format has changed after a major new release of
3381
Bazaar, you may be informed during certain operations that you
3382
should upgrade. Upgrading to a newer format may improve performance
3383
or make new features available. It may however limit interoperability
3384
with older repositories or with older versions of Bazaar.
3386
If you wish to upgrade to a particular format rather than the
3387
current default, that can be specified using the --format option.
3388
As a consequence, you can use the upgrade command this way to
3389
"downgrade" to an earlier format, though some conversions are
3390
a one way process (e.g. changing from the 1.x default to the
3391
2.x default) so downgrading is not always possible.
3393
A backup.bzr.~#~ directory is created at the start of the conversion
3394
process (where # is a number). By default, this is left there on
3395
completion. If the conversion fails, delete the new .bzr directory
3396
and rename this one back in its place. Use the --clean option to ask
3397
for the backup.bzr directory to be removed on successful conversion.
3398
Alternatively, you can delete it by hand if everything looks good
3401
If the location given is a shared repository, dependent branches
3402
are also converted provided the repository converts successfully.
3403
If the conversion of a branch fails, remaining branches are still
3406
For more information on upgrades, see the Bazaar Upgrade Guide,
3407
http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3279
__doc__ = """Upgrade branch storage to current format.
3281
The check command or bzr developers may sometimes advise you to run
3282
this command. When the default format has changed you may also be warned
3283
during other operations to upgrade.
3410
_see_also = ['check', 'reconcile', 'formats']
3286
_see_also = ['check']
3411
3287
takes_args = ['url?']
3412
3288
takes_options = [
3413
RegistryOption('format',
3414
help='Upgrade to a specific format. See "bzr help'
3415
' formats" for details.',
3416
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3417
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3418
value_switches=True, title='Branch format'),
3420
help='Remove the backup.bzr directory if successful.'),
3422
help="Show what would be done, but don't actually do anything."),
3289
RegistryOption('format',
3290
help='Upgrade to a specific format. See "bzr help'
3291
' formats" for details.',
3292
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3293
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3294
value_switches=True, title='Branch format'),
3425
def run(self, url='.', format=None, clean=False, dry_run=False):
3297
def run(self, url='.', format=None):
3426
3298
from bzrlib.upgrade import upgrade
3427
exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3429
if len(exceptions) == 1:
3430
# Compatibility with historical behavior
3299
upgrade(url, format)
3436
3302
class cmd_whoami(Command):
3563
3425
'bzr alias --remove expects an alias to remove.')
3564
3426
# If alias is not found, print something like:
3565
3427
# unalias: foo: not found
3566
c = _mod_config.GlobalConfig()
3428
c = config.GlobalConfig()
3567
3429
c.unset_alias(alias_name)
3569
3431
@display_command
3570
3432
def print_aliases(self):
3571
3433
"""Print out the defined aliases in a similar format to bash."""
3572
aliases = _mod_config.GlobalConfig().get_aliases()
3434
aliases = config.GlobalConfig().get_aliases()
3573
3435
for key, value in sorted(aliases.iteritems()):
3574
3436
self.outf.write('bzr alias %s="%s"\n' % (key, value))
3667
3526
'throughout the test suite.',
3668
3527
type=get_transport_type),
3669
3528
Option('benchmark',
3670
help='Run the benchmarks rather than selftests.',
3529
help='Run the benchmarks rather than selftests.'),
3672
3530
Option('lsprof-timed',
3673
3531
help='Generate lsprof output for benchmarked'
3674
3532
' sections of code.'),
3675
3533
Option('lsprof-tests',
3676
3534
help='Generate lsprof output for each test.'),
3535
Option('cache-dir', type=str,
3536
help='Cache intermediate benchmark output in this '
3677
3538
Option('first',
3678
3539
help='Run all tests, but run specified tests first.',
3679
3540
short_name='f',
3714
3575
def run(self, testspecs_list=None, verbose=False, one=False,
3715
3576
transport=None, benchmark=None,
3577
lsprof_timed=None, cache_dir=None,
3717
3578
first=False, list_only=False,
3718
3579
randomize=None, exclude=None, strict=False,
3719
3580
load_list=None, debugflag=None, starting_with=None, subunit=False,
3720
3581
parallel=None, lsprof_tests=False):
3721
from bzrlib import tests
3582
from bzrlib.tests import selftest
3583
import bzrlib.benchmarks as benchmarks
3584
from bzrlib.benchmarks import tree_creator
3586
# Make deprecation warnings visible, unless -Werror is set
3587
symbol_versioning.activate_deprecation_warnings(override=False)
3589
if cache_dir is not None:
3590
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3723
3591
if testspecs_list is not None:
3724
3592
pattern = '|'.join(testspecs_list)
3744
3612
self.additional_selftest_args.setdefault(
3745
3613
'suite_decorators', []).append(parallel)
3747
raise errors.BzrCommandError(
3748
"--benchmark is no longer supported from bzr 2.2; "
3749
"use bzr-usertest instead")
3750
test_suite_factory = None
3615
test_suite_factory = benchmarks.test_suite
3616
# Unless user explicitly asks for quiet, be verbose in benchmarks
3617
verbose = not is_quiet()
3618
# TODO: should possibly lock the history file...
3619
benchfile = open(".perf_history", "at", buffering=1)
3620
self.add_cleanup(benchfile.close)
3622
test_suite_factory = None
3751
3624
selftest_kwargs = {"verbose": verbose,
3752
3625
"pattern": pattern,
3753
3626
"stop_on_failure": one,
3835
3702
with bzr send. If neither is specified, the default is the upstream branch
3836
3703
or the branch most recently merged using --remember.
3838
When merging from a branch, by default bzr will try to merge in all new
3839
work from the other branch, automatically determining an appropriate base
3840
revision. If this fails, you may need to give an explicit base.
3842
To pick a different ending revision, pass "--revision OTHER". bzr will
3843
try to merge in all new work up to and including revision OTHER.
3845
If you specify two values, "--revision BASE..OTHER", only revisions BASE
3846
through OTHER, excluding BASE but including OTHER, will be merged. If this
3847
causes some revisions to be skipped, i.e. if the destination branch does
3848
not already contain revision BASE, such a merge is commonly referred to as
3851
Revision numbers are always relative to the source branch.
3705
When merging a branch, by default the tip will be merged. To pick a different
3706
revision, pass --revision. If you specify two values, the first will be used as
3707
BASE and the second one as OTHER. Merging individual revisions, or a subset of
3708
available revisions, like this is commonly referred to as "cherrypicking".
3710
Revision numbers are always relative to the branch being merged.
3712
By default, bzr will try to merge in all new work from the other
3713
branch, automatically determining an appropriate base. If this
3714
fails, you may need to give an explicit base.
3853
3716
Merge will do its best to combine the changes in two branches, but there
3854
3717
are some kinds of problems only a human can fix. When it encounters those,
4029
3892
def _do_preview(self, merger):
4030
3893
from bzrlib.diff import show_diff_trees
4031
3894
result_tree = self._get_preview(merger)
4032
path_encoding = osutils.get_diff_header_encoding()
4033
3895
show_diff_trees(merger.this_tree, result_tree, self.outf,
4034
old_label='', new_label='',
4035
path_encoding=path_encoding)
3896
old_label='', new_label='')
4037
3898
def _do_merge(self, merger, change_reporter, allow_pending, verified):
4038
3899
merger.change_reporter = change_reporter
4118
3979
if ((remember or tree.branch.get_submit_branch() is None) and
4119
3980
user_location is not None):
4120
3981
tree.branch.set_submit_branch(other_branch.base)
4121
# Merge tags (but don't set them in the master branch yet, the user
4122
# might revert this merge). Commit will propagate them.
4123
_merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
3982
_merge_tags_if_possible(other_branch, tree.branch)
4124
3983
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4125
3984
other_revision_id, base_revision_id, other_branch, base_branch)
4126
3985
if other_path != '':
4294
4153
last committed revision is used.
4296
4155
To remove only some changes, without reverting to a prior version, use
4297
merge instead. For example, "merge . -r -2..-3" (don't forget the ".")
4298
will remove the changes introduced by the second last commit (-2), without
4299
affecting the changes introduced by the last commit (-1). To remove
4300
certain changes on a hunk-by-hunk basis, see the shelve command.
4156
merge instead. For example, "merge . --revision -2..-3" will remove the
4157
changes introduced by -2, without affecting the changes introduced by -1.
4158
Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
4302
4160
By default, any files that have been manually changed will be backed up
4303
4161
first. (Files changed only by merge are not backed up.) Backup files have
4633
4491
@display_command
4634
4492
def run(self, verbose=False):
4635
from bzrlib import plugin
4636
self.outf.writelines(
4637
plugin.describe_plugins(show_paths=verbose))
4493
import bzrlib.plugin
4494
from inspect import getdoc
4496
for name, plugin in bzrlib.plugin.plugins().items():
4497
version = plugin.__version__
4498
if version == 'unknown':
4500
name_ver = '%s %s' % (name, version)
4501
d = getdoc(plugin.module)
4503
doc = d.split('\n')[0]
4505
doc = '(no description)'
4506
result.append((name_ver, doc, plugin.path()))
4507
for name_ver, doc, path in sorted(result):
4508
self.outf.write("%s\n" % name_ver)
4509
self.outf.write(" %s\n" % doc)
4511
self.outf.write(" %s\n" % path)
4512
self.outf.write("\n")
4640
4515
class cmd_testament(Command):
4704
4577
self.add_cleanup(branch.lock_read().unlock)
4705
4578
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4706
4579
self.add_cleanup(tree.lock_read().unlock)
4707
if wt is not None and revision is None:
4708
4581
file_id = wt.path2id(relpath)
4710
4583
file_id = tree.path2id(relpath)
4711
4584
if file_id is None:
4712
4585
raise errors.NotVersionedError(filename)
4586
file_version = tree.inventory[file_id].revision
4713
4587
if wt is not None and revision is None:
4714
4588
# If there is a tree and we're not annotating historical
4715
4589
# versions, annotate the working tree's content.
4716
4590
annotate_file_tree(wt, file_id, self.outf, long, all,
4717
4591
show_ids=show_ids)
4719
annotate_file_tree(tree, file_id, self.outf, long, all,
4720
show_ids=show_ids, branch=branch)
4593
annotate_file(branch, file_version, file_id, long, all, self.outf,
4723
4597
class cmd_re_sign(Command):
4969
4837
bzr break-lock bzr+ssh://example.com/bzr/foo
4970
bzr break-lock --conf ~/.bazaar
4973
4839
takes_args = ['location?']
4976
help='LOCATION is the directory where the config lock is.'),
4978
help='Do not ask for confirmation before breaking the lock.'),
4981
def run(self, location=None, config=False, force=False):
4841
def run(self, location=None, show=False):
4982
4842
if location is None:
4983
4843
location = u'.'
4985
ui.ui_factory = ui.ConfirmationUserInterfacePolicy(ui.ui_factory,
4987
{'bzrlib.lockdir.break': True})
4989
conf = _mod_config.LockableConfig(file_name=location)
4992
control, relpath = bzrdir.BzrDir.open_containing(location)
4994
control.break_lock()
4995
except NotImplementedError:
4844
control, relpath = bzrdir.BzrDir.open_containing(location)
4846
control.break_lock()
4847
except NotImplementedError:
4999
4851
class cmd_wait_until_signalled(Command):
5063
4915
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5064
4916
protocol=None):
5065
from bzrlib import transport
4917
from bzrlib.transport import get_transport, transport_server_registry
5066
4918
if directory is None:
5067
4919
directory = os.getcwd()
5068
4920
if protocol is None:
5069
protocol = transport.transport_server_registry.get()
4921
protocol = transport_server_registry.get()
5070
4922
host, port = self.get_host_and_port(port)
5071
4923
url = urlutils.local_path_to_url(directory)
5072
4924
if not allow_writes:
5073
4925
url = 'readonly+' + url
5074
t = transport.get_transport(url)
5075
protocol(t, host, port, inet)
4926
transport = get_transport(url)
4927
protocol(transport, host, port, inet)
5078
4930
class cmd_join(Command):
5517
5369
takes_options = [
5518
5370
custom_help('directory',
5519
5371
help='Branch whose tags should be displayed.'),
5520
RegistryOption('sort',
5372
RegistryOption.from_kwargs('sort',
5521
5373
'Sort tags by different criteria.', title='Sorting',
5522
lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5374
alpha='Sort tags lexicographically (default).',
5375
time='Sort tags chronologically.',
5528
5381
@display_command
5529
def run(self, directory='.', sort=None, show_ids=False, revision=None):
5530
from bzrlib.tag import tag_sort_methods
5531
5388
branch, relpath = Branch.open_containing(directory)
5533
5390
tags = branch.tags.get_tag_dict().items()
5542
5399
# only show revisions between revid1 and revid2 (inclusive)
5543
5400
tags = [(tag, revid) for tag, revid in tags if
5544
5401
graph.is_between(revid, revid1, revid2)]
5546
sort = tag_sort_methods.get()
5404
elif sort == 'time':
5406
for tag, revid in tags:
5408
revobj = branch.repository.get_revision(revid)
5409
except errors.NoSuchRevision:
5410
timestamp = sys.maxint # place them at the end
5412
timestamp = revobj.timestamp
5413
timestamps[revid] = timestamp
5414
tags.sort(key=lambda x: timestamps[x[1]])
5548
5415
if not show_ids:
5549
5416
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5550
5417
for index, (tag, revid) in enumerate(tags):
5974
5840
You can put multiple items on the shelf, and by default, 'unshelve' will
5975
5841
restore the most recently shelved changes.
5977
For complicated changes, it is possible to edit the changes in a separate
5978
editor program to decide what the file remaining in the working copy
5979
should look like. To do this, add the configuration option
5981
change_editor = PROGRAM @new_path @old_path
5983
where @new_path is replaced with the path of the new version of the
5984
file and @old_path is replaced with the path of the old version of
5985
the file. The PROGRAM should save the new file with the desired
5986
contents of the file in the working tree.
5990
5844
takes_args = ['file*']
6002
5856
Option('destroy',
6003
5857
help='Destroy removed changes instead of shelving them.'),
6005
_see_also = ['unshelve', 'configuration']
5859
_see_also = ['unshelve']
6007
5861
def run(self, revision=None, all=False, file_list=None, message=None,
6008
writer=None, list=False, destroy=False, directory=None):
5862
writer=None, list=False, destroy=False, directory=u'.'):
6010
return self.run_for_list(directory=directory)
5864
return self.run_for_list()
6011
5865
from bzrlib.shelf_ui import Shelver
6012
5866
if writer is None:
6013
5867
writer = bzrlib.option.diff_writer_registry.get()
6090
5942
takes_options = ['directory',
6091
5943
Option('ignored', help='Delete all ignored files.'),
6092
Option('detritus', help='Delete conflict files, merge and revert'
5944
Option('detritus', help='Delete conflict files, merge'
6093
5945
' backups, and failed selftest dirs.'),
6094
5946
Option('unknown',
6095
5947
help='Delete files unknown to bzr (default).'),
6154
6006
self.outf.write('%s %s\n' % (path, location))
6157
class cmd_export_pot(Command):
6158
__doc__ = """Export command helps and error messages in po format."""
6163
from bzrlib.export_pot import export_pot
6164
export_pot(self.outf)
6167
6009
def _register_lazy_builtins():
6168
6010
# register lazy builtins from other modules; called at startup and should
6169
6011
# be only called once.
6170
6012
for (name, aliases, module_name) in [
6171
6013
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6172
('cmd_config', [], 'bzrlib.config'),
6173
6014
('cmd_dpush', [], 'bzrlib.foreign'),
6174
6015
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6175
6016
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6176
6017
('cmd_conflicts', [], 'bzrlib.conflicts'),
6177
6018
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6178
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6180
6020
builtin_command_registry.register_lazy(name, aliases, module_name)