75
76
from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
79
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
78
80
def tree_files(file_list, default_branch=u'.', canonicalize=True,
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]))
82
return internal_tree_files(file_list, default_branch, canonicalize,
88
86
def tree_files_for_add(file_list):
153
151
# XXX: Bad function name; should possibly also be a class method of
154
152
# WorkingTree rather than a function.
153
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
155
154
def internal_tree_files(file_list, default_branch=u'.', canonicalize=True,
156
155
apply_view=True):
157
156
"""Convert command-line paths to a WorkingTree and relative paths.
158
Deprecated: use WorkingTree.open_containing_paths instead.
159
160
This is typically used for command-line processors that take one or
160
161
more filenames, and infer the workingtree that contains them.
172
173
:return: workingtree, [relative_paths]
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)
175
return WorkingTree.open_containing_paths(
176
file_list, default_directory='.',
223
181
def _get_view_info_for_change_reporter(tree):
193
def _open_directory_or_containing_tree_or_branch(filename, directory):
194
"""Open the tree or branch containing the specified file, unless
195
the --directory option is used to specify a different branch."""
196
if directory is not None:
197
return (None, Branch.open(directory), filename)
198
return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
235
201
# TODO: Make sure no commands unconditionally use the working directory as a
236
202
# branch. If a filename argument is used, the first of them should be used to
237
203
# specify the branch. (Perhaps this can be factored out into some kind of
286
252
To skip the display of pending merge information altogether, use
287
253
the no-pending option or specify a file/directory.
289
If a revision argument is given, the status is calculated against
290
that revision, or between two revisions if two are provided.
255
To compare the working directory to a specific revision, pass a
256
single revision to the revision argument.
258
To see which files have changed in a specific revision, or between
259
two revisions, pass a revision range to the revision argument.
260
This will produce the same results as calling 'bzr diff --summarize'.
293
263
# TODO: --no-recurse, --recurse options
315
285
raise errors.BzrCommandError('bzr status --revision takes exactly'
316
286
' one or two revision specifiers')
318
tree, relfile_list = tree_files(file_list)
288
tree, relfile_list = WorkingTree.open_containing_paths(file_list)
319
289
# Avoid asking for specific files when that is not needed.
320
290
if relfile_list == ['']:
321
291
relfile_list = None
353
323
self.outf.write(revtext.decode('utf-8'))
356
def run(self, revision_id=None, revision=None):
326
def run(self, revision_id=None, revision=None, directory=u'.'):
357
327
if revision_id is not None and revision is not None:
358
328
raise errors.BzrCommandError('You can only supply one of'
359
329
' revision_id or --revision')
360
330
if revision_id is None and revision is None:
361
331
raise errors.BzrCommandError('You must supply either'
362
332
' --revision or a revision_id')
363
b = WorkingTree.open_containing(u'.')[0].branch
333
b = WorkingTree.open_containing(directory)[0].branch
365
335
revisions = b.repository.revisions
366
336
if revisions is None:
504
474
if (working.has_changes()):
505
475
raise errors.UncommittedChanges(working)
476
if working.get_shelf_manager().last_shelf() is not None:
477
raise errors.ShelvedChanges(working)
507
479
if working.user_url != working.branch.user_url:
508
480
raise errors.BzrCommandError("You cannot remove the working tree"
552
524
takes_args = ['revision_info*']
553
525
takes_options = [
527
custom_help('directory',
556
528
help='Branch to examine, '
557
'rather than the one containing the working directory.',
529
'rather than the one containing the working directory.'),
561
530
Option('tree', help='Show revno of working tree'),
754
723
raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
756
725
revision = _get_one_revision('inventory', revision)
757
work_tree, file_list = tree_files(file_list)
726
work_tree, file_list = WorkingTree.open_containing_paths(file_list)
758
727
self.add_cleanup(work_tree.lock_read().unlock)
759
728
if revision is not None:
760
729
tree = revision.as_tree(work_tree.branch)
826
795
if len(names_list) < 2:
827
796
raise errors.BzrCommandError("missing file argument")
828
tree, rel_names = tree_files(names_list, canonicalize=False)
797
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
829
798
self.add_cleanup(tree.lock_tree_write().unlock)
830
799
self._run(tree, names_list, rel_names, after)
837
806
raise errors.BzrCommandError('--after cannot be specified with'
839
work_tree, file_list = tree_files(names_list, default_branch='.')
808
work_tree, file_list = WorkingTree.open_containing_paths(
809
names_list, default_directory='.')
840
810
self.add_cleanup(work_tree.lock_tree_write().unlock)
841
811
rename_map.RenameMap.guess_renames(work_tree, dry_run)
951
921
takes_options = ['remember', 'overwrite', 'revision',
952
922
custom_help('verbose',
953
923
help='Show logs of pulled revisions.'),
924
custom_help('directory',
955
925
help='Branch to pull into, '
956
'rather than the one containing the working directory.',
926
'rather than the one containing the working directory.'),
961
928
help="Perform a local pull in a bound "
962
929
"branch. Local pulls are not applied to "
963
930
"the master branch."
933
help="Show base revision text in conflicts.")
966
935
takes_args = ['location?']
967
936
encoding_type = 'replace'
969
938
def run(self, location=None, remember=False, overwrite=False,
970
939
revision=None, verbose=False,
971
directory=None, local=False):
940
directory=None, local=False,
972
942
# FIXME: too much stuff is in the command class
973
943
revision_id = None
983
953
branch_to = Branch.open_containing(directory)[0]
984
954
self.add_cleanup(branch_to.lock_write().unlock)
956
if tree_to is None and show_base:
957
raise errors.BzrCommandError("Need working tree for --show-base.")
986
959
if local and not branch_to.get_bound_location():
987
960
raise errors.LocalRequiresBoundBranch()
1033
1006
view_info=view_info)
1034
1007
result = tree_to.pull(
1035
1008
branch_from, overwrite, revision_id, change_reporter,
1036
possible_transports=possible_transports, local=local)
1009
possible_transports=possible_transports, local=local,
1010
show_base=show_base)
1038
1012
result = branch_to.pull(
1039
1013
branch_from, overwrite, revision_id, local=local)
1076
1050
Option('create-prefix',
1077
1051
help='Create the path leading up to the branch '
1078
1052
'if it does not already exist.'),
1053
custom_help('directory',
1080
1054
help='Branch to push from, '
1081
'rather than the one containing the working directory.',
1055
'rather than the one containing the working directory.'),
1085
1056
Option('use-existing-dir',
1086
1057
help='By default push will fail if the target'
1087
1058
' directory exists, but does not already'
1098
1069
Option('strict',
1099
1070
help='Refuse to push if there are uncommitted changes in'
1100
1071
' the working tree, --no-strict disables the check.'),
1073
help="Don't populate the working tree, even for protocols"
1074
" that support it."),
1102
1076
takes_args = ['location?']
1103
1077
encoding_type = 'replace'
1105
1079
def run(self, location=None, remember=False, overwrite=False,
1106
1080
create_prefix=False, verbose=False, revision=None,
1107
1081
use_existing_dir=False, directory=None, stacked_on=None,
1108
stacked=False, strict=None):
1082
stacked=False, strict=None, no_tree=False):
1109
1083
from bzrlib.push import _show_push_branch
1111
1085
if directory is None:
1157
1131
_show_push_branch(br_from, revision_id, location, self.outf,
1158
1132
verbose=verbose, overwrite=overwrite, remember=remember,
1159
1133
stacked_on=stacked_on, create_prefix=create_prefix,
1160
use_existing_dir=use_existing_dir)
1134
use_existing_dir=use_existing_dir, no_tree=no_tree)
1163
1137
class cmd_branch(Command):
1177
1151
_see_also = ['checkout']
1178
1152
takes_args = ['from_location', 'to_location?']
1179
takes_options = ['revision', Option('hardlink',
1180
help='Hard-link working tree files where possible.'),
1153
takes_options = ['revision',
1154
Option('hardlink', help='Hard-link working tree files where possible.'),
1155
Option('files-from', type=str,
1156
help="Get file contents from this tree."),
1181
1157
Option('no-tree',
1182
1158
help="Create a branch without a working-tree."),
1183
1159
Option('switch',
1202
1178
def run(self, from_location, to_location=None, revision=None,
1203
1179
hardlink=False, stacked=False, standalone=False, no_tree=False,
1204
use_existing_dir=False, switch=False, bind=False):
1180
use_existing_dir=False, switch=False, bind=False,
1205
1182
from bzrlib import switch as _mod_switch
1206
1183
from bzrlib.tag import _merge_tags_if_possible
1207
1184
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1186
if not (hardlink or files_from):
1187
# accelerator_tree is usually slower because you have to read N
1188
# files (no readahead, lots of seeks, etc), but allow the user to
1189
# explicitly request it
1190
accelerator_tree = None
1191
if files_from is not None and files_from != from_location:
1192
accelerator_tree = WorkingTree.open(files_from)
1209
1193
revision = _get_one_revision('branch', revision)
1210
1194
self.add_cleanup(br_from.lock_read().unlock)
1211
1195
if revision is not None:
1318
1302
to_location = branch_location
1319
1303
accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1320
1304
branch_location)
1305
if not (hardlink or files_from):
1306
# accelerator_tree is usually slower because you have to read N
1307
# files (no readahead, lots of seeks, etc), but allow the user to
1308
# explicitly request it
1309
accelerator_tree = None
1321
1310
revision = _get_one_revision('checkout', revision)
1322
if files_from is not None:
1311
if files_from is not None and files_from != branch_location:
1323
1312
accelerator_tree = WorkingTree.open(files_from)
1324
1313
if revision is not None:
1325
1314
revision_id = revision.as_revision_id(source)
1381
1370
If you want to discard your local changes, you can just do a
1382
1371
'bzr revert' instead of 'bzr commit' after the update.
1373
If you want to restore a file that has been removed locally, use
1374
'bzr revert' instead of 'bzr update'.
1384
1376
If the tree's branch is bound to a master branch, it will also update
1385
1377
the branch from the master.
1388
1380
_see_also = ['pull', 'working-trees', 'status-flags']
1389
1381
takes_args = ['dir?']
1390
takes_options = ['revision']
1382
takes_options = ['revision',
1384
help="Show base revision text in conflicts."),
1391
1386
aliases = ['up']
1393
def run(self, dir='.', revision=None):
1388
def run(self, dir='.', revision=None, show_base=None):
1394
1389
if revision is not None and len(revision) != 1:
1395
1390
raise errors.BzrCommandError(
1396
1391
"bzr update --revision takes exactly one revision")
1436
1431
change_reporter,
1437
1432
possible_transports=possible_transports,
1438
1433
revision=revision_id,
1435
show_base=show_base)
1440
1436
except errors.NoSuchRevision, e:
1441
1437
raise errors.BzrCommandError(
1442
1438
"branch has no revision %s\n"
1504
1500
class cmd_remove(Command):
1505
1501
__doc__ = """Remove files or directories.
1507
This makes bzr stop tracking changes to the specified files. bzr will delete
1508
them if they can easily be recovered using revert. If no options or
1509
parameters are given bzr will scan for files that are being tracked by bzr
1510
but missing in your tree and stop tracking them for you.
1503
This makes Bazaar stop tracking changes to the specified files. Bazaar will
1504
delete them if they can easily be recovered using revert otherwise they
1505
will be backed up (adding an extention of the form .~#~). If no options or
1506
parameters are given Bazaar will scan for files that are being tracked by
1507
Bazaar but missing in your tree and stop tracking them for you.
1512
1509
takes_args = ['file*']
1513
1510
takes_options = ['verbose',
1515
1512
RegistryOption.from_kwargs('file-deletion-strategy',
1516
1513
'The file deletion mode to be used.',
1517
1514
title='Deletion Strategy', value_switches=True, enum_switch=False,
1518
safe='Only delete files if they can be'
1519
' safely recovered (default).',
1515
safe='Backup changed files (default).',
1520
1516
keep='Delete from bzr but leave the working copy.',
1517
no_backup='Don\'t backup changed files.',
1521
1518
force='Delete all the specified files, even if they can not be '
1522
'recovered and even if they are non-empty directories.')]
1519
'recovered and even if they are non-empty directories. '
1520
'(deprecated, use no-backup)')]
1523
1521
aliases = ['rm', 'del']
1524
1522
encoding_type = 'replace'
1526
1524
def run(self, file_list, verbose=False, new=False,
1527
1525
file_deletion_strategy='safe'):
1528
tree, file_list = tree_files(file_list)
1526
if file_deletion_strategy == 'force':
1527
note("(The --force option is deprecated, rather use --no-backup "
1529
file_deletion_strategy = 'no-backup'
1531
tree, file_list = WorkingTree.open_containing_paths(file_list)
1530
1533
if file_list is not None:
1531
1534
file_list = [f for f in file_list]
1551
1554
file_deletion_strategy = 'keep'
1552
1555
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1553
1556
keep_files=file_deletion_strategy=='keep',
1554
force=file_deletion_strategy=='force')
1557
force=(file_deletion_strategy=='no-backup'))
1557
1560
class cmd_file_id(Command):
1620
1623
_see_also = ['check']
1621
1624
takes_args = ['branch?']
1626
Option('canonicalize-chks',
1627
help='Make sure CHKs are in canonical form (repairs '
1623
def run(self, branch="."):
1632
def run(self, branch=".", canonicalize_chks=False):
1624
1633
from bzrlib.reconcile import reconcile
1625
1634
dir = bzrdir.BzrDir.open(branch)
1635
reconcile(dir, canonicalize_chks=canonicalize_chks)
1629
1638
class cmd_revision_history(Command):
1707
1716
Option('append-revisions-only',
1708
1717
help='Never change revnos or the existing log.'
1709
' Append revisions to it only.')
1718
' Append revisions to it only.'),
1720
'Create a branch without a working tree.')
1711
1722
def run(self, location=None, format=None, append_revisions_only=False,
1712
create_prefix=False):
1723
create_prefix=False, no_tree=False):
1713
1724
if format is None:
1714
1725
format = bzrdir.format_registry.make_bzrdir('default')
1715
1726
if location is None:
1738
1749
except errors.NotBranchError:
1739
1750
# really a NotBzrDir error...
1740
1751
create_branch = bzrdir.BzrDir.create_branch_convenience
1753
force_new_tree = False
1755
force_new_tree = None
1741
1756
branch = create_branch(to_transport.base, format=format,
1742
possible_transports=[to_transport])
1757
possible_transports=[to_transport],
1758
force_new_tree=force_new_tree)
1743
1759
a_bzrdir = branch.bzrdir
1745
1761
from bzrlib.transport.local import LocalTransport
1749
1765
raise errors.BranchExistsWithoutWorkingTree(location)
1750
1766
raise errors.AlreadyBranchError(location)
1751
1767
branch = a_bzrdir.create_branch()
1752
a_bzrdir.create_workingtree()
1769
a_bzrdir.create_workingtree()
1753
1770
if append_revisions_only:
1755
1772
branch.set_append_revisions_only(True)
1849
1866
"bzr diff -p1" is equivalent to "bzr diff --prefix old/:new/", and
1850
1867
produces patches suitable for "patch -p1".
1869
Note that when using the -r argument with a range of revisions, the
1870
differences are computed between the two specified revisions. That
1871
is, the command does not show the changes introduced by the first
1872
revision in the range. This differs from the interpretation of
1873
revision ranges used by "bzr log" which includes the first revision
1854
1878
2 - unrepresentable changes
1883
1911
bzr diff -r<chosen_parent>..X
1885
The changes introduced by revision 2 (equivalent to -r1..2)::
1913
The changes between the current revision and the previous revision
1914
(equivalent to -c-1 and -r-2..-1)
1889
1918
Show just the differences for file NEWS::
1969
2002
old_branch, new_branch,
1970
2003
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
1971
2004
file_list, revision, old, new, self.add_cleanup, apply_view=True)
2005
# GNU diff on Windows uses ANSI encoding for filenames
2006
path_encoding = osutils.get_diff_header_encoding()
1972
2007
return show_diff_trees(old_tree, new_tree, sys.stdout,
1973
2008
specific_files=specific_files,
1974
2009
external_diff_options=diff_options,
1975
2010
old_label=old_label, new_label=new_label,
1976
extra_trees=extra_trees, using=using,
2011
extra_trees=extra_trees,
2012
path_encoding=path_encoding,
1977
2014
format_cls=format)
1987
2024
# level of effort but possibly much less IO. (Or possibly not,
1988
2025
# if the directories are very large...)
1989
2026
_see_also = ['status', 'ls']
1990
takes_options = ['show-ids']
2027
takes_options = ['directory', 'show-ids']
1992
2029
@display_command
1993
def run(self, show_ids=False):
1994
tree = WorkingTree.open_containing(u'.')[0]
2030
def run(self, show_ids=False, directory=u'.'):
2031
tree = WorkingTree.open_containing(directory)[0]
1995
2032
self.add_cleanup(tree.lock_read().unlock)
1996
2033
old = tree.basis_tree()
1997
2034
self.add_cleanup(old.lock_read().unlock)
2012
2049
_see_also = ['status', 'ls']
2015
help='Write an ascii NUL (\\0) separator '
2016
'between files rather than a newline.')
2050
takes_options = ['directory', 'null']
2019
2052
@display_command
2020
def run(self, null=False):
2021
tree = WorkingTree.open_containing(u'.')[0]
2053
def run(self, null=False, directory=u'.'):
2054
tree = WorkingTree.open_containing(directory)[0]
2022
2055
td = tree.changes_from(tree.basis_tree())
2023
2056
for path, id, kind, text_modified, meta_modified in td.modified:
2035
2068
_see_also = ['status', 'ls']
2038
help='Write an ascii NUL (\\0) separator '
2039
'between files rather than a newline.')
2069
takes_options = ['directory', 'null']
2042
2071
@display_command
2043
def run(self, null=False):
2044
wt = WorkingTree.open_containing(u'.')[0]
2072
def run(self, null=False, directory=u'.'):
2073
wt = WorkingTree.open_containing(directory)[0]
2045
2074
self.add_cleanup(wt.lock_read().unlock)
2046
2075
basis = wt.basis_tree()
2047
2076
self.add_cleanup(basis.lock_read().unlock)
2053
2082
if inv.is_root(file_id) and len(basis_inv) == 0:
2055
2084
path = inv.id2path(file_id)
2056
if not os.access(osutils.abspath(path), os.F_OK):
2085
if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
2059
2088
self.outf.write(path + '\0')
2259
2288
help='Show just the specified revision.'
2260
2289
' See also "help revisionspec".'),
2291
RegistryOption('authors',
2292
'What names to list as authors - first, all or committer.',
2294
lazy_registry=('bzrlib.log', 'author_list_registry'),
2262
2296
Option('levels',
2263
2297
short_name='n',
2264
2298
help='Number of levels to display - 0 for all, 1 for flat.',
2382
2417
show_timezone=timezone,
2383
2418
delta_format=get_verbosity_level(),
2385
show_advice=levels is None)
2420
show_advice=levels is None,
2421
author_list_handler=authors)
2387
2423
# Choose the algorithm for doing the logging. It's annoying
2388
2424
# having multiple code paths like this but necessary until
2505
2541
help='Recurse into subdirectories.'),
2506
2542
Option('from-root',
2507
2543
help='Print paths relative to the root of the branch.'),
2508
Option('unknown', help='Print unknown files.'),
2544
Option('unknown', short_name='u',
2545
help='Print unknown files.'),
2509
2546
Option('versioned', help='Print versioned files.',
2510
2547
short_name='V'),
2511
Option('ignored', help='Print ignored files.'),
2513
help='Write an ascii NUL (\\0) separator '
2514
'between files rather than a newline.'),
2548
Option('ignored', short_name='i',
2549
help='Print ignored files.'),
2550
Option('kind', short_name='k',
2516
2551
help='List entries of a particular kind: file, directory, symlink.',
2520
2557
@display_command
2521
2558
def run(self, revision=None, verbose=False,
2522
2559
recursive=False, from_root=False,
2523
2560
unknown=False, versioned=False, ignored=False,
2524
null=False, kind=None, show_ids=False, path=None):
2561
null=False, kind=None, show_ids=False, path=None, directory=None):
2526
2563
if kind and kind not in ('file', 'directory', 'symlink'):
2527
2564
raise errors.BzrCommandError('invalid kind specified')
2539
2576
raise errors.BzrCommandError('cannot specify both --from-root'
2542
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
2579
tree, branch, relpath = \
2580
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2545
2582
# Calculate the prefix to use
2616
2653
_see_also = ['ls']
2654
takes_options = ['directory']
2618
2656
@display_command
2620
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2657
def run(self, directory=u'.'):
2658
for f in WorkingTree.open_containing(directory)[0].unknowns():
2621
2659
self.outf.write(osutils.quotefn(f) + '\n')
2650
2688
Patterns prefixed with '!!' act as regular ignore patterns, but have
2651
2689
precedence over the '!' exception patterns.
2653
Note: ignore patterns containing shell wildcards must be quoted from
2693
* Ignore patterns containing shell wildcards must be quoted from
2696
* Ignore patterns starting with "#" act as comments in the ignore file.
2697
To ignore patterns that begin with that character, use the "RE:" prefix.
2657
2700
Ignore the top level Makefile::
2689
2736
_see_also = ['status', 'ignored', 'patterns']
2690
2737
takes_args = ['name_pattern*']
2738
takes_options = ['directory',
2692
2739
Option('default-rules',
2693
2740
help='Display the default ignore rules that bzr uses.')
2696
def run(self, name_pattern_list=None, default_rules=None):
2743
def run(self, name_pattern_list=None, default_rules=None,
2697
2745
from bzrlib import ignores
2698
2746
if default_rules is not None:
2699
2747
# dump the default rules and exit
2705
2753
"NAME_PATTERN or --default-rules.")
2706
2754
name_pattern_list = [globbing.normalize_pattern(p)
2707
2755
for p in name_pattern_list]
2757
for p in name_pattern_list:
2758
if not globbing.Globster.is_pattern_valid(p):
2759
bad_patterns += ('\n %s' % p)
2761
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2762
ui.ui_factory.show_error(msg)
2763
raise errors.InvalidPattern('')
2708
2764
for name_pattern in name_pattern_list:
2709
2765
if (name_pattern[0] == '/' or
2710
2766
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2711
2767
raise errors.BzrCommandError(
2712
2768
"NAME_PATTERN should not be an absolute path")
2713
tree, relpath = WorkingTree.open_containing(u'.')
2769
tree, relpath = WorkingTree.open_containing(directory)
2714
2770
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2715
2771
ignored = globbing.Globster(name_pattern_list)
2773
self.add_cleanup(tree.lock_read().unlock)
2718
2774
for entry in tree.list_files():
2720
2776
if id is not None:
2721
2777
filename = entry[0]
2722
2778
if ignored.match(filename):
2723
2779
matches.append(filename)
2725
2780
if len(matches) > 0:
2726
2781
self.outf.write("Warning: the following files are version controlled and"
2727
2782
" match your ignore pattern:\n%s"
2743
2798
encoding_type = 'replace'
2744
2799
_see_also = ['ignore', 'ls']
2800
takes_options = ['directory']
2746
2802
@display_command
2748
tree = WorkingTree.open_containing(u'.')[0]
2803
def run(self, directory=u'.'):
2804
tree = WorkingTree.open_containing(directory)[0]
2749
2805
self.add_cleanup(tree.lock_read().unlock)
2750
2806
for path, file_class, kind, file_id, entry in tree.list_files():
2751
2807
if file_class != 'I':
2765
2821
takes_args = ['revno']
2822
takes_options = ['directory']
2767
2824
@display_command
2768
def run(self, revno):
2825
def run(self, revno, directory=u'.'):
2770
2827
revno = int(revno)
2771
2828
except ValueError:
2772
2829
raise errors.BzrCommandError("not a valid revision-number: %r"
2774
revid = WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2831
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2775
2832
self.outf.write("%s\n" % revid)
2804
2861
================= =========================
2806
2863
takes_args = ['dest', 'branch_or_subdir?']
2864
takes_options = ['directory',
2808
2865
Option('format',
2809
2866
help="Type of file to export to.",
2819
2876
'revision in which it was changed.'),
2821
2878
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2822
root=None, filters=False, per_file_timestamps=False):
2879
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2823
2880
from bzrlib.export import export
2825
2882
if branch_or_subdir is None:
2826
tree = WorkingTree.open_containing(u'.')[0]
2883
tree = WorkingTree.open_containing(directory)[0]
2827
2884
b = tree.branch
2850
2907
_see_also = ['ls']
2908
takes_options = ['directory',
2852
2909
Option('name-from-revision', help='The path name in the old tree.'),
2853
2910
Option('filters', help='Apply content filters to display the '
2854
2911
'convenience form.'),
2860
2917
@display_command
2861
2918
def run(self, filename, revision=None, name_from_revision=False,
2919
filters=False, directory=None):
2863
2920
if revision is not None and len(revision) != 1:
2864
2921
raise errors.BzrCommandError("bzr cat --revision takes exactly"
2865
2922
" one revision specifier")
2866
2923
tree, branch, relpath = \
2867
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2924
_open_directory_or_containing_tree_or_branch(filename, directory)
2868
2925
self.add_cleanup(branch.lock_read().unlock)
2869
2926
return self._run(tree, branch, relpath, filename, revision,
2870
2927
name_from_revision, filters)
3102
3159
properties = {}
3104
tree, selected_list = tree_files(selected_list)
3161
tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3105
3162
if selected_list == ['']:
3106
3163
# workaround - commit of root of tree should be exactly the same
3107
3164
# as just default commit in that tree, and succeed even though
3142
3199
def get_message(commit_obj):
3143
3200
"""Callback to get commit message"""
3145
my_message = codecs.open(
3146
file, 'rt', osutils.get_user_encoding()).read()
3204
my_message = f.read().decode(osutils.get_user_encoding())
3147
3207
elif message is not None:
3148
3208
my_message = message
3178
3238
reporter=None, verbose=verbose, revprops=properties,
3179
3239
authors=author, timestamp=commit_stamp,
3180
3240
timezone=offset,
3181
exclude=safe_relpath_files(tree, exclude))
3241
exclude=tree.safe_relpath_files(exclude))
3182
3242
except PointlessCommit:
3183
3243
raise errors.BzrCommandError("No changes to commit."
3184
3244
" Use --unchanged to commit anyhow.")
3304
3364
bzr whoami "Frank Chu <fchu@example.com>"
3306
takes_options = [ Option('email',
3366
takes_options = [ 'directory',
3307
3368
help='Display email address only.'),
3308
3369
Option('branch',
3309
3370
help='Set identity for the current branch instead of '
3313
3374
encoding_type = 'replace'
3315
3376
@display_command
3316
def run(self, email=False, branch=False, name=None):
3377
def run(self, email=False, branch=False, name=None, directory=None):
3317
3378
if name is None:
3318
# use branch if we're inside one; otherwise global config
3320
c = Branch.open_containing('.')[0].get_config()
3321
except errors.NotBranchError:
3322
c = config.GlobalConfig()
3379
if directory is None:
3380
# use branch if we're inside one; otherwise global config
3382
c = Branch.open_containing(u'.')[0].get_config()
3383
except errors.NotBranchError:
3384
c = _mod_config.GlobalConfig()
3386
c = Branch.open(directory).get_config()
3324
3388
self.outf.write(c.user_email() + '\n')
3329
3393
# display a warning if an email address isn't included in the given name.
3331
config.extract_email_address(name)
3395
_mod_config.extract_email_address(name)
3332
3396
except errors.NoEmailInUsername, e:
3333
3397
warning('"%s" does not seem to contain an email address. '
3334
3398
'This is allowed, but not recommended.', name)
3336
3400
# use global config unless --branch given
3338
c = Branch.open_containing('.')[0].get_config()
3402
if directory is None:
3403
c = Branch.open_containing(u'.')[0].get_config()
3405
c = Branch.open(directory).get_config()
3340
c = config.GlobalConfig()
3407
c = _mod_config.GlobalConfig()
3341
3408
c.set_user_option('email', name)
3354
3421
_see_also = ['info']
3355
3422
takes_args = ['nickname?']
3356
def run(self, nickname=None):
3357
branch = Branch.open_containing(u'.')[0]
3423
takes_options = ['directory']
3424
def run(self, nickname=None, directory=u'.'):
3425
branch = Branch.open_containing(directory)[0]
3358
3426
if nickname is None:
3359
3427
self.printme(branch)
3409
3477
'bzr alias --remove expects an alias to remove.')
3410
3478
# If alias is not found, print something like:
3411
3479
# unalias: foo: not found
3412
c = config.GlobalConfig()
3480
c = _mod_config.GlobalConfig()
3413
3481
c.unset_alias(alias_name)
3415
3483
@display_command
3416
3484
def print_aliases(self):
3417
3485
"""Print out the defined aliases in a similar format to bash."""
3418
aliases = config.GlobalConfig().get_aliases()
3486
aliases = _mod_config.GlobalConfig().get_aliases()
3419
3487
for key, value in sorted(aliases.iteritems()):
3420
3488
self.outf.write('bzr alias %s="%s"\n' % (key, value))
3432
3500
def set_alias(self, alias_name, alias_command):
3433
3501
"""Save the alias in the global config."""
3434
c = config.GlobalConfig()
3502
c = _mod_config.GlobalConfig()
3435
3503
c.set_alias(alias_name, alias_command)
3472
3540
If you set BZR_TEST_PDB=1 when running selftest, failing tests will drop
3473
3541
into a pdb postmortem session.
3543
The --coverage=DIRNAME global option produces a report with covered code
3476
3547
Run only tests relating to 'ignore'::
3510
3581
'throughout the test suite.',
3511
3582
type=get_transport_type),
3512
3583
Option('benchmark',
3513
help='Run the benchmarks rather than selftests.'),
3584
help='Run the benchmarks rather than selftests.',
3514
3586
Option('lsprof-timed',
3515
3587
help='Generate lsprof output for benchmarked'
3516
3588
' sections of code.'),
3517
3589
Option('lsprof-tests',
3518
3590
help='Generate lsprof output for each test.'),
3519
Option('cache-dir', type=str,
3520
help='Cache intermediate benchmark output in this '
3522
3591
Option('first',
3523
3592
help='Run all tests, but run specified tests first.',
3524
3593
short_name='f',
3559
3628
def run(self, testspecs_list=None, verbose=False, one=False,
3560
3629
transport=None, benchmark=None,
3561
lsprof_timed=None, cache_dir=None,
3562
3631
first=False, list_only=False,
3563
3632
randomize=None, exclude=None, strict=False,
3564
3633
load_list=None, debugflag=None, starting_with=None, subunit=False,
3565
3634
parallel=None, lsprof_tests=False):
3566
from bzrlib.tests import selftest
3567
import bzrlib.benchmarks as benchmarks
3568
from bzrlib.benchmarks import tree_creator
3570
# Make deprecation warnings visible, unless -Werror is set
3571
symbol_versioning.activate_deprecation_warnings(override=False)
3573
if cache_dir is not None:
3574
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3635
from bzrlib import tests
3575
3637
if testspecs_list is not None:
3576
3638
pattern = '|'.join(testspecs_list)
3585
3647
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3586
3648
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3587
3649
# stdout, which would corrupt the subunit stream.
3588
if sys.platform == "win32" and sys.stdout.fileno() >= 0:
3650
# FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3651
# following code can be deleted when it's sufficiently deployed
3652
# -- vila/mgz 20100514
3653
if (sys.platform == "win32"
3654
and getattr(sys.stdout, 'fileno', None) is not None):
3590
3656
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3592
3658
self.additional_selftest_args.setdefault(
3593
3659
'suite_decorators', []).append(parallel)
3595
test_suite_factory = benchmarks.test_suite
3596
# Unless user explicitly asks for quiet, be verbose in benchmarks
3597
verbose = not is_quiet()
3598
# TODO: should possibly lock the history file...
3599
benchfile = open(".perf_history", "at", buffering=1)
3600
self.add_cleanup(benchfile.close)
3602
test_suite_factory = None
3661
raise errors.BzrCommandError(
3662
"--benchmark is no longer supported from bzr 2.2; "
3663
"use bzr-usertest instead")
3664
test_suite_factory = None
3604
3665
selftest_kwargs = {"verbose": verbose,
3605
3666
"pattern": pattern,
3606
3667
"stop_on_failure": one,
3608
3669
"test_suite_factory": test_suite_factory,
3609
3670
"lsprof_timed": lsprof_timed,
3610
3671
"lsprof_tests": lsprof_tests,
3611
"bench_history": benchfile,
3612
3672
"matching_tests_first": first,
3613
3673
"list_only": list_only,
3614
3674
"random_seed": randomize,
3619
3679
"starting_with": starting_with
3621
3681
selftest_kwargs.update(self.additional_selftest_args)
3622
result = selftest(**selftest_kwargs)
3683
# Make deprecation warnings visible, unless -Werror is set
3684
cleanup = symbol_versioning.activate_deprecation_warnings(
3687
result = tests.selftest(**selftest_kwargs)
3623
3690
return int(not result)
3682
3749
with bzr send. If neither is specified, the default is the upstream branch
3683
3750
or the branch most recently merged using --remember.
3685
When merging a branch, by default the tip will be merged. To pick a different
3686
revision, pass --revision. If you specify two values, the first will be used as
3687
BASE and the second one as OTHER. Merging individual revisions, or a subset of
3688
available revisions, like this is commonly referred to as "cherrypicking".
3690
Revision numbers are always relative to the branch being merged.
3692
By default, bzr will try to merge in all new work from the other
3693
branch, automatically determining an appropriate base. If this
3694
fails, you may need to give an explicit base.
3752
When merging from a branch, by default bzr will try to merge in all new
3753
work from the other branch, automatically determining an appropriate base
3754
revision. If this fails, you may need to give an explicit base.
3756
To pick a different ending revision, pass "--revision OTHER". bzr will
3757
try to merge in all new work up to and including revision OTHER.
3759
If you specify two values, "--revision BASE..OTHER", only revisions BASE
3760
through OTHER, excluding BASE but including OTHER, will be merged. If this
3761
causes some revisions to be skipped, i.e. if the destination branch does
3762
not already contain revision BASE, such a merge is commonly referred to as
3765
Revision numbers are always relative to the source branch.
3696
3767
Merge will do its best to combine the changes in two branches, but there
3697
3768
are some kinds of problems only a human can fix. When it encounters those,
3764
3835
' completely merged into the source, pull from the'
3765
3836
' source rather than merging. When this happens,'
3766
3837
' you do not need to commit the result.'),
3838
custom_help('directory',
3768
3839
help='Branch to merge into, '
3769
'rather than the one containing the working directory.',
3840
'rather than the one containing the working directory.'),
3773
3841
Option('preview', help='Instead of merging, show a diff of the'
3775
3843
Option('interactive', help='Select changes interactively.',
3875
3943
def _do_preview(self, merger):
3876
3944
from bzrlib.diff import show_diff_trees
3877
3945
result_tree = self._get_preview(merger)
3946
path_encoding = osutils.get_diff_header_encoding()
3878
3947
show_diff_trees(merger.this_tree, result_tree, self.outf,
3879
old_label='', new_label='')
3948
old_label='', new_label='',
3949
path_encoding=path_encoding)
3881
3951
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3882
3952
merger.change_reporter = change_reporter
3962
4032
if ((remember or tree.branch.get_submit_branch() is None) and
3963
4033
user_location is not None):
3964
4034
tree.branch.set_submit_branch(other_branch.base)
3965
_merge_tags_if_possible(other_branch, tree.branch)
4035
# Merge tags (but don't set them in the master branch yet, the user
4036
# might revert this merge). Commit will propagate them.
4037
_merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
3966
4038
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
3967
4039
other_revision_id, base_revision_id, other_branch, base_branch)
3968
4040
if other_path != '':
4069
4141
from bzrlib.conflicts import restore
4070
4142
if merge_type is None:
4071
4143
merge_type = _mod_merge.Merge3Merger
4072
tree, file_list = tree_files(file_list)
4144
tree, file_list = WorkingTree.open_containing_paths(file_list)
4073
4145
self.add_cleanup(tree.lock_write().unlock)
4074
4146
parents = tree.get_parent_ids()
4075
4147
if len(parents) != 2:
4136
4208
last committed revision is used.
4138
4210
To remove only some changes, without reverting to a prior version, use
4139
merge instead. For example, "merge . --revision -2..-3" will remove the
4140
changes introduced by -2, without affecting the changes introduced by -1.
4141
Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
4211
merge instead. For example, "merge . -r -2..-3" (don't forget the ".")
4212
will remove the changes introduced by the second last commit (-2), without
4213
affecting the changes introduced by the last commit (-1). To remove
4214
certain changes on a hunk-by-hunk basis, see the shelve command.
4143
4216
By default, any files that have been manually changed will be backed up
4144
4217
first. (Files changed only by merge are not backed up.) Backup files have
4174
4247
target branches.
4177
_see_also = ['cat', 'export']
4250
_see_also = ['cat', 'export', 'merge', 'shelve']
4178
4251
takes_options = [
4180
4253
Option('no-backup', "Do not save backups of reverted files."),
4186
4259
def run(self, revision=None, no_backup=False, file_list=None,
4187
4260
forget_merges=None):
4188
tree, file_list = tree_files(file_list)
4261
tree, file_list = WorkingTree.open_containing_paths(file_list)
4189
4262
self.add_cleanup(tree.lock_tree_write().unlock)
4190
4263
if forget_merges:
4191
4264
tree.set_parent_ids(tree.get_parent_ids()[:1])
4281
4354
_see_also = ['merge', 'pull']
4282
4355
takes_args = ['other_branch?']
4283
4356
takes_options = [
4284
4358
Option('reverse', 'Reverse the order of revisions.'),
4285
4359
Option('mine-only',
4286
4360
'Display changes in the local branch only.'),
4308
4382
theirs_only=False,
4309
4383
log_format=None, long=False, short=False, line=False,
4310
4384
show_ids=False, verbose=False, this=False, other=False,
4311
include_merges=False, revision=None, my_revision=None):
4385
include_merges=False, revision=None, my_revision=None,
4312
4387
from bzrlib.missing import find_unmerged, iter_log_revisions
4313
4388
def message(s):
4314
4389
if not is_quiet():
4542
4617
Option('long', help='Show commit date in annotations.'),
4546
4622
encoding_type = 'exact'
4548
4624
@display_command
4549
4625
def run(self, filename, all=False, long=False, revision=None,
4626
show_ids=False, directory=None):
4551
4627
from bzrlib.annotate import annotate_file, annotate_file_tree
4552
4628
wt, branch, relpath = \
4553
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4629
_open_directory_or_containing_tree_or_branch(filename, directory)
4554
4630
if wt is not None:
4555
4631
self.add_cleanup(wt.lock_read().unlock)
4581
4657
hidden = True # is this right ?
4582
4658
takes_args = ['revision_id*']
4583
takes_options = ['revision']
4659
takes_options = ['directory', 'revision']
4585
def run(self, revision_id_list=None, revision=None):
4661
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4586
4662
if revision_id_list is not None and revision is not None:
4587
4663
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4588
4664
if revision_id_list is None and revision is None:
4589
4665
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
4590
b = WorkingTree.open_containing(u'.')[0].branch
4666
b = WorkingTree.open_containing(directory)[0].branch
4591
4667
self.add_cleanup(b.lock_write().unlock)
4592
4668
return self._run(b, revision_id_list, revision)
4654
4730
_see_also = ['checkouts', 'unbind']
4655
4731
takes_args = ['location?']
4732
takes_options = ['directory']
4658
def run(self, location=None):
4659
b, relpath = Branch.open_containing(u'.')
4734
def run(self, location=None, directory=u'.'):
4735
b, relpath = Branch.open_containing(directory)
4660
4736
if location is None:
4662
4738
location = b.get_old_bound_location()
4690
4766
_see_also = ['checkouts', 'bind']
4691
4767
takes_args = []
4768
takes_options = ['directory']
4695
b, relpath = Branch.open_containing(u'.')
4770
def run(self, directory=u'.'):
4771
b, relpath = Branch.open_containing(directory)
4696
4772
if not b.unbind():
4697
4773
raise errors.BzrCommandError('Local branch is not bound')
4791
4867
self.outf.write('The above revision(s) will be removed.\n')
4794
if not ui.ui_factory.get_boolean('Are you sure'):
4795
self.outf.write('Canceled')
4870
if not ui.ui_factory.confirm_action(
4871
'Uncommit these revisions',
4872
'bzrlib.builtins.uncommit',
4874
self.outf.write('Canceled\n')
4798
4877
mutter('Uncommitting from {%s} to {%s}',
4806
4885
class cmd_break_lock(Command):
4807
__doc__ = """Break a dead lock on a repository, branch or working directory.
4886
__doc__ = """Break a dead lock.
4888
This command breaks a lock on a repository, branch, working directory or
4809
4891
CAUTION: Locks should only be broken when you are sure that the process
4810
4892
holding the lock has been stopped.
4817
4899
bzr break-lock bzr+ssh://example.com/bzr/foo
4900
bzr break-lock --conf ~/.bazaar
4819
4903
takes_args = ['location?']
4906
help='LOCATION is the directory where the config lock is.'),
4908
help='Do not ask for confirmation before breaking the lock.'),
4821
def run(self, location=None, show=False):
4911
def run(self, location=None, config=False, force=False):
4822
4912
if location is None:
4823
4913
location = u'.'
4824
control, relpath = bzrdir.BzrDir.open_containing(location)
4826
control.break_lock()
4827
except NotImplementedError:
4915
ui.ui_factory = ui.ConfirmationUserInterfacePolicy(ui.ui_factory,
4917
{'bzrlib.lockdir.break': True})
4919
conf = _mod_config.LockableConfig(file_name=location)
4922
control, relpath = bzrdir.BzrDir.open_containing(location)
4924
control.break_lock()
4925
except NotImplementedError:
4831
4929
class cmd_wait_until_signalled(Command):
4860
4958
'result in a dynamically allocated port. The default port '
4861
4959
'depends on the protocol.',
4864
help='Serve contents of this directory.',
4961
custom_help('directory',
4962
help='Serve contents of this directory.'),
4866
4963
Option('allow-writes',
4867
4964
help='By default the server is a readonly server. Supplying '
4868
4965
'--allow-writes enables write access to the contents of '
4896
4993
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4897
4994
protocol=None):
4898
from bzrlib.transport import get_transport, transport_server_registry
4995
from bzrlib import transport
4899
4996
if directory is None:
4900
4997
directory = os.getcwd()
4901
4998
if protocol is None:
4902
protocol = transport_server_registry.get()
4999
protocol = transport.transport_server_registry.get()
4903
5000
host, port = self.get_host_and_port(port)
4904
5001
url = urlutils.local_path_to_url(directory)
4905
5002
if not allow_writes:
4906
5003
url = 'readonly+' + url
4907
transport = get_transport(url)
4908
protocol(transport, host, port, inet)
5004
t = transport.get_transport(url)
5005
protocol(t, host, port, inet)
4911
5008
class cmd_join(Command):
4917
5014
not part of it. (Such trees can be produced by "bzr split", but also by
4918
5015
running "bzr branch" with the target inside a tree.)
4920
The result is a combined tree, with the subtree no longer an independant
5017
The result is a combined tree, with the subtree no longer an independent
4921
5018
part. This is marked as a merge of the subtree into the containing tree,
4922
5019
and all history is preserved.
5022
5120
encoding_type = 'exact'
5024
5122
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5025
sign=False, revision=None, mail_to=None, message=None):
5123
sign=False, revision=None, mail_to=None, message=None,
5026
5125
from bzrlib.revision import ensure_null, NULL_REVISION
5027
5126
include_patch, include_bundle = {
5028
5127
'plain': (False, False),
5029
5128
'diff': (True, False),
5030
5129
'bundle': (True, True),
5032
branch = Branch.open('.')
5131
branch = Branch.open(directory)
5033
5132
stored_submit_branch = branch.get_submit_branch()
5034
5133
if submit_branch is None:
5035
5134
submit_branch = stored_submit_branch
5120
5219
given, in which case it is sent to a file.
5122
5221
Mail is sent using your preferred mail program. This should be transparent
5123
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5222
on Windows (it uses MAPI). On Unix, it requires the xdg-email utility.
5124
5223
If the preferred client can't be found (or used), your editor will be used.
5126
5225
To use a specific mail program, set the mail_client configuration option.
5297
5396
Option('delete',
5298
5397
help='Delete this tag rather than placing it.',
5301
help='Branch in which to place the tag.',
5399
custom_help('directory',
5400
help='Branch in which to place the tag.'),
5305
5401
Option('force',
5306
5402
help='Replace existing tags.',
5338
5434
if (not force) and branch.tags.has_tag(tag_name):
5339
5435
raise errors.TagAlreadyExists(tag_name)
5340
5436
branch.tags.set_tag(tag_name, revision_id)
5341
self.outf.write('Created tag %s.\n' % tag_name)
5437
note('Created tag %s.' % tag_name)
5344
5440
class cmd_tags(Command):
5350
5446
_see_also = ['tag']
5351
5447
takes_options = [
5353
help='Branch whose tags should be displayed.',
5448
custom_help('directory',
5449
help='Branch whose tags should be displayed.'),
5357
5450
RegistryOption.from_kwargs('sort',
5358
5451
'Sort tags by different criteria.', title='Sorting',
5359
alpha='Sort tags lexicographically (default).',
5452
natural='Sort numeric substrings as numbers:'
5453
' suitable for version numbers. (default)',
5454
alpha='Sort tags lexicographically.',
5360
5455
time='Sort tags chronologically.',
5384
5479
# only show revisions between revid1 and revid2 (inclusive)
5385
5480
tags = [(tag, revid) for tag, revid in tags if
5386
5481
graph.is_between(revid, revid1, revid2)]
5482
if sort == 'natural':
5483
def natural_sort_key(tag):
5484
return [f(s) for f,s in
5485
zip(itertools.cycle((unicode.lower,int)),
5486
re.split('([0-9]+)', tag[0]))]
5487
tags.sort(key=natural_sort_key)
5488
elif sort == 'alpha':
5389
5490
elif sort == 'time':
5390
5491
timestamps = {}
5531
5632
takes_args = ['to_location?']
5532
takes_options = [Option('force',
5633
takes_options = ['directory',
5533
5635
help='Switch even if local commits will be lost.'),
5535
5637
Option('create-branch', short_name='b',
5540
5642
def run(self, to_location=None, force=False, create_branch=False,
5643
revision=None, directory=u'.'):
5542
5644
from bzrlib import switch
5645
tree_location = directory
5544
5646
revision = _get_one_revision('switch', revision)
5545
5647
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5546
5648
if to_location is None:
5547
5649
if revision is None:
5548
5650
raise errors.BzrCommandError('You must supply either a'
5549
5651
' revision or a location')
5652
to_location = tree_location
5552
5654
branch = control_dir.open_branch()
5553
5655
had_explicit_nick = branch.get_config().has_explicit_nickname()
5691
tree, file_list = tree_files(file_list, apply_view=False)
5793
tree, file_list = WorkingTree.open_containing_paths(file_list,
5692
5795
current_view, view_dict = tree.views.get_view_info()
5693
5796
if name is None:
5694
5797
name = current_view
5824
5927
You can put multiple items on the shelf, and by default, 'unshelve' will
5825
5928
restore the most recently shelved changes.
5930
For complicated changes, it is possible to edit the changes in a separate
5931
editor program to decide what the file remaining in the working copy
5932
should look like. To do this, add the configuration option
5934
change_editor = PROGRAM @new_path @old_path
5936
where @new_path is replaced with the path of the new version of the
5937
file and @old_path is replaced with the path of the old version of
5938
the file. The PROGRAM should save the new file with the desired
5939
contents of the file in the working tree.
5828
5943
takes_args = ['file*']
5830
5945
takes_options = [
5832
5948
Option('all', help='Shelve all changes.'),
5839
5955
Option('destroy',
5840
5956
help='Destroy removed changes instead of shelving them.'),
5842
_see_also = ['unshelve']
5958
_see_also = ['unshelve', 'configuration']
5844
5960
def run(self, revision=None, all=False, file_list=None, message=None,
5845
writer=None, list=False, destroy=False):
5961
writer=None, list=False, destroy=False, directory=None):
5847
return self.run_for_list()
5963
return self.run_for_list(directory=directory)
5848
5964
from bzrlib.shelf_ui import Shelver
5849
5965
if writer is None:
5850
5966
writer = bzrlib.option.diff_writer_registry.get()
5852
5968
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5853
file_list, message, destroy=destroy)
5969
file_list, message, destroy=destroy, directory=directory)
5858
5974
except errors.UserAbort:
5861
def run_for_list(self):
5862
tree = WorkingTree.open_containing('.')[0]
5977
def run_for_list(self, directory=None):
5978
if directory is None:
5980
tree = WorkingTree.open_containing(directory)[0]
5863
5981
self.add_cleanup(tree.lock_read().unlock)
5864
5982
manager = tree.get_shelf_manager()
5865
5983
shelves = manager.active_shelves()
5885
6003
takes_args = ['shelf_id?']
5886
6004
takes_options = [
5887
6006
RegistryOption.from_kwargs(
5888
6007
'action', help="The action to perform.",
5889
6008
enum_switch=False, value_switches=True,
5898
6017
_see_also = ['shelve']
5900
def run(self, shelf_id=None, action='apply'):
6019
def run(self, shelf_id=None, action='apply', directory=u'.'):
5901
6020
from bzrlib.shelf_ui import Unshelver
5902
unshelver = Unshelver.from_args(shelf_id, action)
6021
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
5904
6023
unshelver.run()
5922
6041
To check what clean-tree will do, use --dry-run.
5924
takes_options = [Option('ignored', help='Delete all ignored files.'),
6043
takes_options = ['directory',
6044
Option('ignored', help='Delete all ignored files.'),
5925
6045
Option('detritus', help='Delete conflict files, merge'
5926
6046
' backups, and failed selftest dirs.'),
5927
6047
Option('unknown',
5930
6050
' deleting them.'),
5931
6051
Option('force', help='Do not prompt before deleting.')]
5932
6052
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
6053
force=False, directory=u'.'):
5934
6054
from bzrlib.clean_tree import clean_tree
5935
6055
if not (unknown or ignored or detritus):
5939
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5940
dry_run=dry_run, no_prompt=force)
6059
clean_tree(directory, unknown=unknown, ignored=ignored,
6060
detritus=detritus, dry_run=dry_run, no_prompt=force)
5943
6063
class cmd_reference(Command):
5992
6112
# be only called once.
5993
6113
for (name, aliases, module_name) in [
5994
6114
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6115
('cmd_config', [], 'bzrlib.config'),
5995
6116
('cmd_dpush', [], 'bzrlib.foreign'),
5996
6117
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
5997
6118
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
5998
6119
('cmd_conflicts', [], 'bzrlib.conflicts'),
5999
6120
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6121
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6001
6123
builtin_command_registry.register_lazy(name, aliases, module_name)