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
231
# TODO: Make sure no commands unconditionally use the working directory as a
244
232
# branch. If a filename argument is used, the first of them should be used to
245
233
# specify the branch. (Perhaps this can be factored out into some kind of
361
349
self.outf.write(revtext.decode('utf-8'))
364
def run(self, revision_id=None, revision=None, directory=u'.'):
352
def run(self, revision_id=None, revision=None):
365
353
if revision_id is not None and revision is not None:
366
354
raise errors.BzrCommandError('You can only supply one of'
367
355
' revision_id or --revision')
368
356
if revision_id is None and revision is None:
369
357
raise errors.BzrCommandError('You must supply either'
370
358
' --revision or a revision_id')
371
b = WorkingTree.open_containing(directory)[0].branch
359
b = WorkingTree.open_containing(u'.')[0].branch
373
361
revisions = b.repository.revisions
374
362
if revisions is None:
468
456
for node in bt.iter_all_entries():
469
457
# Node is made up of:
470
458
# (index, key, value, [references])
474
refs_as_tuples = None
476
refs_as_tuples = static_tuple.as_tuples(refs)
459
refs_as_tuples = static_tuple.as_tuples(node[3])
477
460
as_tuple = (tuple(node[1]), node[2], refs_as_tuples)
478
461
self.outf.write('%s\n' % (as_tuple,))
481
464
class cmd_remove_tree(Command):
482
__doc__ = """Remove the working tree from a given branch/checkout.
465
"""Remove the working tree from a given branch/checkout.
484
467
Since a lightweight checkout is little more than a working tree
485
468
this will refuse to run against one.
512
495
if (working.has_changes()):
513
496
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:
498
working_path = working.bzrdir.root_transport.base
499
branch_path = working.branch.bzrdir.root_transport.base
500
if working_path != branch_path:
518
501
raise errors.BzrCommandError("You cannot remove the working tree"
519
502
" from a lightweight checkout")
549
533
revno = ".".join(str(n) for n in revno_t)
551
535
b = Branch.open_containing(location)[0]
552
self.add_cleanup(b.lock_read().unlock)
537
self.add_cleanup(b.unlock)
553
538
revno = b.revno()
554
539
self.cleanup_now()
555
540
self.outf.write(str(revno) + '\n')
558
543
class cmd_revision_info(Command):
559
__doc__ = """Show revision number and revision id for a given revision identifier.
544
"""Show revision number and revision id for a given revision identifier.
562
547
takes_args = ['revision_info*']
563
548
takes_options = [
565
custom_help('directory',
566
551
help='Branch to examine, '
567
'rather than the one containing the working directory.'),
552
'rather than the one containing the working directory.',
568
556
Option('tree', help='Show revno of working tree'),
709
700
def run(self, dir_list):
710
701
for d in dir_list:
711
703
wt, dd = WorkingTree.open_containing(d)
712
base = os.path.dirname(dd)
713
id = wt.path2id(base)
717
self.outf.write('added %s\n' % d)
719
raise errors.NotVersionedError(path=base)
705
self.outf.write('added %s\n' % d)
722
708
class cmd_relpath(Command):
723
__doc__ = """Show path of a file relative to root"""
709
"""Show path of a file relative to root"""
725
711
takes_args = ['filename']
763
749
revision = _get_one_revision('inventory', revision)
764
750
work_tree, file_list = tree_files(file_list)
765
self.add_cleanup(work_tree.lock_read().unlock)
751
work_tree.lock_read()
752
self.add_cleanup(work_tree.unlock)
766
753
if revision is not None:
767
754
tree = revision.as_tree(work_tree.branch)
769
756
extra_trees = [work_tree]
770
self.add_cleanup(tree.lock_read().unlock)
758
self.add_cleanup(tree.unlock)
833
821
if len(names_list) < 2:
834
822
raise errors.BzrCommandError("missing file argument")
835
823
tree, rel_names = tree_files(names_list, canonicalize=False)
836
self.add_cleanup(tree.lock_tree_write().unlock)
824
tree.lock_tree_write()
825
self.add_cleanup(tree.unlock)
837
826
self._run(tree, names_list, rel_names, after)
839
828
def run_auto(self, names_list, after, dry_run):
844
833
raise errors.BzrCommandError('--after cannot be specified with'
846
835
work_tree, file_list = tree_files(names_list, default_branch='.')
847
self.add_cleanup(work_tree.lock_tree_write().unlock)
836
work_tree.lock_tree_write()
837
self.add_cleanup(work_tree.unlock)
848
838
rename_map.RenameMap.guess_renames(work_tree, dry_run)
850
840
def _run(self, tree, names_list, rel_names, after):
958
948
takes_options = ['remember', 'overwrite', 'revision',
959
949
custom_help('verbose',
960
950
help='Show logs of pulled revisions.'),
961
custom_help('directory',
962
952
help='Branch to pull into, '
963
'rather than the one containing the working directory.'),
953
'rather than the one containing the working directory.',
965
958
help="Perform a local pull in a bound "
966
959
"branch. Local pulls are not applied to "
1023
1014
branch_from = Branch.open(location,
1024
1015
possible_transports=possible_transports)
1025
self.add_cleanup(branch_from.lock_read().unlock)
1027
1017
if branch_to.get_parent() is None or remember:
1028
1018
branch_to.set_parent(branch_from.base)
1020
if branch_from is not branch_to:
1021
branch_from.lock_read()
1022
self.add_cleanup(branch_from.unlock)
1030
1023
if revision is not None:
1031
1024
revision_id = revision.as_revision_id(branch_from)
1026
branch_to.lock_write()
1027
self.add_cleanup(branch_to.unlock)
1033
1028
if tree_to is not None:
1034
1029
view_info = _get_view_info_for_change_reporter(tree_to)
1035
1030
change_reporter = delta._ChangeReporter(
1080
1075
Option('create-prefix',
1081
1076
help='Create the path leading up to the branch '
1082
1077
'if it does not already exist.'),
1083
custom_help('directory',
1084
1079
help='Branch to push from, '
1085
'rather than the one containing the working directory.'),
1080
'rather than the one containing the working directory.',
1086
1084
Option('use-existing-dir',
1087
1085
help='By default push will fail if the target'
1088
1086
' directory exists, but does not already'
1114
1112
# Get the source branch
1115
1113
(tree, br_from,
1116
1114
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1116
strict = br_from.get_config().get_user_option_as_bool('push_strict')
1117
if strict is None: strict = True # default value
1117
1118
# Get the tip's revision_id
1118
1119
revision = _get_one_revision('push', revision)
1119
1120
if revision is not None:
1120
1121
revision_id = revision.in_history(br_from).rev_id
1122
1123
revision_id = None
1123
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.')
1124
if strict and tree is not None and revision_id is None:
1125
if (tree.has_changes()):
1126
raise errors.UncommittedChanges(
1127
tree, more='Use --no-strict to force the push.')
1128
if tree.last_revision() != tree.branch.last_revision():
1129
# The tree has lost sync with its branch, there is little
1130
# chance that the user is aware of it but he can still force
1131
# the push with --no-strict
1132
raise errors.OutOfDateTree(
1133
tree, more='Use --no-strict to force the push.')
1128
1135
# Get the stacked_on branch, if any
1129
1136
if stacked_on is not None:
1130
1137
stacked_on = urlutils.normalize_url(stacked_on)
1401
1411
master = branch.get_master_branch(
1402
1412
possible_transports=possible_transports)
1403
1413
if master is not None:
1404
1415
branch_location = master.base
1417
tree.lock_tree_write()
1407
1418
branch_location = tree.branch.base
1408
tree.lock_tree_write()
1409
1419
self.add_cleanup(tree.unlock)
1410
1420
# get rid of the final '/' and be ready for display
1411
branch_location = urlutils.unescape_for_display(
1412
branch_location.rstrip('/'),
1421
branch_location = urlutils.unescape_for_display(branch_location[:-1],
1414
1423
existing_pending_merges = tree.get_parent_ids()[1:]
1415
1424
if master is None:
1425
1434
revision_id = branch.last_revision()
1426
1435
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1427
revno = branch.revision_id_to_dotted_revno(revision_id)
1428
note("Tree is up to date at revision %s of branch %s" %
1429
('.'.join(map(str, revno)), branch_location))
1436
revno = branch.revision_id_to_revno(revision_id)
1437
note("Tree is up to date at revision %d of branch %s" %
1438
(revno, branch_location))
1431
1440
view_info = _get_view_info_for_change_reporter(tree)
1432
1441
change_reporter = delta._ChangeReporter(
1444
1453
"bzr update --revision only works"
1445
1454
" for a revision in the branch history"
1446
1455
% (e.revision))
1447
revno = tree.branch.revision_id_to_dotted_revno(
1456
revno = tree.branch.revision_id_to_revno(
1448
1457
_mod_revision.ensure_null(tree.last_revision()))
1449
note('Updated to revision %s of branch %s' %
1450
('.'.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:
1458
note('Updated to revision %d of branch %s' %
1459
(revno, branch_location))
1460
if tree.get_parent_ids()[1:] != existing_pending_merges:
1453
1461
note('Your local commits will now show as pending merges with '
1454
1462
"'bzr status', and can be committed with 'bzr commit'.")
1455
1463
if conflicts != 0:
1930
1939
help='Use this command to compare files.',
1933
RegistryOption('format',
1934
help='Diff format to use.',
1935
lazy_registry=('bzrlib.diff', 'format_registry'),
1936
value_switches=False, title='Diff format'),
1938
1943
aliases = ['di', 'dif']
1939
1944
encoding_type = 'exact'
1941
1946
@display_command
1942
1947
def run(self, revision=None, file_list=None, diff_options=None,
1943
prefix=None, old=None, new=None, using=None, format=None):
1944
from bzrlib.diff import (get_trees_and_branches_to_diff_locked,
1948
prefix=None, old=None, new=None, using=None):
1949
from bzrlib.diff import get_trees_and_branches_to_diff, show_diff_trees
1947
1951
if (prefix is None) or (prefix == '0'):
1948
1952
# diff -p0 format
1962
1966
raise errors.BzrCommandError('bzr diff --revision takes exactly'
1963
1967
' one or two revision specifiers')
1965
if using is not None and format is not None:
1966
raise errors.BzrCommandError('--using and --format are mutually '
1969
1969
(old_tree, new_tree,
1970
1970
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()
1971
specific_files, extra_trees) = get_trees_and_branches_to_diff(
1972
file_list, revision, old, new, apply_view=True)
1975
1973
return show_diff_trees(old_tree, new_tree, sys.stdout,
1976
1974
specific_files=specific_files,
1977
1975
external_diff_options=diff_options,
1978
1976
old_label=old_label, new_label=new_label,
1979
extra_trees=extra_trees,
1980
path_encoding=path_encoding,
1977
extra_trees=extra_trees, using=using)
1985
1980
class cmd_deleted(Command):
1986
__doc__ = """List files deleted in the working tree.
1981
"""List files deleted in the working tree.
1988
1983
# TODO: Show files deleted since a previous revision, or
1989
1984
# between two revisions.
1992
1987
# level of effort but possibly much less IO. (Or possibly not,
1993
1988
# if the directories are very large...)
1994
1989
_see_also = ['status', 'ls']
1995
takes_options = ['directory', 'show-ids']
1990
takes_options = ['show-ids']
1997
1992
@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)
1993
def run(self, show_ids=False):
1994
tree = WorkingTree.open_containing(u'.')[0]
1996
self.add_cleanup(tree.unlock)
2001
1997
old = tree.basis_tree()
2002
self.add_cleanup(old.lock_read().unlock)
1999
self.add_cleanup(old.unlock)
2003
2000
for path, ie in old.inventory.iter_entries():
2004
2001
if not tree.has_id(ie.file_id):
2005
2002
self.outf.write(path)
2012
2009
class cmd_modified(Command):
2013
__doc__ = """List files modified in working tree.
2010
"""List files modified in working tree.
2017
2014
_see_also = ['status', 'ls']
2018
takes_options = ['directory', 'null']
2017
help='Write an ascii NUL (\\0) separator '
2018
'between files rather than a newline.')
2020
2021
@display_command
2021
def run(self, null=False, directory=u'.'):
2022
tree = WorkingTree.open_containing(directory)[0]
2022
def run(self, null=False):
2023
tree = WorkingTree.open_containing(u'.')[0]
2023
2024
td = tree.changes_from(tree.basis_tree())
2024
2025
for path, id, kind, text_modified, meta_modified in td.modified:
2031
2032
class cmd_added(Command):
2032
__doc__ = """List files added in working tree.
2033
"""List files added in working tree.
2036
2037
_see_also = ['status', 'ls']
2037
takes_options = ['directory', 'null']
2040
help='Write an ascii NUL (\\0) separator '
2041
'between files rather than a newline.')
2039
2044
@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)
2045
def run(self, null=False):
2046
wt = WorkingTree.open_containing(u'.')[0]
2048
self.add_cleanup(wt.unlock)
2043
2049
basis = wt.basis_tree()
2044
self.add_cleanup(basis.lock_read().unlock)
2051
self.add_cleanup(basis.unlock)
2045
2052
basis_inv = basis.inventory
2046
2053
inv = wt.inventory
2047
2054
for file_id in inv:
2256
2263
help='Show just the specified revision.'
2257
2264
' 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
2266
Option('levels',
2265
2267
short_name='n',
2266
2268
help='Number of levels to display - 0 for all, 1 for flat.',
2336
2327
# find the file ids to log and check for directory filtering
2337
2328
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2338
revision, file_list, self.add_cleanup)
2329
revision, file_list)
2330
self.add_cleanup(b.unlock)
2339
2331
for relpath, file_id, kind in file_info_list:
2340
2332
if file_id is None:
2341
2333
raise errors.BzrCommandError(
2411
2403
direction=direction, specific_fileids=file_ids,
2412
2404
start_revision=rev1, end_revision=rev2, limit=limit,
2413
2405
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,
2406
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2417
2407
Logger(b, rqst).show(lf)
2438
2428
raise errors.BzrCommandError(
2439
2429
"bzr %s doesn't accept two revisions in different"
2440
2430
" branches." % command_name)
2441
if start_spec.spec is None:
2442
# Avoid loading all the history.
2443
rev1 = RevisionInfo(branch, None, None)
2445
rev1 = start_spec.in_history(branch)
2431
rev1 = start_spec.in_history(branch)
2446
2432
# Avoid loading all of history when we know a missing
2447
2433
# end of range means the last revision ...
2448
2434
if end_spec.spec is None:
2490
2476
tree, relpath = WorkingTree.open_containing(filename)
2491
2477
file_id = tree.path2id(relpath)
2492
2478
b = tree.branch
2493
self.add_cleanup(b.lock_read().unlock)
2480
self.add_cleanup(b.unlock)
2494
2481
touching_revs = log.find_touching_revisions(b, file_id)
2495
2482
for revno, revision_id, what in touching_revs:
2496
2483
self.outf.write("%6d %s\n" % (revno, what))
2499
2486
class cmd_ls(Command):
2500
__doc__ = """List files in a tree.
2487
"""List files in a tree.
2503
2490
_see_also = ['status', 'cat']
2509
2496
help='Recurse into subdirectories.'),
2510
2497
Option('from-root',
2511
2498
help='Print paths relative to the root of the branch.'),
2512
Option('unknown', short_name='u',
2513
help='Print unknown files.'),
2499
Option('unknown', help='Print unknown files.'),
2514
2500
Option('versioned', help='Print versioned files.',
2515
2501
short_name='V'),
2516
Option('ignored', short_name='i',
2517
help='Print ignored files.'),
2518
Option('kind', short_name='k',
2502
Option('ignored', help='Print ignored files.'),
2504
help='Write an ascii NUL (\\0) separator '
2505
'between files rather than a newline.'),
2519
2507
help='List entries of a particular kind: file, directory, symlink.',
2525
2511
@display_command
2526
2512
def run(self, revision=None, verbose=False,
2527
2513
recursive=False, from_root=False,
2528
2514
unknown=False, versioned=False, ignored=False,
2529
null=False, kind=None, show_ids=False, path=None, directory=None):
2515
null=False, kind=None, show_ids=False, path=None):
2531
2517
if kind and kind not in ('file', 'directory', 'symlink'):
2532
2518
raise errors.BzrCommandError('invalid kind specified')
2566
2552
view_str = views.view_display_str(view_files)
2567
2553
note("Ignoring files outside view. View is %s" % view_str)
2569
self.add_cleanup(tree.lock_read().unlock)
2556
self.add_cleanup(tree.unlock)
2570
2557
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2571
2558
from_dir=relpath, recursive=recursive):
2572
2559
# Apply additional masking
2616
2603
class cmd_unknowns(Command):
2617
__doc__ = """List unknown files.
2604
"""List unknown files.
2621
2608
_see_also = ['ls']
2622
takes_options = ['directory']
2624
2610
@display_command
2625
def run(self, directory=u'.'):
2626
for f in WorkingTree.open_containing(directory)[0].unknowns():
2612
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2627
2613
self.outf.write(osutils.quotefn(f) + '\n')
2630
2616
class cmd_ignore(Command):
2631
__doc__ = """Ignore specified files or patterns.
2617
"""Ignore specified files or patterns.
2633
2619
See ``bzr help patterns`` for details on the syntax of patterns.
2643
2629
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
2632
Patterns prefixed with '!' are exceptions to ignore patterns and take
2653
2633
precedence over regular ignores. Such exceptions are used to specify
2654
2634
files that should be versioned which would otherwise be ignored.
2695
2675
_see_also = ['status', 'ignored', 'patterns']
2696
2676
takes_args = ['name_pattern*']
2697
takes_options = ['directory',
2698
Option('default-rules',
2699
help='Display the default ignore rules that bzr uses.')
2678
Option('old-default-rules',
2679
help='Write out the ignore rules bzr < 0.9 always used.')
2702
def run(self, name_pattern_list=None, default_rules=None,
2682
def run(self, name_pattern_list=None, old_default_rules=None):
2704
2683
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:
2708
self.outf.write("%s\n" % pattern)
2684
if old_default_rules is not None:
2685
# dump the rules and exit
2686
for pattern in ignores.OLD_DEFAULTS:
2710
2689
if not name_pattern_list:
2711
2690
raise errors.BzrCommandError("ignore requires at least one "
2712
"NAME_PATTERN or --default-rules.")
2691
"NAME_PATTERN or --old-default-rules")
2713
2692
name_pattern_list = [globbing.normalize_pattern(p)
2714
2693
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
2694
for name_pattern in name_pattern_list:
2724
2695
if (name_pattern[0] == '/' or
2725
2696
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2726
2697
raise errors.BzrCommandError(
2727
2698
"NAME_PATTERN should not be an absolute path")
2728
tree, relpath = WorkingTree.open_containing(directory)
2699
tree, relpath = WorkingTree.open_containing(u'.')
2729
2700
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2730
2701
ignored = globbing.Globster(name_pattern_list)
2732
self.add_cleanup(tree.lock_read().unlock)
2733
2704
for entry in tree.list_files():
2735
2706
if id is not None:
2736
2707
filename = entry[0]
2737
2708
if ignored.match(filename):
2738
matches.append(filename)
2709
matches.append(filename.encode('utf-8'))
2739
2711
if len(matches) > 0:
2740
self.outf.write("Warning: the following files are version controlled and"
2741
" match your ignore pattern:\n%s"
2742
"\nThese files will continue to be version controlled"
2743
" unless you 'bzr remove' them.\n" % ("\n".join(matches),))
2712
print "Warning: the following files are version controlled and" \
2713
" match your ignore pattern:\n%s" \
2714
"\nThese files will continue to be version controlled" \
2715
" unless you 'bzr remove' them." % ("\n".join(matches),)
2746
2718
class cmd_ignored(Command):
2747
__doc__ = """List ignored files and the patterns that matched them.
2719
"""List ignored files and the patterns that matched them.
2749
2721
List all the ignored files and the ignore pattern that caused the file to
2757
2729
encoding_type = 'replace'
2758
2730
_see_also = ['ignore', 'ls']
2759
takes_options = ['directory']
2761
2732
@display_command
2762
def run(self, directory=u'.'):
2763
tree = WorkingTree.open_containing(directory)[0]
2764
self.add_cleanup(tree.lock_read().unlock)
2734
tree = WorkingTree.open_containing(u'.')[0]
2736
self.add_cleanup(tree.unlock)
2765
2737
for path, file_class, kind, file_id, entry in tree.list_files():
2766
2738
if file_class != 'I':
2773
2745
class cmd_lookup_revision(Command):
2774
__doc__ = """Lookup the revision-id from a revision-number
2746
"""Lookup the revision-id from a revision-number
2777
2749
bzr lookup-revision 33
2780
2752
takes_args = ['revno']
2781
takes_options = ['directory']
2783
2754
@display_command
2784
def run(self, revno, directory=u'.'):
2755
def run(self, revno):
2786
2757
revno = int(revno)
2787
2758
except ValueError:
2788
raise errors.BzrCommandError("not a valid revision-number: %r"
2790
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2791
self.outf.write("%s\n" % revid)
2759
raise errors.BzrCommandError("not a valid revision-number: %r" % revno)
2761
print WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2794
2764
class cmd_export(Command):
2795
__doc__ = """Export current or past revision to a destination directory or archive.
2765
"""Export current or past revision to a destination directory or archive.
2797
2767
If no revision is specified this exports the last committed revision.
2832
2802
help="Name of the root directory inside the exported file."),
2833
Option('per-file-timestamps',
2834
help='Set modification time of files to that of the last '
2835
'revision in which it was changed.'),
2837
2804
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2838
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2805
root=None, filters=False):
2839
2806
from bzrlib.export import export
2841
2808
if branch_or_subdir is None:
2842
tree = WorkingTree.open_containing(directory)[0]
2809
tree = WorkingTree.open_containing(u'.')[0]
2843
2810
b = tree.branch
2849
2816
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2851
export(rev_tree, dest, format, root, subdir, filtered=filters,
2852
per_file_timestamps=per_file_timestamps)
2818
export(rev_tree, dest, format, root, subdir, filtered=filters)
2853
2819
except errors.NoSuchExportFormat, e:
2854
2820
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
2857
2823
class cmd_cat(Command):
2858
__doc__ = """Write the contents of a file as of a given revision to standard output.
2824
"""Write the contents of a file as of a given revision to standard output.
2860
2826
If no revision is nominated, the last revision is used.
2876
2842
@display_command
2877
2843
def run(self, filename, revision=None, name_from_revision=False,
2878
filters=False, directory=None):
2879
2845
if revision is not None and len(revision) != 1:
2880
2846
raise errors.BzrCommandError("bzr cat --revision takes exactly"
2881
2847
" one revision specifier")
2882
2848
tree, branch, relpath = \
2883
_open_directory_or_containing_tree_or_branch(filename, directory)
2884
self.add_cleanup(branch.lock_read().unlock)
2849
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2851
self.add_cleanup(branch.unlock)
2885
2852
return self._run(tree, branch, relpath, filename, revision,
2886
2853
name_from_revision, filters)
2941
2909
class cmd_local_time_offset(Command):
2942
__doc__ = """Show the offset in seconds from GMT to local time."""
2910
"""Show the offset in seconds from GMT to local time."""
2944
2912
@display_command
2946
self.outf.write("%s\n" % osutils.local_time_offset())
2914
print osutils.local_time_offset()
2950
2918
class cmd_commit(Command):
2951
__doc__ = """Commit changes into a new revision.
2919
"""Commit changes into a new revision.
2953
2921
An explanatory message needs to be given for each commit. This is
2954
2922
often done by using the --message option (getting the message from the
3148
3116
'(use --file "%(f)s" to take commit message from that file)'
3149
3117
% { 'f': message })
3150
3118
ui.ui_factory.show_warning(warning_msg)
3152
message = message.replace('\r\n', '\n')
3153
message = message.replace('\r', '\n')
3155
raise errors.BzrCommandError(
3156
"please specify either --message or --file")
3158
3120
def get_message(commit_obj):
3159
3121
"""Callback to get commit message"""
3161
f = codecs.open(file, 'rt', osutils.get_user_encoding())
3163
my_message = f.read()
3166
elif message is not None:
3167
my_message = message
3169
# No message supplied: make one up.
3170
# text is the status of the tree
3171
text = make_commit_message_template_encoded(tree,
3122
my_message = message
3123
if my_message is not None and '\r' in my_message:
3124
my_message = my_message.replace('\r\n', '\n')
3125
my_message = my_message.replace('\r', '\n')
3126
if my_message is None and not file:
3127
t = make_commit_message_template_encoded(tree,
3172
3128
selected_list, diff=show_diff,
3173
3129
output_encoding=osutils.get_user_encoding())
3174
# start_message is the template generated from hooks
3175
# XXX: Warning - looks like hooks return unicode,
3176
# make_commit_message_template_encoded returns user encoding.
3177
# We probably want to be using edit_commit_message instead to
3179
3130
start_message = generate_commit_message_template(commit_obj)
3180
my_message = edit_commit_message_encoded(text,
3131
my_message = edit_commit_message_encoded(t,
3181
3132
start_message=start_message)
3182
3133
if my_message is None:
3183
3134
raise errors.BzrCommandError("please specify a commit"
3184
3135
" message with either --message or --file")
3136
elif my_message and file:
3137
raise errors.BzrCommandError(
3138
"please specify either --message or --file")
3140
my_message = codecs.open(file, 'rt',
3141
osutils.get_user_encoding()).read()
3185
3142
if my_message == "":
3186
3143
raise errors.BzrCommandError("empty commit message specified")
3187
3144
return my_message
3209
3168
raise errors.BzrCommandError("Commit refused because there are"
3210
3169
" unknown files in the working tree.")
3211
3170
except errors.BoundBranchOutOfDate, e:
3212
e.extra_help = ("\n"
3213
'To commit to master branch, run update and then commit.\n'
3214
'You can also pass --local to commit to continue working '
3171
raise errors.BzrCommandError(str(e) + "\n"
3172
'To commit to master branch, run update and then commit.\n'
3173
'You can also pass --local to commit to continue working '
3219
3177
class cmd_check(Command):
3220
__doc__ = """Validate working tree structure, branch consistency and repository history.
3178
"""Validate working tree structure, branch consistency and repository history.
3222
3180
This command checks various invariants about branch and repository storage
3223
3181
to detect data corruption or bzr bugs.
3333
3290
encoding_type = 'replace'
3335
3292
@display_command
3336
def run(self, email=False, branch=False, name=None, directory=None):
3293
def run(self, email=False, branch=False, name=None):
3337
3294
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()
3295
# use branch if we're inside one; otherwise global config
3297
c = Branch.open_containing('.')[0].get_config()
3298
except errors.NotBranchError:
3299
c = config.GlobalConfig()
3347
3301
self.outf.write(c.user_email() + '\n')
3359
3313
# 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()
3315
c = Branch.open_containing('.')[0].get_config()
3366
3317
c = config.GlobalConfig()
3367
3318
c.set_user_option('email', name)
3370
3321
class cmd_nick(Command):
3371
__doc__ = """Print or set the branch nickname.
3322
"""Print or set the branch nickname.
3373
3324
If unset, the tree root directory name is used as the nickname.
3374
3325
To print the current nickname, execute with no argument.
3537
3487
'throughout the test suite.',
3538
3488
type=get_transport_type),
3539
3489
Option('benchmark',
3540
help='Run the benchmarks rather than selftests.',
3490
help='Run the benchmarks rather than selftests.'),
3542
3491
Option('lsprof-timed',
3543
3492
help='Generate lsprof output for benchmarked'
3544
3493
' sections of code.'),
3545
3494
Option('lsprof-tests',
3546
3495
help='Generate lsprof output for each test.'),
3496
Option('cache-dir', type=str,
3497
help='Cache intermediate benchmark output in this '
3547
3499
Option('first',
3548
3500
help='Run all tests, but run specified tests first.',
3549
3501
short_name='f',
3584
3536
def run(self, testspecs_list=None, verbose=False, one=False,
3585
3537
transport=None, benchmark=None,
3538
lsprof_timed=None, cache_dir=None,
3587
3539
first=False, list_only=False,
3588
3540
randomize=None, exclude=None, strict=False,
3589
3541
load_list=None, debugflag=None, starting_with=None, subunit=False,
3590
3542
parallel=None, lsprof_tests=False):
3591
3543
from bzrlib.tests import selftest
3544
import bzrlib.benchmarks as benchmarks
3545
from bzrlib.benchmarks import tree_creator
3593
3547
# Make deprecation warnings visible, unless -Werror is set
3594
3548
symbol_versioning.activate_deprecation_warnings(override=False)
3550
if cache_dir is not None:
3551
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3596
3552
if testspecs_list is not None:
3597
3553
pattern = '|'.join(testspecs_list)
3604
3560
raise errors.BzrCommandError("subunit not available. subunit "
3605
3561
"needs to be installed to use --subunit.")
3606
3562
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
3564
self.additional_selftest_args.setdefault(
3618
3565
'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
3567
test_suite_factory = benchmarks.test_suite
3568
# Unless user explicitly asks for quiet, be verbose in benchmarks
3569
verbose = not is_quiet()
3570
# TODO: should possibly lock the history file...
3571
benchfile = open(".perf_history", "at", buffering=1)
3572
self.add_cleanup(benchfile.close)
3574
test_suite_factory = None
3624
3576
selftest_kwargs = {"verbose": verbose,
3625
3577
"pattern": pattern,
3626
3578
"stop_on_failure": one,
3662
3615
class cmd_rocks(Command):
3663
__doc__ = """Statement of optimism."""
3616
"""Statement of optimism."""
3667
3620
@display_command
3669
self.outf.write("It sure does!\n")
3622
print "It sure does!"
3672
3625
class cmd_find_merge_base(Command):
3673
__doc__ = """Find and print a base revision for merging two branches."""
3626
"""Find and print a base revision for merging two branches."""
3674
3627
# TODO: Options to specify revisions on either side, as if
3675
3628
# merging only part of the history.
3676
3629
takes_args = ['branch', 'other']
3683
3636
branch1 = Branch.open_containing(branch)[0]
3684
3637
branch2 = Branch.open_containing(other)[0]
3685
self.add_cleanup(branch1.lock_read().unlock)
3686
self.add_cleanup(branch2.lock_read().unlock)
3639
self.add_cleanup(branch1.unlock)
3641
self.add_cleanup(branch2.unlock)
3687
3642
last1 = ensure_null(branch1.last_revision())
3688
3643
last2 = ensure_null(branch2.last_revision())
3690
3645
graph = branch1.repository.get_graph(branch2.repository)
3691
3646
base_rev_id = graph.find_unique_lca(last1, last2)
3693
self.outf.write('merge base is revision %s\n' % base_rev_id)
3648
print 'merge base is revision %s' % base_rev_id
3696
3651
class cmd_merge(Command):
3697
__doc__ = """Perform a three-way merge.
3652
"""Perform a three-way merge.
3699
3654
The source of the merge can be specified either in the form of a branch,
3700
3655
or in the form of a path to a file containing a merge directive generated
3783
3738
' completely merged into the source, pull from the'
3784
3739
' source rather than merging. When this happens,'
3785
3740
' you do not need to commit the result.'),
3786
custom_help('directory',
3787
3742
help='Branch to merge into, '
3788
'rather than the one containing the working directory.'),
3743
'rather than the one containing the working directory.',
3789
3747
Option('preview', help='Instead of merging, show a diff of the'
3791
3749
Option('interactive', help='Select changes interactively.',
3891
3850
def _do_preview(self, merger):
3892
3851
from bzrlib.diff import show_diff_trees
3893
3852
result_tree = self._get_preview(merger)
3894
path_encoding = osutils.get_diff_header_encoding()
3895
3853
show_diff_trees(merger.this_tree, result_tree, self.outf,
3896
old_label='', new_label='',
3897
path_encoding=path_encoding)
3854
old_label='', new_label='')
3899
3856
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3900
3857
merger.change_reporter = change_reporter
4085
4042
def run(self, file_list=None, merge_type=None, show_base=False,
4086
4043
reprocess=False):
4087
from bzrlib.conflicts import restore
4088
4044
if merge_type is None:
4089
4045
merge_type = _mod_merge.Merge3Merger
4090
4046
tree, file_list = tree_files(file_list)
4091
self.add_cleanup(tree.lock_write().unlock)
4048
self.add_cleanup(tree.unlock)
4092
4049
parents = tree.get_parent_ids()
4093
4050
if len(parents) != 2:
4094
4051
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4327
4284
theirs_only=False,
4328
4285
log_format=None, long=False, short=False, line=False,
4329
4286
show_ids=False, verbose=False, this=False, other=False,
4330
include_merges=False, revision=None, my_revision=None,
4287
include_merges=False, revision=None, my_revision=None):
4332
4288
from bzrlib.missing import find_unmerged, iter_log_revisions
4333
4289
def message(s):
4334
4290
if not is_quiet():
4364
4318
remote_branch = Branch.open(other_branch)
4365
4319
if remote_branch.base == local_branch.base:
4366
4320
remote_branch = local_branch
4368
self.add_cleanup(remote_branch.lock_read().unlock)
4322
local_branch.lock_read()
4323
self.add_cleanup(local_branch.unlock)
4370
4324
local_revid_range = _revision_range_to_revid_range(
4371
4325
_get_revision_range(my_revision, local_branch,
4328
remote_branch.lock_read()
4329
self.add_cleanup(remote_branch.unlock)
4374
4330
remote_revid_range = _revision_range_to_revid_range(
4375
4331
_get_revision_range(revision,
4376
4332
remote_branch, self.name()))
4436
4393
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.
4394
"""Compress the data within a repository."""
4455
4396
_see_also = ['repositories']
4456
4397
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):
4399
def run(self, branch_or_repo='.'):
4462
4400
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4464
4402
branch = dir.open_branch()
4465
4403
repository = branch.repository
4466
4404
except errors.NotBranchError:
4467
4405
repository = dir.open_repository()
4468
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
4471
4409
class cmd_plugins(Command):
4472
__doc__ = """List the installed plugins.
4410
"""List the installed plugins.
4474
4412
This command displays the list of installed plugins including
4475
4413
version of plugin and a short description of each.
4506
4444
doc = '(no description)'
4507
4445
result.append((name_ver, doc, plugin.path()))
4508
4446
for name_ver, doc, path in sorted(result):
4509
self.outf.write("%s\n" % name_ver)
4510
self.outf.write(" %s\n" % doc)
4512
self.outf.write(" %s\n" % path)
4513
self.outf.write("\n")
4516
4454
class cmd_testament(Command):
4517
__doc__ = """Show testament (signing-form) of a revision."""
4455
"""Show testament (signing-form) of a revision."""
4518
4456
takes_options = [
4520
4458
Option('long', help='Produce long-format testament.'),
4562
4501
Option('long', help='Show commit date in annotations.'),
4567
4505
encoding_type = 'exact'
4569
4507
@display_command
4570
4508
def run(self, filename, all=False, long=False, revision=None,
4571
show_ids=False, directory=None):
4572
4510
from bzrlib.annotate import annotate_file, annotate_file_tree
4573
4511
wt, branch, relpath = \
4574
_open_directory_or_containing_tree_or_branch(filename, directory)
4512
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4575
4513
if wt is not None:
4576
self.add_cleanup(wt.lock_read().unlock)
4515
self.add_cleanup(wt.unlock)
4578
self.add_cleanup(branch.lock_read().unlock)
4518
self.add_cleanup(branch.unlock)
4579
4519
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4580
self.add_cleanup(tree.lock_read().unlock)
4521
self.add_cleanup(tree.unlock)
4581
4522
if wt is not None:
4582
4523
file_id = wt.path2id(relpath)
4598
4539
class cmd_re_sign(Command):
4599
__doc__ = """Create a digital signature for an existing revision."""
4540
"""Create a digital signature for an existing revision."""
4600
4541
# TODO be able to replace existing ones.
4602
4543
hidden = True # is this right ?
4603
4544
takes_args = ['revision_id*']
4604
takes_options = ['directory', 'revision']
4545
takes_options = ['revision']
4606
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4547
def run(self, revision_id_list=None, revision=None):
4607
4548
if revision_id_list is not None and revision is not None:
4608
4549
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4609
4550
if revision_id_list is None and revision is None:
4610
4551
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)
4552
b = WorkingTree.open_containing(u'.')[0].branch
4554
self.add_cleanup(b.unlock)
4613
4555
return self._run(b, revision_id_list, revision)
4615
4557
def _run(self, b, revision_id_list, revision):
4675
4616
_see_also = ['checkouts', 'unbind']
4676
4617
takes_args = ['location?']
4677
takes_options = ['directory']
4679
def run(self, location=None, directory=u'.'):
4680
b, relpath = Branch.open_containing(directory)
4620
def run(self, location=None):
4621
b, relpath = Branch.open_containing(u'.')
4681
4622
if location is None:
4683
4624
location = b.get_old_bound_location()
4711
4652
_see_also = ['checkouts', 'bind']
4712
4653
takes_args = []
4713
takes_options = ['directory']
4715
def run(self, directory=u'.'):
4716
b, relpath = Branch.open_containing(directory)
4657
b, relpath = Branch.open_containing(u'.')
4717
4658
if not b.unbind():
4718
4659
raise errors.BzrCommandError('Local branch is not bound')
4721
4662
class cmd_uncommit(Command):
4722
__doc__ = """Remove the last committed revision.
4663
"""Remove the last committed revision.
4724
4665
--verbose will print out what is being removed.
4725
4666
--dry-run will go through all the motions, but not actually
4765
4706
b = control.open_branch()
4767
4708
if tree is not None:
4768
self.add_cleanup(tree.lock_write().unlock)
4710
self.add_cleanup(tree.unlock)
4770
self.add_cleanup(b.lock_write().unlock)
4713
self.add_cleanup(b.unlock)
4771
4714
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
4773
4716
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
4806
4750
end_revision=last_revno)
4809
self.outf.write('Dry-run, pretending to remove'
4810
' the above revisions.\n')
4753
ui.ui_factory.note('Dry-run, pretending to remove the above revisions.')
4812
self.outf.write('The above revision(s) will be removed.\n')
4755
ui.ui_factory.note('The above revision(s) will be removed.')
4815
if not ui.ui_factory.get_boolean('Are you sure'):
4816
self.outf.write('Canceled')
4758
if not ui.ui_factory.get_boolean('Are you sure [y/N]? '):
4759
ui.ui_factory.note('Canceled')
4819
4762
mutter('Uncommitting from {%s} to {%s}',
4820
4763
last_rev_id, rev_id)
4821
4764
uncommit(b, tree=tree, dry_run=dry_run, verbose=verbose,
4822
4765
revno=revno, local=local)
4823
self.outf.write('You can restore the old tip by running:\n'
4824
' bzr pull . -r revid:%s\n' % last_rev_id)
4766
ui.ui_factory.note('You can restore the old tip by running:\n'
4767
' bzr pull . -r revid:%s' % last_rev_id)
4827
4770
class cmd_break_lock(Command):
4828
__doc__ = """Break a dead lock on a repository, branch or working directory.
4771
"""Break a dead lock on a repository, branch or working directory.
4830
4773
CAUTION: Locks should only be broken when you are sure that the process
4831
4774
holding the lock has been stopped.
4916
4860
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4917
4861
protocol=None):
4918
from bzrlib import transport
4862
from bzrlib.transport import get_transport, transport_server_registry
4919
4863
if directory is None:
4920
4864
directory = os.getcwd()
4921
4865
if protocol is None:
4922
protocol = transport.transport_server_registry.get()
4866
protocol = transport_server_registry.get()
4923
4867
host, port = self.get_host_and_port(port)
4924
4868
url = urlutils.local_path_to_url(directory)
4925
4869
if not allow_writes:
4926
4870
url = 'readonly+' + url
4927
t = transport.get_transport(url)
4928
protocol(t, host, port, inet)
4871
transport = get_transport(url)
4872
protocol(transport, host, port, inet)
4931
4875
class cmd_join(Command):
4932
__doc__ = """Combine a tree into its containing tree.
4876
"""Combine a tree into its containing tree.
4934
4878
This command requires the target tree to be in a rich-root format.
5043
4986
encoding_type = 'exact'
5045
4988
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5046
sign=False, revision=None, mail_to=None, message=None,
4989
sign=False, revision=None, mail_to=None, message=None):
5048
4990
from bzrlib.revision import ensure_null, NULL_REVISION
5049
4991
include_patch, include_bundle = {
5050
4992
'plain': (False, False),
5051
4993
'diff': (True, False),
5052
4994
'bundle': (True, True),
5054
branch = Branch.open(directory)
4996
branch = Branch.open('.')
5055
4997
stored_submit_branch = branch.get_submit_branch()
5056
4998
if submit_branch is None:
5057
4999
submit_branch = stored_submit_branch
5142
5084
given, in which case it is sent to a file.
5144
5086
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.
5087
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5146
5088
If the preferred client can't be found (or used), your editor will be used.
5148
5090
To use a specific mail program, set the mail_client configuration option.
5307
5249
To rename a tag (change the name but keep it on the same revsion), run ``bzr
5308
5250
tag new-name -r tag:old-name`` and then ``bzr tag --delete oldname``.
5310
If no tag name is specified it will be determined through the
5311
'automatic_tag_name' hook. This can e.g. be used to automatically tag
5312
upstream releases by reading configure.ac. See ``bzr help hooks`` for
5316
5253
_see_also = ['commit', 'tags']
5317
takes_args = ['tag_name?']
5254
takes_args = ['tag_name']
5318
5255
takes_options = [
5319
5256
Option('delete',
5320
5257
help='Delete this tag rather than placing it.',
5322
custom_help('directory',
5323
help='Branch in which to place the tag.'),
5260
help='Branch in which to place the tag.',
5324
5264
Option('force',
5325
5265
help='Replace existing tags.',
5330
def run(self, tag_name=None,
5270
def run(self, tag_name,
5336
5276
branch, relpath = Branch.open_containing(directory)
5337
self.add_cleanup(branch.lock_write().unlock)
5278
self.add_cleanup(branch.unlock)
5339
if tag_name is None:
5340
raise errors.BzrCommandError("No tag specified to delete.")
5341
5280
branch.tags.delete_tag(tag_name)
5342
5281
self.outf.write('Deleted tag %s.\n' % tag_name)
5363
5297
class cmd_tags(Command):
5364
__doc__ = """List tags.
5366
5300
This command shows a table of tag names and the revisions they reference.
5369
5303
_see_also = ['tag']
5370
5304
takes_options = [
5371
custom_help('directory',
5372
help='Branch whose tags should be displayed.'),
5306
help='Branch whose tags should be displayed.',
5373
5310
RegistryOption.from_kwargs('sort',
5374
5311
'Sort tags by different criteria.', title='Sorting',
5375
5312
alpha='Sort tags lexicographically (default).',
5557
5494
def run(self, to_location=None, force=False, create_branch=False,
5558
revision=None, directory=u'.'):
5559
5496
from bzrlib import switch
5560
tree_location = directory
5561
5498
revision = _get_one_revision('switch', revision)
5562
5499
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5563
5500
if to_location is None:
5564
5501
if revision is None:
5565
5502
raise errors.BzrCommandError('You must supply either a'
5566
5503
' revision or a location')
5567
to_location = tree_location
5569
5506
branch = control_dir.open_branch()
5570
5507
had_explicit_nick = branch.get_config().has_explicit_nickname()
5792
5729
self.outf.write(" <no hooks installed>\n")
5795
class cmd_remove_branch(Command):
5796
__doc__ = """Remove a branch.
5798
This will remove the branch from the specified location but
5799
will keep any working tree or repository in place.
5803
Remove the branch at repo/trunk::
5805
bzr remove-branch repo/trunk
5809
takes_args = ["location?"]
5811
aliases = ["rmbranch"]
5813
def run(self, location=None):
5814
if location is None:
5816
branch = Branch.open_containing(location)[0]
5817
branch.bzrdir.destroy_branch()
5820
5732
class cmd_shelve(Command):
5821
__doc__ = """Temporarily set aside some changes from the current tree.
5733
"""Temporarily set aside some changes from the current tree.
5823
5735
Shelve allows you to temporarily put changes you've made "on the shelf",
5824
5736
ie. out of the way, until a later time when you can bring them back from
5860
5771
_see_also = ['unshelve']
5862
5773
def run(self, revision=None, all=False, file_list=None, message=None,
5863
writer=None, list=False, destroy=False, directory=u'.'):
5774
writer=None, list=False, destroy=False):
5865
5776
return self.run_for_list()
5866
5777
from bzrlib.shelf_ui import Shelver
5917
5828
_see_also = ['shelve']
5919
def run(self, shelf_id=None, action='apply', directory=u'.'):
5830
def run(self, shelf_id=None, action='apply'):
5920
5831
from bzrlib.shelf_ui import Unshelver
5921
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
5832
unshelver = Unshelver.from_args(shelf_id, action)
5923
5834
unshelver.run()
5941
5852
To check what clean-tree will do, use --dry-run.
5943
takes_options = ['directory',
5944
Option('ignored', help='Delete all ignored files.'),
5854
takes_options = [Option('ignored', help='Delete all ignored files.'),
5945
5855
Option('detritus', help='Delete conflict files, merge'
5946
5856
' backups, and failed selftest dirs.'),
5947
5857
Option('unknown',
5950
5860
' deleting them.'),
5951
5861
Option('force', help='Do not prompt before deleting.')]
5952
5862
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
5953
force=False, directory=u'.'):
5954
5864
from bzrlib.clean_tree import clean_tree
5955
5865
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)
5869
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5870
dry_run=dry_run, no_prompt=force)
5963
5873
class cmd_reference(Command):
5964
__doc__ = """list, view and set branch locations for nested trees.
5874
"""list, view and set branch locations for nested trees.
5966
5876
If no arguments are provided, lists the branch locations for nested trees.
5967
5877
If one argument is provided, display the branch location for that tree.
6007
5917
self.outf.write('%s %s\n' % (path, location))
6010
def _register_lazy_builtins():
6011
# register lazy builtins from other modules; called at startup and should
6012
# be only called once.
6013
for (name, aliases, module_name) in [
6014
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6015
('cmd_dpush', [], 'bzrlib.foreign'),
6016
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6017
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6018
('cmd_conflicts', [], 'bzrlib.conflicts'),
6019
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6021
builtin_command_registry.register_lazy(name, aliases, module_name)
5920
# these get imported and then picked up by the scan for cmd_*
5921
# TODO: Some more consistent way to split command definitions across files;
5922
# we do need to load at least some information about them to know of
5923
# aliases. ideally we would avoid loading the implementation until the
5924
# details were needed.
5925
from bzrlib.cmd_version_info import cmd_version_info
5926
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
5927
from bzrlib.bundle.commands import (
5930
from bzrlib.foreign import cmd_dpush
5931
from bzrlib.sign_my_commits import cmd_sign_my_commits