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):
191
def _open_directory_or_containing_tree_or_branch(filename, directory):
192
"""Open the tree or branch containing the specified file, unless
193
the --directory option is used to specify a different branch."""
194
if directory is not None:
195
return (None, Branch.open(directory), filename)
196
return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
199
235
# TODO: Make sure no commands unconditionally use the working directory as a
200
236
# branch. If a filename argument is used, the first of them should be used to
201
237
# specify the branch. (Perhaps this can be factored out into some kind of
279
315
raise errors.BzrCommandError('bzr status --revision takes exactly'
280
316
' one or two revision specifiers')
282
tree, relfile_list = WorkingTree.open_containing_paths(file_list)
318
tree, relfile_list = tree_files(file_list)
283
319
# Avoid asking for specific files when that is not needed.
284
320
if relfile_list == ['']:
285
321
relfile_list = None
317
353
self.outf.write(revtext.decode('utf-8'))
320
def run(self, revision_id=None, revision=None, directory=u'.'):
356
def run(self, revision_id=None, revision=None):
321
357
if revision_id is not None and revision is not None:
322
358
raise errors.BzrCommandError('You can only supply one of'
323
359
' revision_id or --revision')
324
360
if revision_id is None and revision is None:
325
361
raise errors.BzrCommandError('You must supply either'
326
362
' --revision or a revision_id')
327
b = WorkingTree.open_containing(directory)[0].branch
363
b = WorkingTree.open_containing(u'.')[0].branch
329
365
revisions = b.repository.revisions
330
366
if revisions is None:
468
504
if (working.has_changes()):
469
505
raise errors.UncommittedChanges(working)
470
if working.get_shelf_manager().last_shelf() is not None:
471
raise errors.ShelvedChanges(working)
473
507
if working.user_url != working.branch.user_url:
474
508
raise errors.BzrCommandError("You cannot remove the working tree"
496
530
wt = WorkingTree.open_containing(location)[0]
497
self.add_cleanup(wt.lock_read().unlock)
498
532
except (errors.NoWorkingTree, errors.NotLocalUrl):
499
533
raise errors.NoWorkingTree(location)
534
self.add_cleanup(wt.unlock)
500
535
revid = wt.last_revision()
502
537
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
505
540
revno = ".".join(str(n) for n in revno_t)
507
542
b = Branch.open_containing(location)[0]
508
self.add_cleanup(b.lock_read().unlock)
544
self.add_cleanup(b.unlock)
509
545
revno = b.revno()
510
546
self.cleanup_now()
511
547
self.outf.write(str(revno) + '\n')
518
554
takes_args = ['revision_info*']
519
555
takes_options = [
521
custom_help('directory',
522
558
help='Branch to examine, '
523
'rather than the one containing the working directory.'),
559
'rather than the one containing the working directory.',
524
563
Option('tree', help='Show revno of working tree'),
532
571
wt = WorkingTree.open_containing(directory)[0]
534
self.add_cleanup(wt.lock_read().unlock)
574
self.add_cleanup(wt.unlock)
535
575
except (errors.NoWorkingTree, errors.NotLocalUrl):
537
577
b = Branch.open_containing(directory)[0]
538
self.add_cleanup(b.lock_read().unlock)
579
self.add_cleanup(b.unlock)
539
580
revision_ids = []
540
581
if revision is not None:
541
582
revision_ids.extend(rev.as_revision_id(b) for rev in revision)
640
681
should_print=(not is_quiet()))
643
self.add_cleanup(base_tree.lock_read().unlock)
684
base_tree.lock_read()
685
self.add_cleanup(base_tree.unlock)
644
686
tree, file_list = tree_files_for_add(file_list)
645
687
added, ignored = tree.smart_add(file_list, not
646
688
no_recurse, action=action, save=not dry_run)
717
759
raise errors.BzrCommandError('invalid kind %r specified' % (kind,))
719
761
revision = _get_one_revision('inventory', revision)
720
work_tree, file_list = WorkingTree.open_containing_paths(file_list)
721
self.add_cleanup(work_tree.lock_read().unlock)
762
work_tree, file_list = tree_files(file_list)
763
work_tree.lock_read()
764
self.add_cleanup(work_tree.unlock)
722
765
if revision is not None:
723
766
tree = revision.as_tree(work_tree.branch)
725
768
extra_trees = [work_tree]
726
self.add_cleanup(tree.lock_read().unlock)
770
self.add_cleanup(tree.unlock)
789
833
if len(names_list) < 2:
790
834
raise errors.BzrCommandError("missing file argument")
791
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
792
self.add_cleanup(tree.lock_tree_write().unlock)
835
tree, rel_names = tree_files(names_list, canonicalize=False)
836
tree.lock_tree_write()
837
self.add_cleanup(tree.unlock)
793
838
self._run(tree, names_list, rel_names, after)
795
840
def run_auto(self, names_list, after, dry_run):
800
845
raise errors.BzrCommandError('--after cannot be specified with'
802
work_tree, file_list = WorkingTree.open_containing_paths(
803
names_list, default_directory='.')
804
self.add_cleanup(work_tree.lock_tree_write().unlock)
847
work_tree, file_list = tree_files(names_list, default_branch='.')
848
work_tree.lock_tree_write()
849
self.add_cleanup(work_tree.unlock)
805
850
rename_map.RenameMap.guess_renames(work_tree, dry_run)
807
852
def _run(self, tree, names_list, rel_names, after):
915
960
takes_options = ['remember', 'overwrite', 'revision',
916
961
custom_help('verbose',
917
962
help='Show logs of pulled revisions.'),
918
custom_help('directory',
919
964
help='Branch to pull into, '
920
'rather than the one containing the working directory.'),
965
'rather than the one containing the working directory.',
922
970
help="Perform a local pull in a bound "
923
971
"branch. Local pulls are not applied to "
939
987
tree_to = WorkingTree.open_containing(directory)[0]
940
988
branch_to = tree_to.branch
941
self.add_cleanup(tree_to.lock_write().unlock)
990
self.add_cleanup(tree_to.unlock)
942
991
except errors.NoWorkingTree:
944
993
branch_to = Branch.open_containing(directory)[0]
945
self.add_cleanup(branch_to.lock_write().unlock)
994
branch_to.lock_write()
995
self.add_cleanup(branch_to.unlock)
947
997
if local and not branch_to.get_bound_location():
948
998
raise errors.LocalRequiresBoundBranch()
980
1030
branch_from = Branch.open(location,
981
1031
possible_transports=possible_transports)
982
self.add_cleanup(branch_from.lock_read().unlock)
1032
branch_from.lock_read()
1033
self.add_cleanup(branch_from.unlock)
984
1035
if branch_to.get_parent() is None or remember:
985
1036
branch_to.set_parent(branch_from.base)
1037
1088
Option('create-prefix',
1038
1089
help='Create the path leading up to the branch '
1039
1090
'if it does not already exist.'),
1040
custom_help('directory',
1041
1092
help='Branch to push from, '
1042
'rather than the one containing the working directory.'),
1093
'rather than the one containing the working directory.',
1043
1097
Option('use-existing-dir',
1044
1098
help='By default push will fail if the target'
1045
1099
' directory exists, but does not already'
1135
1189
_see_also = ['checkout']
1136
1190
takes_args = ['from_location', 'to_location?']
1137
takes_options = ['revision',
1138
Option('hardlink', help='Hard-link working tree files where possible.'),
1139
Option('files-from', type=str,
1140
help="Get file contents from this tree."),
1191
takes_options = ['revision', Option('hardlink',
1192
help='Hard-link working tree files where possible.'),
1141
1193
Option('no-tree',
1142
1194
help="Create a branch without a working-tree."),
1143
1195
Option('switch',
1162
1214
def run(self, from_location, to_location=None, revision=None,
1163
1215
hardlink=False, stacked=False, standalone=False, no_tree=False,
1164
use_existing_dir=False, switch=False, bind=False,
1216
use_existing_dir=False, switch=False, bind=False):
1166
1217
from bzrlib import switch as _mod_switch
1167
1218
from bzrlib.tag import _merge_tags_if_possible
1168
1219
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1170
if not (hardlink or files_from):
1171
# accelerator_tree is usually slower because you have to read N
1172
# files (no readahead, lots of seeks, etc), but allow the user to
1173
# explicitly request it
1174
accelerator_tree = None
1175
if files_from is not None and files_from != from_location:
1176
accelerator_tree = WorkingTree.open(files_from)
1177
1221
revision = _get_one_revision('branch', revision)
1178
self.add_cleanup(br_from.lock_read().unlock)
1223
self.add_cleanup(br_from.unlock)
1179
1224
if revision is not None:
1180
1225
revision_id = revision.as_revision_id(br_from)
1286
1331
to_location = branch_location
1287
1332
accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1288
1333
branch_location)
1289
if not (hardlink or files_from):
1290
# accelerator_tree is usually slower because you have to read N
1291
# files (no readahead, lots of seeks, etc), but allow the user to
1292
# explicitly request it
1293
accelerator_tree = None
1294
1334
revision = _get_one_revision('checkout', revision)
1295
if files_from is not None and files_from != branch_location:
1335
if files_from is not None:
1296
1336
accelerator_tree = WorkingTree.open(files_from)
1297
1337
if revision is not None:
1298
1338
revision_id = revision.as_revision_id(source)
1326
1366
@display_command
1327
1367
def run(self, dir=u'.'):
1328
1368
tree = WorkingTree.open_containing(dir)[0]
1329
self.add_cleanup(tree.lock_read().unlock)
1370
self.add_cleanup(tree.unlock)
1330
1371
new_inv = tree.inventory
1331
1372
old_tree = tree.basis_tree()
1332
self.add_cleanup(old_tree.lock_read().unlock)
1373
old_tree.lock_read()
1374
self.add_cleanup(old_tree.unlock)
1333
1375
old_inv = old_tree.inventory
1335
1377
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1354
1396
If you want to discard your local changes, you can just do a
1355
1397
'bzr revert' instead of 'bzr commit' after the update.
1357
If you want to restore a file that has been removed locally, use
1358
'bzr revert' instead of 'bzr update'.
1360
1399
If the tree's branch is bound to a master branch, it will also update
1361
1400
the branch from the master.
1376
1415
master = branch.get_master_branch(
1377
1416
possible_transports=possible_transports)
1378
1417
if master is not None:
1379
1419
branch_location = master.base
1421
tree.lock_tree_write()
1382
1422
branch_location = tree.branch.base
1383
tree.lock_tree_write()
1384
1423
self.add_cleanup(tree.unlock)
1385
1424
# get rid of the final '/' and be ready for display
1386
1425
branch_location = urlutils.unescape_for_display(
1480
1519
class cmd_remove(Command):
1481
1520
__doc__ = """Remove files or directories.
1483
This makes Bazaar stop tracking changes to the specified files. Bazaar will
1484
delete them if they can easily be recovered using revert otherwise they
1485
will be backed up (adding an extention of the form .~#~). If no options or
1486
parameters are given Bazaar will scan for files that are being tracked by
1487
Bazaar but missing in your tree and stop tracking them for you.
1522
This makes bzr stop tracking changes to the specified files. bzr will delete
1523
them if they can easily be recovered using revert. If no options or
1524
parameters are given bzr will scan for files that are being tracked by bzr
1525
but missing in your tree and stop tracking them for you.
1489
1527
takes_args = ['file*']
1490
1528
takes_options = ['verbose',
1492
1530
RegistryOption.from_kwargs('file-deletion-strategy',
1493
1531
'The file deletion mode to be used.',
1494
1532
title='Deletion Strategy', value_switches=True, enum_switch=False,
1495
safe='Backup changed files (default).',
1533
safe='Only delete files if they can be'
1534
' safely recovered (default).',
1496
1535
keep='Delete from bzr but leave the working copy.',
1497
1536
force='Delete all the specified files, even if they can not be '
1498
1537
'recovered and even if they are non-empty directories.')]
1502
1541
def run(self, file_list, verbose=False, new=False,
1503
1542
file_deletion_strategy='safe'):
1504
tree, file_list = WorkingTree.open_containing_paths(file_list)
1543
tree, file_list = tree_files(file_list)
1506
1545
if file_list is not None:
1507
1546
file_list = [f for f in file_list]
1509
self.add_cleanup(tree.lock_write().unlock)
1549
self.add_cleanup(tree.unlock)
1510
1550
# Heuristics should probably all move into tree.remove_smart or
1596
1636
_see_also = ['check']
1597
1637
takes_args = ['branch?']
1599
Option('canonicalize-chks',
1600
help='Make sure CHKs are in canonical form (repairs '
1605
def run(self, branch=".", canonicalize_chks=False):
1639
def run(self, branch="."):
1606
1640
from bzrlib.reconcile import reconcile
1607
1641
dir = bzrdir.BzrDir.open(branch)
1608
reconcile(dir, canonicalize_chks=canonicalize_chks)
1611
1645
class cmd_revision_history(Command):
1955
1985
old_branch, new_branch,
1956
1986
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
1957
1987
file_list, revision, old, new, self.add_cleanup, apply_view=True)
1958
# GNU diff on Windows uses ANSI encoding for filenames
1959
path_encoding = osutils.get_diff_header_encoding()
1960
1988
return show_diff_trees(old_tree, new_tree, sys.stdout,
1961
1989
specific_files=specific_files,
1962
1990
external_diff_options=diff_options,
1963
1991
old_label=old_label, new_label=new_label,
1964
extra_trees=extra_trees,
1965
path_encoding=path_encoding,
1992
extra_trees=extra_trees, using=using,
1967
1993
format_cls=format)
1977
2003
# level of effort but possibly much less IO. (Or possibly not,
1978
2004
# if the directories are very large...)
1979
2005
_see_also = ['status', 'ls']
1980
takes_options = ['directory', 'show-ids']
2006
takes_options = ['show-ids']
1982
2008
@display_command
1983
def run(self, show_ids=False, directory=u'.'):
1984
tree = WorkingTree.open_containing(directory)[0]
1985
self.add_cleanup(tree.lock_read().unlock)
2009
def run(self, show_ids=False):
2010
tree = WorkingTree.open_containing(u'.')[0]
2012
self.add_cleanup(tree.unlock)
1986
2013
old = tree.basis_tree()
1987
self.add_cleanup(old.lock_read().unlock)
2015
self.add_cleanup(old.unlock)
1988
2016
for path, ie in old.inventory.iter_entries():
1989
2017
if not tree.has_id(ie.file_id):
1990
2018
self.outf.write(path)
2002
2030
_see_also = ['status', 'ls']
2003
takes_options = ['directory', 'null']
2033
help='Write an ascii NUL (\\0) separator '
2034
'between files rather than a newline.')
2005
2037
@display_command
2006
def run(self, null=False, directory=u'.'):
2007
tree = WorkingTree.open_containing(directory)[0]
2038
def run(self, null=False):
2039
tree = WorkingTree.open_containing(u'.')[0]
2008
2040
td = tree.changes_from(tree.basis_tree())
2009
2041
for path, id, kind, text_modified, meta_modified in td.modified:
2021
2053
_see_also = ['status', 'ls']
2022
takes_options = ['directory', 'null']
2056
help='Write an ascii NUL (\\0) separator '
2057
'between files rather than a newline.')
2024
2060
@display_command
2025
def run(self, null=False, directory=u'.'):
2026
wt = WorkingTree.open_containing(directory)[0]
2027
self.add_cleanup(wt.lock_read().unlock)
2061
def run(self, null=False):
2062
wt = WorkingTree.open_containing(u'.')[0]
2064
self.add_cleanup(wt.unlock)
2028
2065
basis = wt.basis_tree()
2029
self.add_cleanup(basis.lock_read().unlock)
2067
self.add_cleanup(basis.unlock)
2030
2068
basis_inv = basis.inventory
2031
2069
inv = wt.inventory
2032
2070
for file_id in inv:
2035
2073
if inv.is_root(file_id) and len(basis_inv) == 0:
2037
2075
path = inv.id2path(file_id)
2038
if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
2076
if not os.access(osutils.abspath(path), os.F_OK):
2041
2079
self.outf.write(path + '\0')
2241
2279
help='Show just the specified revision.'
2242
2280
' See also "help revisionspec".'),
2244
RegistryOption('authors',
2245
'What names to list as authors - first, all or committer.',
2247
lazy_registry=('bzrlib.log', 'author_list_registry'),
2249
2282
Option('levels',
2250
2283
short_name='n',
2251
2284
help='Number of levels to display - 0 for all, 1 for flat.',
2321
2353
# find the file ids to log and check for directory filtering
2322
2354
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2323
revision, file_list, self.add_cleanup)
2355
revision, file_list)
2356
self.add_cleanup(b.unlock)
2324
2357
for relpath, file_id, kind in file_info_list:
2325
2358
if file_id is None:
2326
2359
raise errors.BzrCommandError(
2345
2378
dir, relpath = bzrdir.BzrDir.open_containing(location)
2346
2379
b = dir.open_branch()
2347
self.add_cleanup(b.lock_read().unlock)
2381
self.add_cleanup(b.unlock)
2348
2382
rev1, rev2 = _get_revision_range(revision, b, self.name())
2350
2384
# Decide on the type of delta & diff filtering to use
2370
2404
show_timezone=timezone,
2371
2405
delta_format=get_verbosity_level(),
2373
show_advice=levels is None,
2374
author_list_handler=authors)
2407
show_advice=levels is None)
2376
2409
# Choose the algorithm for doing the logging. It's annoying
2377
2410
# having multiple code paths like this but necessary until
2475
2508
tree, relpath = WorkingTree.open_containing(filename)
2476
2509
file_id = tree.path2id(relpath)
2477
2510
b = tree.branch
2478
self.add_cleanup(b.lock_read().unlock)
2512
self.add_cleanup(b.unlock)
2479
2513
touching_revs = log.find_touching_revisions(b, file_id)
2480
2514
for revno, revision_id, what in touching_revs:
2481
2515
self.outf.write("%6d %s\n" % (revno, what))
2494
2528
help='Recurse into subdirectories.'),
2495
2529
Option('from-root',
2496
2530
help='Print paths relative to the root of the branch.'),
2497
Option('unknown', short_name='u',
2498
help='Print unknown files.'),
2531
Option('unknown', help='Print unknown files.'),
2499
2532
Option('versioned', help='Print versioned files.',
2500
2533
short_name='V'),
2501
Option('ignored', short_name='i',
2502
help='Print ignored files.'),
2503
Option('kind', short_name='k',
2534
Option('ignored', help='Print ignored files.'),
2536
help='Write an ascii NUL (\\0) separator '
2537
'between files rather than a newline.'),
2504
2539
help='List entries of a particular kind: file, directory, symlink.',
2510
2543
@display_command
2511
2544
def run(self, revision=None, verbose=False,
2512
2545
recursive=False, from_root=False,
2513
2546
unknown=False, versioned=False, ignored=False,
2514
null=False, kind=None, show_ids=False, path=None, directory=None):
2547
null=False, kind=None, show_ids=False, path=None):
2516
2549
if kind and kind not in ('file', 'directory', 'symlink'):
2517
2550
raise errors.BzrCommandError('invalid kind specified')
2529
2562
raise errors.BzrCommandError('cannot specify both --from-root'
2532
tree, branch, relpath = \
2533
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2565
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
2535
2568
# Calculate the prefix to use
2551
2584
view_str = views.view_display_str(view_files)
2552
2585
note("Ignoring files outside view. View is %s" % view_str)
2554
self.add_cleanup(tree.lock_read().unlock)
2588
self.add_cleanup(tree.unlock)
2555
2589
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2556
2590
from_dir=relpath, recursive=recursive):
2557
2591
# Apply additional masking
2606
2640
_see_also = ['ls']
2607
takes_options = ['directory']
2609
2642
@display_command
2610
def run(self, directory=u'.'):
2611
for f in WorkingTree.open_containing(directory)[0].unknowns():
2644
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2612
2645
self.outf.write(osutils.quotefn(f) + '\n')
2680
2713
_see_also = ['status', 'ignored', 'patterns']
2681
2714
takes_args = ['name_pattern*']
2682
takes_options = ['directory',
2683
2716
Option('default-rules',
2684
2717
help='Display the default ignore rules that bzr uses.')
2687
def run(self, name_pattern_list=None, default_rules=None,
2720
def run(self, name_pattern_list=None, default_rules=None):
2689
2721
from bzrlib import ignores
2690
2722
if default_rules is not None:
2691
2723
# dump the default rules and exit
2697
2729
"NAME_PATTERN or --default-rules.")
2698
2730
name_pattern_list = [globbing.normalize_pattern(p)
2699
2731
for p in name_pattern_list]
2701
for p in name_pattern_list:
2702
if not globbing.Globster.is_pattern_valid(p):
2703
bad_patterns += ('\n %s' % p)
2705
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2706
ui.ui_factory.show_error(msg)
2707
raise errors.InvalidPattern('')
2708
2732
for name_pattern in name_pattern_list:
2709
2733
if (name_pattern[0] == '/' or
2710
2734
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2711
2735
raise errors.BzrCommandError(
2712
2736
"NAME_PATTERN should not be an absolute path")
2713
tree, relpath = WorkingTree.open_containing(directory)
2737
tree, relpath = WorkingTree.open_containing(u'.')
2714
2738
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2715
2739
ignored = globbing.Globster(name_pattern_list)
2717
self.add_cleanup(tree.lock_read().unlock)
2718
2742
for entry in tree.list_files():
2720
2744
if id is not None:
2721
2745
filename = entry[0]
2722
2746
if ignored.match(filename):
2723
2747
matches.append(filename)
2724
2749
if len(matches) > 0:
2725
2750
self.outf.write("Warning: the following files are version controlled and"
2726
2751
" match your ignore pattern:\n%s"
2742
2767
encoding_type = 'replace'
2743
2768
_see_also = ['ignore', 'ls']
2744
takes_options = ['directory']
2746
2770
@display_command
2747
def run(self, directory=u'.'):
2748
tree = WorkingTree.open_containing(directory)[0]
2749
self.add_cleanup(tree.lock_read().unlock)
2772
tree = WorkingTree.open_containing(u'.')[0]
2774
self.add_cleanup(tree.unlock)
2750
2775
for path, file_class, kind, file_id, entry in tree.list_files():
2751
2776
if file_class != 'I':
2765
2790
takes_args = ['revno']
2766
takes_options = ['directory']
2768
2792
@display_command
2769
def run(self, revno, directory=u'.'):
2793
def run(self, revno):
2771
2795
revno = int(revno)
2772
2796
except ValueError:
2773
2797
raise errors.BzrCommandError("not a valid revision-number: %r"
2775
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2799
revid = WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2776
2800
self.outf.write("%s\n" % revid)
2805
2829
================= =========================
2807
2831
takes_args = ['dest', 'branch_or_subdir?']
2808
takes_options = ['directory',
2809
2833
Option('format',
2810
2834
help="Type of file to export to.",
2820
2844
'revision in which it was changed.'),
2822
2846
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2823
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2847
root=None, filters=False, per_file_timestamps=False):
2824
2848
from bzrlib.export import export
2826
2850
if branch_or_subdir is None:
2827
tree = WorkingTree.open_containing(directory)[0]
2851
tree = WorkingTree.open_containing(u'.')[0]
2828
2852
b = tree.branch
2851
2875
_see_also = ['ls']
2852
takes_options = ['directory',
2853
2877
Option('name-from-revision', help='The path name in the old tree.'),
2854
2878
Option('filters', help='Apply content filters to display the '
2855
2879
'convenience form.'),
2861
2885
@display_command
2862
2886
def run(self, filename, revision=None, name_from_revision=False,
2863
filters=False, directory=None):
2864
2888
if revision is not None and len(revision) != 1:
2865
2889
raise errors.BzrCommandError("bzr cat --revision takes exactly"
2866
2890
" one revision specifier")
2867
2891
tree, branch, relpath = \
2868
_open_directory_or_containing_tree_or_branch(filename, directory)
2869
self.add_cleanup(branch.lock_read().unlock)
2892
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2894
self.add_cleanup(branch.unlock)
2870
2895
return self._run(tree, branch, relpath, filename, revision,
2871
2896
name_from_revision, filters)
2875
2900
if tree is None:
2876
2901
tree = b.basis_tree()
2877
2902
rev_tree = _get_one_revision_tree('cat', revision, branch=b)
2878
self.add_cleanup(rev_tree.lock_read().unlock)
2903
rev_tree.lock_read()
2904
self.add_cleanup(rev_tree.unlock)
2880
2906
old_file_id = rev_tree.path2id(relpath)
3103
3129
properties = {}
3105
tree, selected_list = WorkingTree.open_containing_paths(selected_list)
3131
tree, selected_list = tree_files(selected_list)
3106
3132
if selected_list == ['']:
3107
3133
# workaround - commit of root of tree should be exactly the same
3108
3134
# as just default commit in that tree, and succeed even though
3143
3169
def get_message(commit_obj):
3144
3170
"""Callback to get commit message"""
3148
my_message = f.read().decode(osutils.get_user_encoding())
3172
my_message = codecs.open(
3173
file, 'rt', osutils.get_user_encoding()).read()
3151
3174
elif message is not None:
3152
3175
my_message = message
3182
3205
reporter=None, verbose=verbose, revprops=properties,
3183
3206
authors=author, timestamp=commit_stamp,
3184
3207
timezone=offset,
3185
exclude=tree.safe_relpath_files(exclude))
3208
exclude=safe_relpath_files(tree, exclude))
3186
3209
except PointlessCommit:
3187
3210
raise errors.BzrCommandError("No changes to commit."
3188
3211
" Use --unchanged to commit anyhow.")
3308
3331
bzr whoami "Frank Chu <fchu@example.com>"
3310
takes_options = [ 'directory',
3333
takes_options = [ Option('email',
3312
3334
help='Display email address only.'),
3313
3335
Option('branch',
3314
3336
help='Set identity for the current branch instead of '
3318
3340
encoding_type = 'replace'
3320
3342
@display_command
3321
def run(self, email=False, branch=False, name=None, directory=None):
3343
def run(self, email=False, branch=False, name=None):
3322
3344
if name is None:
3323
if directory is None:
3324
# use branch if we're inside one; otherwise global config
3326
c = Branch.open_containing(u'.')[0].get_config()
3327
except errors.NotBranchError:
3328
c = _mod_config.GlobalConfig()
3330
c = Branch.open(directory).get_config()
3345
# use branch if we're inside one; otherwise global config
3347
c = Branch.open_containing('.')[0].get_config()
3348
except errors.NotBranchError:
3349
c = config.GlobalConfig()
3332
3351
self.outf.write(c.user_email() + '\n')
3337
3356
# display a warning if an email address isn't included in the given name.
3339
_mod_config.extract_email_address(name)
3358
config.extract_email_address(name)
3340
3359
except errors.NoEmailInUsername, e:
3341
3360
warning('"%s" does not seem to contain an email address. '
3342
3361
'This is allowed, but not recommended.', name)
3344
3363
# use global config unless --branch given
3346
if directory is None:
3347
c = Branch.open_containing(u'.')[0].get_config()
3349
c = Branch.open(directory).get_config()
3365
c = Branch.open_containing('.')[0].get_config()
3351
c = _mod_config.GlobalConfig()
3367
c = config.GlobalConfig()
3352
3368
c.set_user_option('email', name)
3365
3381
_see_also = ['info']
3366
3382
takes_args = ['nickname?']
3367
takes_options = ['directory']
3368
def run(self, nickname=None, directory=u'.'):
3369
branch = Branch.open_containing(directory)[0]
3383
def run(self, nickname=None):
3384
branch = Branch.open_containing(u'.')[0]
3370
3385
if nickname is None:
3371
3386
self.printme(branch)
3421
3436
'bzr alias --remove expects an alias to remove.')
3422
3437
# If alias is not found, print something like:
3423
3438
# unalias: foo: not found
3424
c = _mod_config.GlobalConfig()
3439
c = config.GlobalConfig()
3425
3440
c.unset_alias(alias_name)
3427
3442
@display_command
3428
3443
def print_aliases(self):
3429
3444
"""Print out the defined aliases in a similar format to bash."""
3430
aliases = _mod_config.GlobalConfig().get_aliases()
3445
aliases = config.GlobalConfig().get_aliases()
3431
3446
for key, value in sorted(aliases.iteritems()):
3432
3447
self.outf.write('bzr alias %s="%s"\n' % (key, value))
3444
3459
def set_alias(self, alias_name, alias_command):
3445
3460
"""Save the alias in the global config."""
3446
c = _mod_config.GlobalConfig()
3461
c = config.GlobalConfig()
3447
3462
c.set_alias(alias_name, alias_command)
3484
3499
If you set BZR_TEST_PDB=1 when running selftest, failing tests will drop
3485
3500
into a pdb postmortem session.
3487
The --coverage=DIRNAME global option produces a report with covered code
3491
3503
Run only tests relating to 'ignore'::
3525
3537
'throughout the test suite.',
3526
3538
type=get_transport_type),
3527
3539
Option('benchmark',
3528
help='Run the benchmarks rather than selftests.',
3540
help='Run the benchmarks rather than selftests.'),
3530
3541
Option('lsprof-timed',
3531
3542
help='Generate lsprof output for benchmarked'
3532
3543
' sections of code.'),
3533
3544
Option('lsprof-tests',
3534
3545
help='Generate lsprof output for each test.'),
3546
Option('cache-dir', type=str,
3547
help='Cache intermediate benchmark output in this '
3535
3549
Option('first',
3536
3550
help='Run all tests, but run specified tests first.',
3537
3551
short_name='f',
3572
3586
def run(self, testspecs_list=None, verbose=False, one=False,
3573
3587
transport=None, benchmark=None,
3588
lsprof_timed=None, cache_dir=None,
3575
3589
first=False, list_only=False,
3576
3590
randomize=None, exclude=None, strict=False,
3577
3591
load_list=None, debugflag=None, starting_with=None, subunit=False,
3578
3592
parallel=None, lsprof_tests=False):
3579
from bzrlib import tests
3593
from bzrlib.tests import selftest
3594
import bzrlib.benchmarks as benchmarks
3595
from bzrlib.benchmarks import tree_creator
3597
# Make deprecation warnings visible, unless -Werror is set
3598
symbol_versioning.activate_deprecation_warnings(override=False)
3600
if cache_dir is not None:
3601
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3581
3602
if testspecs_list is not None:
3582
3603
pattern = '|'.join(testspecs_list)
3591
3612
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3592
3613
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3593
3614
# stdout, which would corrupt the subunit stream.
3594
# FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3595
# following code can be deleted when it's sufficiently deployed
3596
# -- vila/mgz 20100514
3597
if (sys.platform == "win32"
3598
and getattr(sys.stdout, 'fileno', None) is not None):
3615
if sys.platform == "win32" and sys.stdout.fileno() >= 0:
3600
3617
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3602
3619
self.additional_selftest_args.setdefault(
3603
3620
'suite_decorators', []).append(parallel)
3605
raise errors.BzrCommandError(
3606
"--benchmark is no longer supported from bzr 2.2; "
3607
"use bzr-usertest instead")
3608
test_suite_factory = None
3622
test_suite_factory = benchmarks.test_suite
3623
# Unless user explicitly asks for quiet, be verbose in benchmarks
3624
verbose = not is_quiet()
3625
# TODO: should possibly lock the history file...
3626
benchfile = open(".perf_history", "at", buffering=1)
3627
self.add_cleanup(benchfile.close)
3629
test_suite_factory = None
3609
3631
selftest_kwargs = {"verbose": verbose,
3610
3632
"pattern": pattern,
3611
3633
"stop_on_failure": one,
3613
3635
"test_suite_factory": test_suite_factory,
3614
3636
"lsprof_timed": lsprof_timed,
3615
3637
"lsprof_tests": lsprof_tests,
3638
"bench_history": benchfile,
3616
3639
"matching_tests_first": first,
3617
3640
"list_only": list_only,
3618
3641
"random_seed": randomize,
3623
3646
"starting_with": starting_with
3625
3648
selftest_kwargs.update(self.additional_selftest_args)
3627
# Make deprecation warnings visible, unless -Werror is set
3628
cleanup = symbol_versioning.activate_deprecation_warnings(
3631
result = tests.selftest(**selftest_kwargs)
3649
result = selftest(**selftest_kwargs)
3634
3650
return int(not result)
3675
3691
branch1 = Branch.open_containing(branch)[0]
3676
3692
branch2 = Branch.open_containing(other)[0]
3677
self.add_cleanup(branch1.lock_read().unlock)
3678
self.add_cleanup(branch2.lock_read().unlock)
3694
self.add_cleanup(branch1.unlock)
3696
self.add_cleanup(branch2.unlock)
3679
3697
last1 = ensure_null(branch1.last_revision())
3680
3698
last2 = ensure_null(branch2.last_revision())
3775
3793
' completely merged into the source, pull from the'
3776
3794
' source rather than merging. When this happens,'
3777
3795
' you do not need to commit the result.'),
3778
custom_help('directory',
3779
3797
help='Branch to merge into, '
3780
'rather than the one containing the working directory.'),
3798
'rather than the one containing the working directory.',
3781
3802
Option('preview', help='Instead of merging, show a diff of the'
3783
3804
Option('interactive', help='Select changes interactively.',
3816
3837
unversioned_filter=tree.is_ignored, view_info=view_info)
3817
3838
pb = ui.ui_factory.nested_progress_bar()
3818
3839
self.add_cleanup(pb.finished)
3819
self.add_cleanup(tree.lock_write().unlock)
3841
self.add_cleanup(tree.unlock)
3820
3842
if location is not None:
3822
3844
mergeable = bundle.read_mergeable_from_url(location,
3883
3905
def _do_preview(self, merger):
3884
3906
from bzrlib.diff import show_diff_trees
3885
3907
result_tree = self._get_preview(merger)
3886
path_encoding = osutils.get_diff_header_encoding()
3887
3908
show_diff_trees(merger.this_tree, result_tree, self.outf,
3888
old_label='', new_label='',
3889
path_encoding=path_encoding)
3909
old_label='', new_label='')
3891
3911
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3892
3912
merger.change_reporter = change_reporter
4079
4099
from bzrlib.conflicts import restore
4080
4100
if merge_type is None:
4081
4101
merge_type = _mod_merge.Merge3Merger
4082
tree, file_list = WorkingTree.open_containing_paths(file_list)
4083
self.add_cleanup(tree.lock_write().unlock)
4102
tree, file_list = tree_files(file_list)
4104
self.add_cleanup(tree.unlock)
4084
4105
parents = tree.get_parent_ids()
4085
4106
if len(parents) != 2:
4086
4107
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4196
4217
def run(self, revision=None, no_backup=False, file_list=None,
4197
4218
forget_merges=None):
4198
tree, file_list = WorkingTree.open_containing_paths(file_list)
4199
self.add_cleanup(tree.lock_tree_write().unlock)
4219
tree, file_list = tree_files(file_list)
4220
tree.lock_tree_write()
4221
self.add_cleanup(tree.unlock)
4200
4222
if forget_merges:
4201
4223
tree.set_parent_ids(tree.get_parent_ids()[:1])
4291
4313
_see_also = ['merge', 'pull']
4292
4314
takes_args = ['other_branch?']
4293
4315
takes_options = [
4295
4316
Option('reverse', 'Reverse the order of revisions.'),
4296
4317
Option('mine-only',
4297
4318
'Display changes in the local branch only.'),
4319
4340
theirs_only=False,
4320
4341
log_format=None, long=False, short=False, line=False,
4321
4342
show_ids=False, verbose=False, this=False, other=False,
4322
include_merges=False, revision=None, my_revision=None,
4343
include_merges=False, revision=None, my_revision=None):
4324
4344
from bzrlib.missing import find_unmerged, iter_log_revisions
4325
4345
def message(s):
4326
4346
if not is_quiet():
4339
4359
elif theirs_only:
4340
4360
restrict = 'remote'
4342
local_branch = Branch.open_containing(directory)[0]
4343
self.add_cleanup(local_branch.lock_read().unlock)
4362
local_branch = Branch.open_containing(u".")[0]
4363
local_branch.lock_read()
4364
self.add_cleanup(local_branch.unlock)
4345
4366
parent = local_branch.get_parent()
4346
4367
if other_branch is None:
4357
4378
if remote_branch.base == local_branch.base:
4358
4379
remote_branch = local_branch
4360
self.add_cleanup(remote_branch.lock_read().unlock)
4381
remote_branch.lock_read()
4382
self.add_cleanup(remote_branch.unlock)
4362
4384
local_revid_range = _revision_range_to_revid_range(
4363
4385
_get_revision_range(my_revision, local_branch,
4418
4440
message("Branches are up to date.\n")
4419
4441
self.cleanup_now()
4420
4442
if not status_code and parent is None and other_branch is not None:
4421
self.add_cleanup(local_branch.lock_write().unlock)
4443
local_branch.lock_write()
4444
self.add_cleanup(local_branch.unlock)
4422
4445
# handle race conditions - a parent might be set while we run.
4423
4446
if local_branch.get_parent() is None:
4424
4447
local_branch.set_parent(remote_branch.base)
4554
4578
Option('long', help='Show commit date in annotations.'),
4559
4582
encoding_type = 'exact'
4561
4584
@display_command
4562
4585
def run(self, filename, all=False, long=False, revision=None,
4563
show_ids=False, directory=None):
4564
4587
from bzrlib.annotate import annotate_file, annotate_file_tree
4565
4588
wt, branch, relpath = \
4566
_open_directory_or_containing_tree_or_branch(filename, directory)
4589
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4567
4590
if wt is not None:
4568
self.add_cleanup(wt.lock_read().unlock)
4592
self.add_cleanup(wt.unlock)
4570
self.add_cleanup(branch.lock_read().unlock)
4595
self.add_cleanup(branch.unlock)
4571
4596
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4572
self.add_cleanup(tree.lock_read().unlock)
4598
self.add_cleanup(tree.unlock)
4573
4599
if wt is not None:
4574
4600
file_id = wt.path2id(relpath)
4594
4620
hidden = True # is this right ?
4595
4621
takes_args = ['revision_id*']
4596
takes_options = ['directory', 'revision']
4622
takes_options = ['revision']
4598
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4624
def run(self, revision_id_list=None, revision=None):
4599
4625
if revision_id_list is not None and revision is not None:
4600
4626
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4601
4627
if revision_id_list is None and revision is None:
4602
4628
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
4603
b = WorkingTree.open_containing(directory)[0].branch
4604
self.add_cleanup(b.lock_write().unlock)
4629
b = WorkingTree.open_containing(u'.')[0].branch
4631
self.add_cleanup(b.unlock)
4605
4632
return self._run(b, revision_id_list, revision)
4607
4634
def _run(self, b, revision_id_list, revision):
4667
4694
_see_also = ['checkouts', 'unbind']
4668
4695
takes_args = ['location?']
4669
takes_options = ['directory']
4671
def run(self, location=None, directory=u'.'):
4672
b, relpath = Branch.open_containing(directory)
4698
def run(self, location=None):
4699
b, relpath = Branch.open_containing(u'.')
4673
4700
if location is None:
4675
4702
location = b.get_old_bound_location()
4703
4730
_see_also = ['checkouts', 'bind']
4704
4731
takes_args = []
4705
takes_options = ['directory']
4707
def run(self, directory=u'.'):
4708
b, relpath = Branch.open_containing(directory)
4735
b, relpath = Branch.open_containing(u'.')
4709
4736
if not b.unbind():
4710
4737
raise errors.BzrCommandError('Local branch is not bound')
4757
4784
b = control.open_branch()
4759
4786
if tree is not None:
4760
self.add_cleanup(tree.lock_write().unlock)
4788
self.add_cleanup(tree.unlock)
4762
self.add_cleanup(b.lock_write().unlock)
4791
self.add_cleanup(b.unlock)
4763
4792
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
4765
4794
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
4804
4833
self.outf.write('The above revision(s) will be removed.\n')
4807
if not ui.ui_factory.confirm_action(
4808
'Uncommit these revisions',
4809
'bzrlib.builtins.uncommit',
4811
self.outf.write('Canceled\n')
4836
if not ui.ui_factory.get_boolean('Are you sure'):
4837
self.outf.write('Canceled')
4814
4840
mutter('Uncommitting from {%s} to {%s}',
4822
4848
class cmd_break_lock(Command):
4823
__doc__ = """Break a dead lock.
4825
This command breaks a lock on a repository, branch, working directory or
4849
__doc__ = """Break a dead lock on a repository, branch or working directory.
4828
4851
CAUTION: Locks should only be broken when you are sure that the process
4829
4852
holding the lock has been stopped.
4836
4859
bzr break-lock bzr+ssh://example.com/bzr/foo
4837
bzr break-lock --conf ~/.bazaar
4840
4861
takes_args = ['location?']
4843
help='LOCATION is the directory where the config lock is.'),
4846
def run(self, location=None, config=False):
4863
def run(self, location=None, show=False):
4847
4864
if location is None:
4848
4865
location = u'.'
4850
conf = _mod_config.LockableConfig(file_name=location)
4853
control, relpath = bzrdir.BzrDir.open_containing(location)
4855
control.break_lock()
4856
except NotImplementedError:
4866
control, relpath = bzrdir.BzrDir.open_containing(location)
4868
control.break_lock()
4869
except NotImplementedError:
4860
4873
class cmd_wait_until_signalled(Command):
4889
4902
'result in a dynamically allocated port. The default port '
4890
4903
'depends on the protocol.',
4892
custom_help('directory',
4893
help='Serve contents of this directory.'),
4906
help='Serve contents of this directory.',
4894
4908
Option('allow-writes',
4895
4909
help='By default the server is a readonly server. Supplying '
4896
4910
'--allow-writes enables write access to the contents of '
4924
4938
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4925
4939
protocol=None):
4926
from bzrlib import transport
4940
from bzrlib.transport import get_transport, transport_server_registry
4927
4941
if directory is None:
4928
4942
directory = os.getcwd()
4929
4943
if protocol is None:
4930
protocol = transport.transport_server_registry.get()
4944
protocol = transport_server_registry.get()
4931
4945
host, port = self.get_host_and_port(port)
4932
4946
url = urlutils.local_path_to_url(directory)
4933
4947
if not allow_writes:
4934
4948
url = 'readonly+' + url
4935
t = transport.get_transport(url)
4936
protocol(t, host, port, inet)
4949
transport = get_transport(url)
4950
protocol(transport, host, port, inet)
4939
4953
class cmd_join(Command):
4945
4959
not part of it. (Such trees can be produced by "bzr split", but also by
4946
4960
running "bzr branch" with the target inside a tree.)
4948
The result is a combined tree, with the subtree no longer an independent
4962
The result is a combined tree, with the subtree no longer an independant
4949
4963
part. This is marked as a merge of the subtree into the containing tree,
4950
4964
and all history is preserved.
5051
5064
encoding_type = 'exact'
5053
5066
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5054
sign=False, revision=None, mail_to=None, message=None,
5067
sign=False, revision=None, mail_to=None, message=None):
5056
5068
from bzrlib.revision import ensure_null, NULL_REVISION
5057
5069
include_patch, include_bundle = {
5058
5070
'plain': (False, False),
5059
5071
'diff': (True, False),
5060
5072
'bundle': (True, True),
5062
branch = Branch.open(directory)
5074
branch = Branch.open('.')
5063
5075
stored_submit_branch = branch.get_submit_branch()
5064
5076
if submit_branch is None:
5065
5077
submit_branch = stored_submit_branch
5150
5162
given, in which case it is sent to a file.
5152
5164
Mail is sent using your preferred mail program. This should be transparent
5153
on Windows (it uses MAPI). On Unix, it requires the xdg-email utility.
5165
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5154
5166
If the preferred client can't be found (or used), your editor will be used.
5156
5168
To use a specific mail program, set the mail_client configuration option.
5327
5339
Option('delete',
5328
5340
help='Delete this tag rather than placing it.',
5330
custom_help('directory',
5331
help='Branch in which to place the tag.'),
5343
help='Branch in which to place the tag.',
5332
5347
Option('force',
5333
5348
help='Replace existing tags.',
5344
5359
branch, relpath = Branch.open_containing(directory)
5345
self.add_cleanup(branch.lock_write().unlock)
5361
self.add_cleanup(branch.unlock)
5347
5363
if tag_name is None:
5348
5364
raise errors.BzrCommandError("No tag specified to delete.")
5377
5393
_see_also = ['tag']
5378
5394
takes_options = [
5379
custom_help('directory',
5380
help='Branch whose tags should be displayed.'),
5396
help='Branch whose tags should be displayed.',
5381
5400
RegistryOption.from_kwargs('sort',
5382
5401
'Sort tags by different criteria.', title='Sorting',
5383
5402
alpha='Sort tags lexicographically (default).',
5403
self.add_cleanup(branch.lock_read().unlock)
5423
self.add_cleanup(branch.unlock)
5405
5425
graph = branch.repository.get_graph()
5406
5426
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5555
5575
takes_args = ['to_location?']
5556
takes_options = ['directory',
5576
takes_options = [Option('force',
5558
5577
help='Switch even if local commits will be lost.'),
5560
5579
Option('create-branch', short_name='b',
5565
5584
def run(self, to_location=None, force=False, create_branch=False,
5566
revision=None, directory=u'.'):
5567
5586
from bzrlib import switch
5568
tree_location = directory
5569
5588
revision = _get_one_revision('switch', revision)
5570
5589
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5571
5590
if to_location is None:
5572
5591
if revision is None:
5573
5592
raise errors.BzrCommandError('You must supply either a'
5574
5593
' revision or a location')
5575
to_location = tree_location
5577
5596
branch = control_dir.open_branch()
5578
5597
had_explicit_nick = branch.get_config().has_explicit_nickname()
5716
tree, file_list = WorkingTree.open_containing_paths(file_list,
5735
tree, file_list = tree_files(file_list, apply_view=False)
5718
5736
current_view, view_dict = tree.views.get_view_info()
5719
5737
if name is None:
5720
5738
name = current_view
5869
5886
_see_also = ['unshelve']
5871
5888
def run(self, revision=None, all=False, file_list=None, message=None,
5872
writer=None, list=False, destroy=False, directory=u'.'):
5889
writer=None, list=False, destroy=False):
5874
5891
return self.run_for_list()
5875
5892
from bzrlib.shelf_ui import Shelver
5877
5894
writer = bzrlib.option.diff_writer_registry.get()
5879
5896
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5880
file_list, message, destroy=destroy, directory=directory)
5897
file_list, message, destroy=destroy)
5888
5905
def run_for_list(self):
5889
5906
tree = WorkingTree.open_containing('.')[0]
5890
self.add_cleanup(tree.lock_read().unlock)
5908
self.add_cleanup(tree.unlock)
5891
5909
manager = tree.get_shelf_manager()
5892
5910
shelves = manager.active_shelves()
5893
5911
if len(shelves) == 0:
5912
5930
takes_args = ['shelf_id?']
5913
5931
takes_options = [
5915
5932
RegistryOption.from_kwargs(
5916
5933
'action', help="The action to perform.",
5917
5934
enum_switch=False, value_switches=True,
5926
5943
_see_also = ['shelve']
5928
def run(self, shelf_id=None, action='apply', directory=u'.'):
5945
def run(self, shelf_id=None, action='apply'):
5929
5946
from bzrlib.shelf_ui import Unshelver
5930
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
5947
unshelver = Unshelver.from_args(shelf_id, action)
5932
5949
unshelver.run()
5950
5967
To check what clean-tree will do, use --dry-run.
5952
takes_options = ['directory',
5953
Option('ignored', help='Delete all ignored files.'),
5969
takes_options = [Option('ignored', help='Delete all ignored files.'),
5954
5970
Option('detritus', help='Delete conflict files, merge'
5955
5971
' backups, and failed selftest dirs.'),
5956
5972
Option('unknown',
5959
5975
' deleting them.'),
5960
5976
Option('force', help='Do not prompt before deleting.')]
5961
5977
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
5962
force=False, directory=u'.'):
5963
5979
from bzrlib.clean_tree import clean_tree
5964
5980
if not (unknown or ignored or detritus):
5968
clean_tree(directory, unknown=unknown, ignored=ignored,
5969
detritus=detritus, dry_run=dry_run, no_prompt=force)
5984
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5985
dry_run=dry_run, no_prompt=force)
5972
5988
class cmd_reference(Command):