180
180
view_str = views.view_display_str(view_files)
181
181
note("Ignoring files outside view. View is %s" % view_str)
182
182
return tree, file_list
183
tree = WorkingTree.open_containing(file_list[0])[0]
183
tree = WorkingTree.open_containing(osutils.realpath(file_list[0]))[0]
184
184
return tree, safe_relpath_files(tree, file_list, canonicalize,
185
185
apply_view=apply_view)
235
def _open_directory_or_containing_tree_or_branch(filename, directory):
236
"""Open the tree or branch containing the specified file, unless
237
the --directory option is used to specify a different branch."""
238
if directory is not None:
239
return (None, Branch.open(directory), filename)
240
return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
243
235
# TODO: Make sure no commands unconditionally use the working directory as a
244
236
# branch. If a filename argument is used, the first of them should be used to
245
237
# specify the branch. (Perhaps this can be factored out into some kind of
361
353
self.outf.write(revtext.decode('utf-8'))
364
def run(self, revision_id=None, revision=None, directory=u'.'):
356
def run(self, revision_id=None, revision=None):
365
357
if revision_id is not None and revision is not None:
366
358
raise errors.BzrCommandError('You can only supply one of'
367
359
' revision_id or --revision')
368
360
if revision_id is None and revision is None:
369
361
raise errors.BzrCommandError('You must supply either'
370
362
' --revision or a revision_id')
371
b = WorkingTree.open_containing(directory)[0].branch
363
b = WorkingTree.open_containing(u'.')[0].branch
373
365
revisions = b.repository.revisions
374
366
if revisions is None:
400
392
class cmd_dump_btree(Command):
401
__doc__ = """Dump the contents of a btree index file to stdout.
393
"""Dump the contents of a btree index file to stdout.
403
395
PATH is a btree index file, it can be any URL. This includes things like
404
396
.bzr/repository/pack-names, or .bzr/repository/indices/a34b3a...ca4a4.iix
512
504
if (working.has_changes()):
513
505
raise errors.UncommittedChanges(working)
514
if working.get_shelf_manager().last_shelf() is not None:
515
raise errors.ShelvedChanges(working)
517
if working.user_url != working.branch.user_url:
507
working_path = working.bzrdir.root_transport.base
508
branch_path = working.branch.bzrdir.root_transport.base
509
if working_path != branch_path:
518
510
raise errors.BzrCommandError("You cannot remove the working tree"
519
511
" from a lightweight checkout")
540
532
wt = WorkingTree.open_containing(location)[0]
541
self.add_cleanup(wt.lock_read().unlock)
542
534
except (errors.NoWorkingTree, errors.NotLocalUrl):
543
535
raise errors.NoWorkingTree(location)
536
self.add_cleanup(wt.unlock)
544
537
revid = wt.last_revision()
546
539
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
549
542
revno = ".".join(str(n) for n in revno_t)
551
544
b = Branch.open_containing(location)[0]
552
self.add_cleanup(b.lock_read().unlock)
546
self.add_cleanup(b.unlock)
553
547
revno = b.revno()
554
548
self.cleanup_now()
555
549
self.outf.write(str(revno) + '\n')
558
552
class cmd_revision_info(Command):
559
__doc__ = """Show revision number and revision id for a given revision identifier.
553
"""Show revision number and revision id for a given revision identifier.
562
556
takes_args = ['revision_info*']
563
557
takes_options = [
565
custom_help('directory',
566
560
help='Branch to examine, '
567
'rather than the one containing the working directory.'),
561
'rather than the one containing the working directory.',
568
565
Option('tree', help='Show revno of working tree'),
576
573
wt = WorkingTree.open_containing(directory)[0]
578
self.add_cleanup(wt.lock_read().unlock)
576
self.add_cleanup(wt.unlock)
579
577
except (errors.NoWorkingTree, errors.NotLocalUrl):
581
579
b = Branch.open_containing(directory)[0]
582
self.add_cleanup(b.lock_read().unlock)
581
self.add_cleanup(b.unlock)
583
582
revision_ids = []
584
583
if revision is not None:
585
584
revision_ids.extend(rev.as_revision_id(b) for rev in revision)
684
683
should_print=(not is_quiet()))
687
self.add_cleanup(base_tree.lock_read().unlock)
686
base_tree.lock_read()
687
self.add_cleanup(base_tree.unlock)
688
688
tree, file_list = tree_files_for_add(file_list)
689
689
added, ignored = tree.smart_add(file_list, not
690
690
no_recurse, action=action, save=not dry_run)
763
763
revision = _get_one_revision('inventory', revision)
764
764
work_tree, file_list = tree_files(file_list)
765
self.add_cleanup(work_tree.lock_read().unlock)
765
work_tree.lock_read()
766
self.add_cleanup(work_tree.unlock)
766
767
if revision is not None:
767
768
tree = revision.as_tree(work_tree.branch)
769
770
extra_trees = [work_tree]
770
self.add_cleanup(tree.lock_read().unlock)
772
self.add_cleanup(tree.unlock)
833
835
if len(names_list) < 2:
834
836
raise errors.BzrCommandError("missing file argument")
835
837
tree, rel_names = tree_files(names_list, canonicalize=False)
836
self.add_cleanup(tree.lock_tree_write().unlock)
838
tree.lock_tree_write()
839
self.add_cleanup(tree.unlock)
837
840
self._run(tree, names_list, rel_names, after)
839
842
def run_auto(self, names_list, after, dry_run):
844
847
raise errors.BzrCommandError('--after cannot be specified with'
846
849
work_tree, file_list = tree_files(names_list, default_branch='.')
847
self.add_cleanup(work_tree.lock_tree_write().unlock)
850
work_tree.lock_tree_write()
851
self.add_cleanup(work_tree.unlock)
848
852
rename_map.RenameMap.guess_renames(work_tree, dry_run)
850
854
def _run(self, tree, names_list, rel_names, after):
958
962
takes_options = ['remember', 'overwrite', 'revision',
959
963
custom_help('verbose',
960
964
help='Show logs of pulled revisions.'),
961
custom_help('directory',
962
966
help='Branch to pull into, '
963
'rather than the one containing the working directory.'),
967
'rather than the one containing the working directory.',
965
972
help="Perform a local pull in a bound "
966
973
"branch. Local pulls are not applied to "
982
989
tree_to = WorkingTree.open_containing(directory)[0]
983
990
branch_to = tree_to.branch
984
self.add_cleanup(tree_to.lock_write().unlock)
992
self.add_cleanup(tree_to.unlock)
985
993
except errors.NoWorkingTree:
987
995
branch_to = Branch.open_containing(directory)[0]
988
self.add_cleanup(branch_to.lock_write().unlock)
996
branch_to.lock_write()
997
self.add_cleanup(branch_to.unlock)
990
999
if local and not branch_to.get_bound_location():
991
1000
raise errors.LocalRequiresBoundBranch()
1023
1032
branch_from = Branch.open(location,
1024
1033
possible_transports=possible_transports)
1025
self.add_cleanup(branch_from.lock_read().unlock)
1034
branch_from.lock_read()
1035
self.add_cleanup(branch_from.unlock)
1027
1037
if branch_to.get_parent() is None or remember:
1028
1038
branch_to.set_parent(branch_from.base)
1080
1090
Option('create-prefix',
1081
1091
help='Create the path leading up to the branch '
1082
1092
'if it does not already exist.'),
1083
custom_help('directory',
1084
1094
help='Branch to push from, '
1085
'rather than the one containing the working directory.'),
1095
'rather than the one containing the working directory.',
1086
1099
Option('use-existing-dir',
1087
1100
help='By default push will fail if the target'
1088
1101
' directory exists, but does not already'
1122
1135
revision_id = None
1123
1136
if tree is not None and revision_id is None:
1124
tree.check_changed_or_out_of_date(
1125
strict, 'push_strict',
1126
more_error='Use --no-strict to force the push.',
1127
more_warning='Uncommitted changes will not be pushed.')
1137
tree.warn_if_changed_or_out_of_date(
1138
strict, 'push_strict', 'Use --no-strict to force the push.')
1128
1139
# Get the stacked_on branch, if any
1129
1140
if stacked_on is not None:
1130
1141
stacked_on = urlutils.normalize_url(stacked_on)
1164
1175
class cmd_branch(Command):
1165
__doc__ = """Create a new branch that is a copy of an existing branch.
1176
"""Create a new branch that is a copy of an existing branch.
1167
1178
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
1168
1179
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1354
1366
@display_command
1355
1367
def run(self, dir=u'.'):
1356
1368
tree = WorkingTree.open_containing(dir)[0]
1357
self.add_cleanup(tree.lock_read().unlock)
1370
self.add_cleanup(tree.unlock)
1358
1371
new_inv = tree.inventory
1359
1372
old_tree = tree.basis_tree()
1360
self.add_cleanup(old_tree.lock_read().unlock)
1373
old_tree.lock_read()
1374
self.add_cleanup(old_tree.unlock)
1361
1375
old_inv = old_tree.inventory
1363
1377
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1375
1389
class cmd_update(Command):
1376
__doc__ = """Update a tree to have the latest code committed to its branch.
1390
"""Update a tree to have the latest code committed to its branch.
1378
1392
This will perform a merge into the working tree, and may generate
1379
1393
conflicts. If you have any local changes, you will still
1401
1415
master = branch.get_master_branch(
1402
1416
possible_transports=possible_transports)
1403
1417
if master is not None:
1404
1419
branch_location = master.base
1421
tree.lock_tree_write()
1407
1422
branch_location = tree.branch.base
1408
tree.lock_tree_write()
1409
1423
self.add_cleanup(tree.unlock)
1410
1424
# get rid of the final '/' and be ready for display
1411
1425
branch_location = urlutils.unescape_for_display(
1448
1462
_mod_revision.ensure_null(tree.last_revision()))
1449
1463
note('Updated to revision %s of branch %s' %
1450
1464
('.'.join(map(str, revno)), branch_location))
1451
parent_ids = tree.get_parent_ids()
1452
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1465
if tree.get_parent_ids()[1:] != existing_pending_merges:
1453
1466
note('Your local commits will now show as pending merges with '
1454
1467
"'bzr status', and can be committed with 'bzr commit'.")
1455
1468
if conflicts != 0:
1840
1854
class cmd_diff(Command):
1841
__doc__ = """Show differences in the working tree, between revisions or branches.
1855
"""Show differences in the working tree, between revisions or branches.
1843
1857
If no arguments are given, all changes for the current tree are listed.
1844
1858
If files are given, only the changes in those files are listed.
1941
1955
@display_command
1942
1956
def run(self, revision=None, file_list=None, diff_options=None,
1943
1957
prefix=None, old=None, new=None, using=None, format=None):
1944
from bzrlib.diff import (get_trees_and_branches_to_diff_locked,
1958
from bzrlib.diff import (get_trees_and_branches_to_diff,
1945
1959
show_diff_trees)
1947
1961
if (prefix is None) or (prefix == '0'):
1969
1983
(old_tree, new_tree,
1970
1984
old_branch, new_branch,
1971
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
1972
file_list, revision, old, new, self.add_cleanup, apply_view=True)
1973
# GNU diff on Windows uses ANSI encoding for filenames
1974
path_encoding = osutils.get_diff_header_encoding()
1985
specific_files, extra_trees) = get_trees_and_branches_to_diff(
1986
file_list, revision, old, new, apply_view=True)
1975
1987
return show_diff_trees(old_tree, new_tree, sys.stdout,
1976
1988
specific_files=specific_files,
1977
1989
external_diff_options=diff_options,
1978
1990
old_label=old_label, new_label=new_label,
1979
extra_trees=extra_trees,
1980
path_encoding=path_encoding,
1991
extra_trees=extra_trees, using=using,
1982
1992
format_cls=format)
1985
1995
class cmd_deleted(Command):
1986
__doc__ = """List files deleted in the working tree.
1996
"""List files deleted in the working tree.
1988
1998
# TODO: Show files deleted since a previous revision, or
1989
1999
# between two revisions.
1992
2002
# level of effort but possibly much less IO. (Or possibly not,
1993
2003
# if the directories are very large...)
1994
2004
_see_also = ['status', 'ls']
1995
takes_options = ['directory', 'show-ids']
2005
takes_options = ['show-ids']
1997
2007
@display_command
1998
def run(self, show_ids=False, directory=u'.'):
1999
tree = WorkingTree.open_containing(directory)[0]
2000
self.add_cleanup(tree.lock_read().unlock)
2008
def run(self, show_ids=False):
2009
tree = WorkingTree.open_containing(u'.')[0]
2011
self.add_cleanup(tree.unlock)
2001
2012
old = tree.basis_tree()
2002
self.add_cleanup(old.lock_read().unlock)
2014
self.add_cleanup(old.unlock)
2003
2015
for path, ie in old.inventory.iter_entries():
2004
2016
if not tree.has_id(ie.file_id):
2005
2017
self.outf.write(path)
2012
2024
class cmd_modified(Command):
2013
__doc__ = """List files modified in working tree.
2025
"""List files modified in working tree.
2017
2029
_see_also = ['status', 'ls']
2018
takes_options = ['directory', 'null']
2032
help='Write an ascii NUL (\\0) separator '
2033
'between files rather than a newline.')
2020
2036
@display_command
2021
def run(self, null=False, directory=u'.'):
2022
tree = WorkingTree.open_containing(directory)[0]
2037
def run(self, null=False):
2038
tree = WorkingTree.open_containing(u'.')[0]
2023
2039
td = tree.changes_from(tree.basis_tree())
2024
2040
for path, id, kind, text_modified, meta_modified in td.modified:
2031
2047
class cmd_added(Command):
2032
__doc__ = """List files added in working tree.
2048
"""List files added in working tree.
2036
2052
_see_also = ['status', 'ls']
2037
takes_options = ['directory', 'null']
2055
help='Write an ascii NUL (\\0) separator '
2056
'between files rather than a newline.')
2039
2059
@display_command
2040
def run(self, null=False, directory=u'.'):
2041
wt = WorkingTree.open_containing(directory)[0]
2042
self.add_cleanup(wt.lock_read().unlock)
2060
def run(self, null=False):
2061
wt = WorkingTree.open_containing(u'.')[0]
2063
self.add_cleanup(wt.unlock)
2043
2064
basis = wt.basis_tree()
2044
self.add_cleanup(basis.lock_read().unlock)
2066
self.add_cleanup(basis.unlock)
2045
2067
basis_inv = basis.inventory
2046
2068
inv = wt.inventory
2047
2069
for file_id in inv:
2050
2072
if inv.is_root(file_id) and len(basis_inv) == 0:
2052
2074
path = inv.id2path(file_id)
2053
if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
2075
if not os.access(osutils.abspath(path), os.F_OK):
2056
2078
self.outf.write(path + '\0')
2256
2278
help='Show just the specified revision.'
2257
2279
' See also "help revisionspec".'),
2259
RegistryOption('authors',
2260
'What names to list as authors - first, all or committer.',
2262
lazy_registry=('bzrlib.log', 'author_list_registry'),
2264
2281
Option('levels',
2265
2282
short_name='n',
2266
2283
help='Number of levels to display - 0 for all, 1 for flat.',
2281
2298
help='Show changes made in each revision as a patch.'),
2282
2299
Option('include-merges',
2283
2300
help='Show merged revisions like --levels 0 does.'),
2284
Option('exclude-common-ancestry',
2285
help='Display only the revisions that are not part'
2286
' of both ancestries (require -rX..Y)'
2289
2302
encoding_type = 'replace'
2302
2315
show_diff=False,
2303
include_merges=False,
2305
exclude_common_ancestry=False,
2316
include_merges=False):
2307
2317
from bzrlib.log import (
2309
2319
make_log_request_dict,
2310
2320
_get_info_for_log_files,
2312
2322
direction = (forward and 'forward') or 'reverse'
2313
if (exclude_common_ancestry
2314
and (revision is None or len(revision) != 2)):
2315
raise errors.BzrCommandError(
2316
'--exclude-common-ancestry requires -r with two revisions')
2317
2323
if include_merges:
2318
2324
if levels is None:
2336
2342
# find the file ids to log and check for directory filtering
2337
2343
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2338
revision, file_list, self.add_cleanup)
2344
revision, file_list)
2345
self.add_cleanup(b.unlock)
2339
2346
for relpath, file_id, kind in file_info_list:
2340
2347
if file_id is None:
2341
2348
raise errors.BzrCommandError(
2360
2367
dir, relpath = bzrdir.BzrDir.open_containing(location)
2361
2368
b = dir.open_branch()
2362
self.add_cleanup(b.lock_read().unlock)
2370
self.add_cleanup(b.unlock)
2363
2371
rev1, rev2 = _get_revision_range(revision, b, self.name())
2365
2373
# Decide on the type of delta & diff filtering to use
2385
2393
show_timezone=timezone,
2386
2394
delta_format=get_verbosity_level(),
2388
show_advice=levels is None,
2389
author_list_handler=authors)
2396
show_advice=levels is None)
2391
2398
# Choose the algorithm for doing the logging. It's annoying
2392
2399
# having multiple code paths like this but necessary until
2411
2418
direction=direction, specific_fileids=file_ids,
2412
2419
start_revision=rev1, end_revision=rev2, limit=limit,
2413
2420
message_search=message, delta_type=delta_type,
2414
diff_type=diff_type, _match_using_deltas=match_using_deltas,
2415
exclude_common_ancestry=exclude_common_ancestry,
2421
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2417
2422
Logger(b, rqst).show(lf)
2490
2495
tree, relpath = WorkingTree.open_containing(filename)
2491
2496
file_id = tree.path2id(relpath)
2492
2497
b = tree.branch
2493
self.add_cleanup(b.lock_read().unlock)
2499
self.add_cleanup(b.unlock)
2494
2500
touching_revs = log.find_touching_revisions(b, file_id)
2495
2501
for revno, revision_id, what in touching_revs:
2496
2502
self.outf.write("%6d %s\n" % (revno, what))
2499
2505
class cmd_ls(Command):
2500
__doc__ = """List files in a tree.
2506
"""List files in a tree.
2503
2509
_see_also = ['status', 'cat']
2509
2515
help='Recurse into subdirectories.'),
2510
2516
Option('from-root',
2511
2517
help='Print paths relative to the root of the branch.'),
2512
Option('unknown', short_name='u',
2513
help='Print unknown files.'),
2518
Option('unknown', help='Print unknown files.'),
2514
2519
Option('versioned', help='Print versioned files.',
2515
2520
short_name='V'),
2516
Option('ignored', short_name='i',
2517
help='Print ignored files.'),
2518
Option('kind', short_name='k',
2521
Option('ignored', help='Print ignored files.'),
2523
help='Write an ascii NUL (\\0) separator '
2524
'between files rather than a newline.'),
2519
2526
help='List entries of a particular kind: file, directory, symlink.',
2525
2530
@display_command
2526
2531
def run(self, revision=None, verbose=False,
2527
2532
recursive=False, from_root=False,
2528
2533
unknown=False, versioned=False, ignored=False,
2529
null=False, kind=None, show_ids=False, path=None, directory=None):
2534
null=False, kind=None, show_ids=False, path=None):
2531
2536
if kind and kind not in ('file', 'directory', 'symlink'):
2532
2537
raise errors.BzrCommandError('invalid kind specified')
2544
2549
raise errors.BzrCommandError('cannot specify both --from-root'
2547
tree, branch, relpath = \
2548
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2552
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
2550
2555
# Calculate the prefix to use
2566
2571
view_str = views.view_display_str(view_files)
2567
2572
note("Ignoring files outside view. View is %s" % view_str)
2569
self.add_cleanup(tree.lock_read().unlock)
2575
self.add_cleanup(tree.unlock)
2570
2576
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2571
2577
from_dir=relpath, recursive=recursive):
2572
2578
# Apply additional masking
2616
2622
class cmd_unknowns(Command):
2617
__doc__ = """List unknown files.
2623
"""List unknown files.
2621
2627
_see_also = ['ls']
2622
takes_options = ['directory']
2624
2629
@display_command
2625
def run(self, directory=u'.'):
2626
for f in WorkingTree.open_containing(directory)[0].unknowns():
2631
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2627
2632
self.outf.write(osutils.quotefn(f) + '\n')
2630
2635
class cmd_ignore(Command):
2631
__doc__ = """Ignore specified files or patterns.
2636
"""Ignore specified files or patterns.
2633
2638
See ``bzr help patterns`` for details on the syntax of patterns.
2643
2648
using this command or directly by using an editor, be sure to commit
2646
Bazaar also supports a global ignore file ~/.bazaar/ignore. On Windows
2647
the global ignore file can be found in the application data directory as
2648
C:\\Documents and Settings\\<user>\\Application Data\\Bazaar\\2.0\\ignore.
2649
Global ignores are not touched by this command. The global ignore file
2650
can be edited directly using an editor.
2652
2651
Patterns prefixed with '!' are exceptions to ignore patterns and take
2653
2652
precedence over regular ignores. Such exceptions are used to specify
2654
2653
files that should be versioned which would otherwise be ignored.
2695
2694
_see_also = ['status', 'ignored', 'patterns']
2696
2695
takes_args = ['name_pattern*']
2697
takes_options = ['directory',
2698
Option('default-rules',
2699
help='Display the default ignore rules that bzr uses.')
2697
Option('old-default-rules',
2698
help='Write out the ignore rules bzr < 0.9 always used.')
2702
def run(self, name_pattern_list=None, default_rules=None,
2701
def run(self, name_pattern_list=None, old_default_rules=None):
2704
2702
from bzrlib import ignores
2705
if default_rules is not None:
2706
# dump the default rules and exit
2707
for pattern in ignores.USER_DEFAULTS:
2703
if old_default_rules is not None:
2704
# dump the rules and exit
2705
for pattern in ignores.OLD_DEFAULTS:
2708
2706
self.outf.write("%s\n" % pattern)
2710
2708
if not name_pattern_list:
2711
2709
raise errors.BzrCommandError("ignore requires at least one "
2712
"NAME_PATTERN or --default-rules.")
2710
"NAME_PATTERN or --old-default-rules")
2713
2711
name_pattern_list = [globbing.normalize_pattern(p)
2714
2712
for p in name_pattern_list]
2716
for p in name_pattern_list:
2717
if not globbing.Globster.is_pattern_valid(p):
2718
bad_patterns += ('\n %s' % p)
2720
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2721
ui.ui_factory.show_error(msg)
2722
raise errors.InvalidPattern('')
2723
2713
for name_pattern in name_pattern_list:
2724
2714
if (name_pattern[0] == '/' or
2725
2715
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2726
2716
raise errors.BzrCommandError(
2727
2717
"NAME_PATTERN should not be an absolute path")
2728
tree, relpath = WorkingTree.open_containing(directory)
2718
tree, relpath = WorkingTree.open_containing(u'.')
2729
2719
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2730
2720
ignored = globbing.Globster(name_pattern_list)
2732
self.add_cleanup(tree.lock_read().unlock)
2733
2723
for entry in tree.list_files():
2735
2725
if id is not None:
2736
2726
filename = entry[0]
2737
2727
if ignored.match(filename):
2738
2728
matches.append(filename)
2739
2730
if len(matches) > 0:
2740
2731
self.outf.write("Warning: the following files are version controlled and"
2741
2732
" match your ignore pattern:\n%s"
2757
2748
encoding_type = 'replace'
2758
2749
_see_also = ['ignore', 'ls']
2759
takes_options = ['directory']
2761
2751
@display_command
2762
def run(self, directory=u'.'):
2763
tree = WorkingTree.open_containing(directory)[0]
2764
self.add_cleanup(tree.lock_read().unlock)
2753
tree = WorkingTree.open_containing(u'.')[0]
2755
self.add_cleanup(tree.unlock)
2765
2756
for path, file_class, kind, file_id, entry in tree.list_files():
2766
2757
if file_class != 'I':
2773
2764
class cmd_lookup_revision(Command):
2774
__doc__ = """Lookup the revision-id from a revision-number
2765
"""Lookup the revision-id from a revision-number
2777
2768
bzr lookup-revision 33
2780
2771
takes_args = ['revno']
2781
takes_options = ['directory']
2783
2773
@display_command
2784
def run(self, revno, directory=u'.'):
2774
def run(self, revno):
2786
2776
revno = int(revno)
2787
2777
except ValueError:
2788
2778
raise errors.BzrCommandError("not a valid revision-number: %r"
2790
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2780
revid = WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2791
2781
self.outf.write("%s\n" % revid)
2794
2784
class cmd_export(Command):
2795
__doc__ = """Export current or past revision to a destination directory or archive.
2785
"""Export current or past revision to a destination directory or archive.
2797
2787
If no revision is specified this exports the last committed revision.
2835
2825
'revision in which it was changed.'),
2837
2827
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2838
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2828
root=None, filters=False, per_file_timestamps=False):
2839
2829
from bzrlib.export import export
2841
2831
if branch_or_subdir is None:
2842
tree = WorkingTree.open_containing(directory)[0]
2832
tree = WorkingTree.open_containing(u'.')[0]
2843
2833
b = tree.branch
2876
2866
@display_command
2877
2867
def run(self, filename, revision=None, name_from_revision=False,
2878
filters=False, directory=None):
2879
2869
if revision is not None and len(revision) != 1:
2880
2870
raise errors.BzrCommandError("bzr cat --revision takes exactly"
2881
2871
" one revision specifier")
2882
2872
tree, branch, relpath = \
2883
_open_directory_or_containing_tree_or_branch(filename, directory)
2884
self.add_cleanup(branch.lock_read().unlock)
2873
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2875
self.add_cleanup(branch.unlock)
2885
2876
return self._run(tree, branch, relpath, filename, revision,
2886
2877
name_from_revision, filters)
3158
3150
def get_message(commit_obj):
3159
3151
"""Callback to get commit message"""
3161
f = codecs.open(file, 'rt', osutils.get_user_encoding())
3163
my_message = f.read()
3153
my_message = codecs.open(
3154
file, 'rt', osutils.get_user_encoding()).read()
3166
3155
elif message is not None:
3167
3156
my_message = message
3219
3208
class cmd_check(Command):
3220
__doc__ = """Validate working tree structure, branch consistency and repository history.
3209
"""Validate working tree structure, branch consistency and repository history.
3222
3211
This command checks various invariants about branch and repository storage
3223
3212
to detect data corruption or bzr bugs.
3323
3312
bzr whoami "Frank Chu <fchu@example.com>"
3325
takes_options = [ 'directory',
3314
takes_options = [ Option('email',
3327
3315
help='Display email address only.'),
3328
3316
Option('branch',
3329
3317
help='Set identity for the current branch instead of '
3333
3321
encoding_type = 'replace'
3335
3323
@display_command
3336
def run(self, email=False, branch=False, name=None, directory=None):
3324
def run(self, email=False, branch=False, name=None):
3337
3325
if name is None:
3338
if directory is None:
3339
# use branch if we're inside one; otherwise global config
3341
c = Branch.open_containing(u'.')[0].get_config()
3342
except errors.NotBranchError:
3343
c = config.GlobalConfig()
3345
c = Branch.open(directory).get_config()
3326
# use branch if we're inside one; otherwise global config
3328
c = Branch.open_containing('.')[0].get_config()
3329
except errors.NotBranchError:
3330
c = config.GlobalConfig()
3347
3332
self.outf.write(c.user_email() + '\n')
3359
3344
# use global config unless --branch given
3361
if directory is None:
3362
c = Branch.open_containing(u'.')[0].get_config()
3364
c = Branch.open(directory).get_config()
3346
c = Branch.open_containing('.')[0].get_config()
3366
3348
c = config.GlobalConfig()
3367
3349
c.set_user_option('email', name)
3370
3352
class cmd_nick(Command):
3371
__doc__ = """Print or set the branch nickname.
3353
"""Print or set the branch nickname.
3373
3355
If unset, the tree root directory name is used as the nickname.
3374
3356
To print the current nickname, execute with no argument.
3380
3362
_see_also = ['info']
3381
3363
takes_args = ['nickname?']
3382
takes_options = ['directory']
3383
def run(self, nickname=None, directory=u'.'):
3384
branch = Branch.open_containing(directory)[0]
3364
def run(self, nickname=None):
3365
branch = Branch.open_containing(u'.')[0]
3385
3366
if nickname is None:
3386
3367
self.printme(branch)
3537
3518
'throughout the test suite.',
3538
3519
type=get_transport_type),
3539
3520
Option('benchmark',
3540
help='Run the benchmarks rather than selftests.',
3521
help='Run the benchmarks rather than selftests.'),
3542
3522
Option('lsprof-timed',
3543
3523
help='Generate lsprof output for benchmarked'
3544
3524
' sections of code.'),
3545
3525
Option('lsprof-tests',
3546
3526
help='Generate lsprof output for each test.'),
3527
Option('cache-dir', type=str,
3528
help='Cache intermediate benchmark output in this '
3547
3530
Option('first',
3548
3531
help='Run all tests, but run specified tests first.',
3549
3532
short_name='f',
3584
3567
def run(self, testspecs_list=None, verbose=False, one=False,
3585
3568
transport=None, benchmark=None,
3569
lsprof_timed=None, cache_dir=None,
3587
3570
first=False, list_only=False,
3588
3571
randomize=None, exclude=None, strict=False,
3589
3572
load_list=None, debugflag=None, starting_with=None, subunit=False,
3590
3573
parallel=None, lsprof_tests=False):
3591
3574
from bzrlib.tests import selftest
3575
import bzrlib.benchmarks as benchmarks
3576
from bzrlib.benchmarks import tree_creator
3593
3578
# Make deprecation warnings visible, unless -Werror is set
3594
3579
symbol_versioning.activate_deprecation_warnings(override=False)
3581
if cache_dir is not None:
3582
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3596
3583
if testspecs_list is not None:
3597
3584
pattern = '|'.join(testspecs_list)
3604
3591
raise errors.BzrCommandError("subunit not available. subunit "
3605
3592
"needs to be installed to use --subunit.")
3606
3593
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3607
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3608
# stdout, which would corrupt the subunit stream.
3609
# FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3610
# following code can be deleted when it's sufficiently deployed
3611
# -- vila/mgz 20100514
3612
if (sys.platform == "win32"
3613
and getattr(sys.stdout, 'fileno', None) is not None):
3615
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3617
3595
self.additional_selftest_args.setdefault(
3618
3596
'suite_decorators', []).append(parallel)
3620
raise errors.BzrCommandError(
3621
"--benchmark is no longer supported from bzr 2.2; "
3622
"use bzr-usertest instead")
3623
test_suite_factory = None
3598
test_suite_factory = benchmarks.test_suite
3599
# Unless user explicitly asks for quiet, be verbose in benchmarks
3600
verbose = not is_quiet()
3601
# TODO: should possibly lock the history file...
3602
benchfile = open(".perf_history", "at", buffering=1)
3603
self.add_cleanup(benchfile.close)
3605
test_suite_factory = None
3624
3607
selftest_kwargs = {"verbose": verbose,
3625
3608
"pattern": pattern,
3626
3609
"stop_on_failure": one,
3628
3611
"test_suite_factory": test_suite_factory,
3629
3612
"lsprof_timed": lsprof_timed,
3630
3613
"lsprof_tests": lsprof_tests,
3614
"bench_history": benchfile,
3631
3615
"matching_tests_first": first,
3632
3616
"list_only": list_only,
3633
3617
"random_seed": randomize,
3672
3656
class cmd_find_merge_base(Command):
3673
__doc__ = """Find and print a base revision for merging two branches."""
3657
"""Find and print a base revision for merging two branches."""
3674
3658
# TODO: Options to specify revisions on either side, as if
3675
3659
# merging only part of the history.
3676
3660
takes_args = ['branch', 'other']
3683
3667
branch1 = Branch.open_containing(branch)[0]
3684
3668
branch2 = Branch.open_containing(other)[0]
3685
self.add_cleanup(branch1.lock_read().unlock)
3686
self.add_cleanup(branch2.lock_read().unlock)
3670
self.add_cleanup(branch1.unlock)
3672
self.add_cleanup(branch2.unlock)
3687
3673
last1 = ensure_null(branch1.last_revision())
3688
3674
last2 = ensure_null(branch2.last_revision())
3783
3769
' completely merged into the source, pull from the'
3784
3770
' source rather than merging. When this happens,'
3785
3771
' you do not need to commit the result.'),
3786
custom_help('directory',
3787
3773
help='Branch to merge into, '
3788
'rather than the one containing the working directory.'),
3774
'rather than the one containing the working directory.',
3789
3778
Option('preview', help='Instead of merging, show a diff of the'
3791
3780
Option('interactive', help='Select changes interactively.',
3824
3813
unversioned_filter=tree.is_ignored, view_info=view_info)
3825
3814
pb = ui.ui_factory.nested_progress_bar()
3826
3815
self.add_cleanup(pb.finished)
3827
self.add_cleanup(tree.lock_write().unlock)
3817
self.add_cleanup(tree.unlock)
3828
3818
if location is not None:
3830
3820
mergeable = bundle.read_mergeable_from_url(location,
3891
3881
def _do_preview(self, merger):
3892
3882
from bzrlib.diff import show_diff_trees
3893
3883
result_tree = self._get_preview(merger)
3894
path_encoding = osutils.get_diff_header_encoding()
3895
3884
show_diff_trees(merger.this_tree, result_tree, self.outf,
3896
old_label='', new_label='',
3897
path_encoding=path_encoding)
3885
old_label='', new_label='')
3899
3887
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3900
3888
merger.change_reporter = change_reporter
4088
4076
if merge_type is None:
4089
4077
merge_type = _mod_merge.Merge3Merger
4090
4078
tree, file_list = tree_files(file_list)
4091
self.add_cleanup(tree.lock_write().unlock)
4080
self.add_cleanup(tree.unlock)
4092
4081
parents = tree.get_parent_ids()
4093
4082
if len(parents) != 2:
4094
4083
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4149
4138
class cmd_revert(Command):
4150
__doc__ = """Revert files to a previous revision.
4139
"""Revert files to a previous revision.
4152
4141
Giving a list of files will revert only those files. Otherwise, all files
4153
4142
will be reverted. If the revision is not specified with '--revision', the
4204
4193
def run(self, revision=None, no_backup=False, file_list=None,
4205
4194
forget_merges=None):
4206
4195
tree, file_list = tree_files(file_list)
4207
self.add_cleanup(tree.lock_tree_write().unlock)
4197
self.add_cleanup(tree.unlock)
4208
4198
if forget_merges:
4209
4199
tree.set_parent_ids(tree.get_parent_ids()[:1])
4327
4316
theirs_only=False,
4328
4317
log_format=None, long=False, short=False, line=False,
4329
4318
show_ids=False, verbose=False, this=False, other=False,
4330
include_merges=False, revision=None, my_revision=None,
4319
include_merges=False, revision=None, my_revision=None):
4332
4320
from bzrlib.missing import find_unmerged, iter_log_revisions
4333
4321
def message(s):
4334
4322
if not is_quiet():
4365
4354
if remote_branch.base == local_branch.base:
4366
4355
remote_branch = local_branch
4368
self.add_cleanup(remote_branch.lock_read().unlock)
4357
remote_branch.lock_read()
4358
self.add_cleanup(remote_branch.unlock)
4370
4360
local_revid_range = _revision_range_to_revid_range(
4371
4361
_get_revision_range(my_revision, local_branch,
4426
4416
message("Branches are up to date.\n")
4427
4417
self.cleanup_now()
4428
4418
if not status_code and parent is None and other_branch is not None:
4429
self.add_cleanup(local_branch.lock_write().unlock)
4419
local_branch.lock_write()
4420
self.add_cleanup(local_branch.unlock)
4430
4421
# handle race conditions - a parent might be set while we run.
4431
4422
if local_branch.get_parent() is None:
4432
4423
local_branch.set_parent(remote_branch.base)
4436
4427
class cmd_pack(Command):
4437
__doc__ = """Compress the data within a repository.
4439
This operation compresses the data within a bazaar repository. As
4440
bazaar supports automatic packing of repository, this operation is
4441
normally not required to be done manually.
4443
During the pack operation, bazaar takes a backup of existing repository
4444
data, i.e. pack files. This backup is eventually removed by bazaar
4445
automatically when it is safe to do so. To save disk space by removing
4446
the backed up pack files, the --clean-obsolete-packs option may be
4449
Warning: If you use --clean-obsolete-packs and your machine crashes
4450
during or immediately after repacking, you may be left with a state
4451
where the deletion has been written to disk but the new packs have not
4452
been. In this case the repository may be unusable.
4428
"""Compress the data within a repository."""
4455
4430
_see_also = ['repositories']
4456
4431
takes_args = ['branch_or_repo?']
4458
Option('clean-obsolete-packs', 'Delete obsolete packs to save disk space.'),
4461
def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4433
def run(self, branch_or_repo='.'):
4462
4434
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4464
4436
branch = dir.open_branch()
4465
4437
repository = branch.repository
4466
4438
except errors.NotBranchError:
4467
4439
repository = dir.open_repository()
4468
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
4471
4443
class cmd_plugins(Command):
4472
__doc__ = """List the installed plugins.
4444
"""List the installed plugins.
4474
4446
This command displays the list of installed plugins including
4475
4447
version of plugin and a short description of each.
4562
4535
Option('long', help='Show commit date in annotations.'),
4567
4539
encoding_type = 'exact'
4569
4541
@display_command
4570
4542
def run(self, filename, all=False, long=False, revision=None,
4571
show_ids=False, directory=None):
4572
4544
from bzrlib.annotate import annotate_file, annotate_file_tree
4573
4545
wt, branch, relpath = \
4574
_open_directory_or_containing_tree_or_branch(filename, directory)
4546
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4575
4547
if wt is not None:
4576
self.add_cleanup(wt.lock_read().unlock)
4549
self.add_cleanup(wt.unlock)
4578
self.add_cleanup(branch.lock_read().unlock)
4552
self.add_cleanup(branch.unlock)
4579
4553
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4580
self.add_cleanup(tree.lock_read().unlock)
4555
self.add_cleanup(tree.unlock)
4581
4556
if wt is not None:
4582
4557
file_id = wt.path2id(relpath)
4598
4573
class cmd_re_sign(Command):
4599
__doc__ = """Create a digital signature for an existing revision."""
4574
"""Create a digital signature for an existing revision."""
4600
4575
# TODO be able to replace existing ones.
4602
4577
hidden = True # is this right ?
4603
4578
takes_args = ['revision_id*']
4604
takes_options = ['directory', 'revision']
4579
takes_options = ['revision']
4606
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4581
def run(self, revision_id_list=None, revision=None):
4607
4582
if revision_id_list is not None and revision is not None:
4608
4583
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4609
4584
if revision_id_list is None and revision is None:
4610
4585
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
4611
b = WorkingTree.open_containing(directory)[0].branch
4612
self.add_cleanup(b.lock_write().unlock)
4586
b = WorkingTree.open_containing(u'.')[0].branch
4588
self.add_cleanup(b.unlock)
4613
4589
return self._run(b, revision_id_list, revision)
4615
4591
def _run(self, b, revision_id_list, revision):
4663
4639
class cmd_bind(Command):
4664
__doc__ = """Convert the current branch into a checkout of the supplied branch.
4665
If no branch is supplied, rebind to the last bound location.
4640
"""Convert the current branch into a checkout of the supplied branch.
4667
4642
Once converted into a checkout, commits must succeed on the master branch
4668
4643
before they will be applied to the local branch.
4675
4650
_see_also = ['checkouts', 'unbind']
4676
4651
takes_args = ['location?']
4677
takes_options = ['directory']
4679
def run(self, location=None, directory=u'.'):
4680
b, relpath = Branch.open_containing(directory)
4654
def run(self, location=None):
4655
b, relpath = Branch.open_containing(u'.')
4681
4656
if location is None:
4683
4658
location = b.get_old_bound_location()
4711
4686
_see_also = ['checkouts', 'bind']
4712
4687
takes_args = []
4713
takes_options = ['directory']
4715
def run(self, directory=u'.'):
4716
b, relpath = Branch.open_containing(directory)
4691
b, relpath = Branch.open_containing(u'.')
4717
4692
if not b.unbind():
4718
4693
raise errors.BzrCommandError('Local branch is not bound')
4721
4696
class cmd_uncommit(Command):
4722
__doc__ = """Remove the last committed revision.
4697
"""Remove the last committed revision.
4724
4699
--verbose will print out what is being removed.
4725
4700
--dry-run will go through all the motions, but not actually
4765
4740
b = control.open_branch()
4767
4742
if tree is not None:
4768
self.add_cleanup(tree.lock_write().unlock)
4744
self.add_cleanup(tree.unlock)
4770
self.add_cleanup(b.lock_write().unlock)
4747
self.add_cleanup(b.unlock)
4771
4748
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
4773
4750
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
4827
4804
class cmd_break_lock(Command):
4828
__doc__ = """Break a dead lock on a repository, branch or working directory.
4805
"""Break a dead lock on a repository, branch or working directory.
4830
4807
CAUTION: Locks should only be broken when you are sure that the process
4831
4808
holding the lock has been stopped.
4881
4858
'result in a dynamically allocated port. The default port '
4882
4859
'depends on the protocol.',
4884
custom_help('directory',
4885
help='Serve contents of this directory.'),
4862
help='Serve contents of this directory.',
4886
4864
Option('allow-writes',
4887
4865
help='By default the server is a readonly server. Supplying '
4888
4866
'--allow-writes enables write access to the contents of '
4916
4894
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4917
4895
protocol=None):
4918
from bzrlib import transport
4896
from bzrlib.transport import get_transport, transport_server_registry
4919
4897
if directory is None:
4920
4898
directory = os.getcwd()
4921
4899
if protocol is None:
4922
protocol = transport.transport_server_registry.get()
4900
protocol = transport_server_registry.get()
4923
4901
host, port = self.get_host_and_port(port)
4924
4902
url = urlutils.local_path_to_url(directory)
4925
4903
if not allow_writes:
4926
4904
url = 'readonly+' + url
4927
t = transport.get_transport(url)
4928
protocol(t, host, port, inet)
4905
transport = get_transport(url)
4906
protocol(transport, host, port, inet)
4931
4909
class cmd_join(Command):
4932
__doc__ = """Combine a tree into its containing tree.
4910
"""Combine a tree into its containing tree.
4934
4912
This command requires the target tree to be in a rich-root format.
5043
5020
encoding_type = 'exact'
5045
5022
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5046
sign=False, revision=None, mail_to=None, message=None,
5023
sign=False, revision=None, mail_to=None, message=None):
5048
5024
from bzrlib.revision import ensure_null, NULL_REVISION
5049
5025
include_patch, include_bundle = {
5050
5026
'plain': (False, False),
5051
5027
'diff': (True, False),
5052
5028
'bundle': (True, True),
5054
branch = Branch.open(directory)
5030
branch = Branch.open('.')
5055
5031
stored_submit_branch = branch.get_submit_branch()
5056
5032
if submit_branch is None:
5057
5033
submit_branch = stored_submit_branch
5142
5118
given, in which case it is sent to a file.
5144
5120
Mail is sent using your preferred mail program. This should be transparent
5145
on Windows (it uses MAPI). On Unix, it requires the xdg-email utility.
5121
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5146
5122
If the preferred client can't be found (or used), your editor will be used.
5148
5124
To use a specific mail program, set the mail_client configuration option.
5363
5343
class cmd_tags(Command):
5364
__doc__ = """List tags.
5366
5346
This command shows a table of tag names and the revisions they reference.
5369
5349
_see_also = ['tag']
5370
5350
takes_options = [
5371
custom_help('directory',
5372
help='Branch whose tags should be displayed.'),
5352
help='Branch whose tags should be displayed.',
5373
5356
RegistryOption.from_kwargs('sort',
5374
5357
'Sort tags by different criteria.', title='Sorting',
5375
5358
alpha='Sort tags lexicographically (default).',
5524
5508
class cmd_switch(Command):
5525
__doc__ = """Set the branch of a checkout and update.
5509
"""Set the branch of a checkout and update.
5527
5511
For lightweight checkouts, this changes the branch being referenced.
5528
5512
For heavyweight checkouts, this checks that there are no local commits
5547
5531
takes_args = ['to_location?']
5548
takes_options = ['directory',
5532
takes_options = [Option('force',
5550
5533
help='Switch even if local commits will be lost.'),
5552
5535
Option('create-branch', short_name='b',
5557
5540
def run(self, to_location=None, force=False, create_branch=False,
5558
revision=None, directory=u'.'):
5559
5542
from bzrlib import switch
5560
tree_location = directory
5561
5544
revision = _get_one_revision('switch', revision)
5562
5545
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5563
5546
if to_location is None:
5564
5547
if revision is None:
5565
5548
raise errors.BzrCommandError('You must supply either a'
5566
5549
' revision or a location')
5567
to_location = tree_location
5569
5552
branch = control_dir.open_branch()
5570
5553
had_explicit_nick = branch.get_config().has_explicit_nickname()
5820
5803
class cmd_shelve(Command):
5821
__doc__ = """Temporarily set aside some changes from the current tree.
5804
"""Temporarily set aside some changes from the current tree.
5823
5806
Shelve allows you to temporarily put changes you've made "on the shelf",
5824
5807
ie. out of the way, until a later time when you can bring them back from
5860
5842
_see_also = ['unshelve']
5862
5844
def run(self, revision=None, all=False, file_list=None, message=None,
5863
writer=None, list=False, destroy=False, directory=u'.'):
5845
writer=None, list=False, destroy=False):
5865
5847
return self.run_for_list()
5866
5848
from bzrlib.shelf_ui import Shelver
5868
5850
writer = bzrlib.option.diff_writer_registry.get()
5870
5852
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5871
file_list, message, destroy=destroy, directory=directory)
5853
file_list, message, destroy=destroy)
5917
5899
_see_also = ['shelve']
5919
def run(self, shelf_id=None, action='apply', directory=u'.'):
5901
def run(self, shelf_id=None, action='apply'):
5920
5902
from bzrlib.shelf_ui import Unshelver
5921
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
5903
unshelver = Unshelver.from_args(shelf_id, action)
5923
5905
unshelver.run()
5941
5923
To check what clean-tree will do, use --dry-run.
5943
takes_options = ['directory',
5944
Option('ignored', help='Delete all ignored files.'),
5925
takes_options = [Option('ignored', help='Delete all ignored files.'),
5945
5926
Option('detritus', help='Delete conflict files, merge'
5946
5927
' backups, and failed selftest dirs.'),
5947
5928
Option('unknown',
5950
5931
' deleting them.'),
5951
5932
Option('force', help='Do not prompt before deleting.')]
5952
5933
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
5953
force=False, directory=u'.'):
5954
5935
from bzrlib.clean_tree import clean_tree
5955
5936
if not (unknown or ignored or detritus):
5959
clean_tree(directory, unknown=unknown, ignored=ignored,
5960
detritus=detritus, dry_run=dry_run, no_prompt=force)
5940
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5941
dry_run=dry_run, no_prompt=force)
5963
5944
class cmd_reference(Command):
5964
__doc__ = """list, view and set branch locations for nested trees.
5945
"""list, view and set branch locations for nested trees.
5966
5947
If no arguments are provided, lists the branch locations for nested trees.
5967
5948
If one argument is provided, display the branch location for that tree.