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:
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)
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)
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)
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(
1970
1985
old_branch, new_branch,
1971
1986
specific_files, extra_trees) = get_trees_and_branches_to_diff_locked(
1972
1987
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()
1975
1988
return show_diff_trees(old_tree, new_tree, sys.stdout,
1976
1989
specific_files=specific_files,
1977
1990
external_diff_options=diff_options,
1978
1991
old_label=old_label, new_label=new_label,
1979
extra_trees=extra_trees,
1980
path_encoding=path_encoding,
1992
extra_trees=extra_trees, using=using,
1982
1993
format_cls=format)
1992
2003
# level of effort but possibly much less IO. (Or possibly not,
1993
2004
# if the directories are very large...)
1994
2005
_see_also = ['status', 'ls']
1995
takes_options = ['directory', 'show-ids']
2006
takes_options = ['show-ids']
1997
2008
@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)
2009
def run(self, show_ids=False):
2010
tree = WorkingTree.open_containing(u'.')[0]
2012
self.add_cleanup(tree.unlock)
2001
2013
old = tree.basis_tree()
2002
self.add_cleanup(old.lock_read().unlock)
2015
self.add_cleanup(old.unlock)
2003
2016
for path, ie in old.inventory.iter_entries():
2004
2017
if not tree.has_id(ie.file_id):
2005
2018
self.outf.write(path)
2017
2030
_see_also = ['status', 'ls']
2018
takes_options = ['directory', 'null']
2033
help='Write an ascii NUL (\\0) separator '
2034
'between files rather than a newline.')
2020
2037
@display_command
2021
def run(self, null=False, directory=u'.'):
2022
tree = WorkingTree.open_containing(directory)[0]
2038
def run(self, null=False):
2039
tree = WorkingTree.open_containing(u'.')[0]
2023
2040
td = tree.changes_from(tree.basis_tree())
2024
2041
for path, id, kind, text_modified, meta_modified in td.modified:
2036
2053
_see_also = ['status', 'ls']
2037
takes_options = ['directory', 'null']
2056
help='Write an ascii NUL (\\0) separator '
2057
'between files rather than a newline.')
2039
2060
@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)
2061
def run(self, null=False):
2062
wt = WorkingTree.open_containing(u'.')[0]
2064
self.add_cleanup(wt.unlock)
2043
2065
basis = wt.basis_tree()
2044
self.add_cleanup(basis.lock_read().unlock)
2067
self.add_cleanup(basis.unlock)
2045
2068
basis_inv = basis.inventory
2046
2069
inv = wt.inventory
2047
2070
for file_id in inv:
2050
2073
if inv.is_root(file_id) and len(basis_inv) == 0:
2052
2075
path = inv.id2path(file_id)
2053
if not os.access(osutils.pathjoin(wt.basedir, path), os.F_OK):
2076
if not os.access(osutils.abspath(path), os.F_OK):
2056
2079
self.outf.write(path + '\0')
2256
2279
help='Show just the specified revision.'
2257
2280
' 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
2282
Option('levels',
2265
2283
short_name='n',
2266
2284
help='Number of levels to display - 0 for all, 1 for flat.',
2281
2299
help='Show changes made in each revision as a patch.'),
2282
2300
Option('include-merges',
2283
2301
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
2303
encoding_type = 'replace'
2302
2316
show_diff=False,
2303
include_merges=False,
2305
exclude_common_ancestry=False,
2317
include_merges=False):
2307
2318
from bzrlib.log import (
2309
2320
make_log_request_dict,
2310
2321
_get_info_for_log_files,
2312
2323
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
2324
if include_merges:
2318
2325
if levels is None:
2336
2343
# find the file ids to log and check for directory filtering
2337
2344
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2338
revision, file_list, self.add_cleanup)
2345
revision, file_list)
2346
self.add_cleanup(b.unlock)
2339
2347
for relpath, file_id, kind in file_info_list:
2340
2348
if file_id is None:
2341
2349
raise errors.BzrCommandError(
2360
2368
dir, relpath = bzrdir.BzrDir.open_containing(location)
2361
2369
b = dir.open_branch()
2362
self.add_cleanup(b.lock_read().unlock)
2371
self.add_cleanup(b.unlock)
2363
2372
rev1, rev2 = _get_revision_range(revision, b, self.name())
2365
2374
# Decide on the type of delta & diff filtering to use
2385
2394
show_timezone=timezone,
2386
2395
delta_format=get_verbosity_level(),
2388
show_advice=levels is None,
2389
author_list_handler=authors)
2397
show_advice=levels is None)
2391
2399
# Choose the algorithm for doing the logging. It's annoying
2392
2400
# having multiple code paths like this but necessary until
2411
2419
direction=direction, specific_fileids=file_ids,
2412
2420
start_revision=rev1, end_revision=rev2, limit=limit,
2413
2421
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,
2422
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2417
2423
Logger(b, rqst).show(lf)
2490
2496
tree, relpath = WorkingTree.open_containing(filename)
2491
2497
file_id = tree.path2id(relpath)
2492
2498
b = tree.branch
2493
self.add_cleanup(b.lock_read().unlock)
2500
self.add_cleanup(b.unlock)
2494
2501
touching_revs = log.find_touching_revisions(b, file_id)
2495
2502
for revno, revision_id, what in touching_revs:
2496
2503
self.outf.write("%6d %s\n" % (revno, what))
2509
2516
help='Recurse into subdirectories.'),
2510
2517
Option('from-root',
2511
2518
help='Print paths relative to the root of the branch.'),
2512
Option('unknown', short_name='u',
2513
help='Print unknown files.'),
2519
Option('unknown', help='Print unknown files.'),
2514
2520
Option('versioned', help='Print versioned files.',
2515
2521
short_name='V'),
2516
Option('ignored', short_name='i',
2517
help='Print ignored files.'),
2518
Option('kind', short_name='k',
2522
Option('ignored', help='Print ignored files.'),
2524
help='Write an ascii NUL (\\0) separator '
2525
'between files rather than a newline.'),
2519
2527
help='List entries of a particular kind: file, directory, symlink.',
2525
2531
@display_command
2526
2532
def run(self, revision=None, verbose=False,
2527
2533
recursive=False, from_root=False,
2528
2534
unknown=False, versioned=False, ignored=False,
2529
null=False, kind=None, show_ids=False, path=None, directory=None):
2535
null=False, kind=None, show_ids=False, path=None):
2531
2537
if kind and kind not in ('file', 'directory', 'symlink'):
2532
2538
raise errors.BzrCommandError('invalid kind specified')
2544
2550
raise errors.BzrCommandError('cannot specify both --from-root'
2547
tree, branch, relpath = \
2548
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2553
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
2550
2556
# Calculate the prefix to use
2566
2572
view_str = views.view_display_str(view_files)
2567
2573
note("Ignoring files outside view. View is %s" % view_str)
2569
self.add_cleanup(tree.lock_read().unlock)
2576
self.add_cleanup(tree.unlock)
2570
2577
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2571
2578
from_dir=relpath, recursive=recursive):
2572
2579
# Apply additional masking
2643
2649
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
2652
Patterns prefixed with '!' are exceptions to ignore patterns and take
2653
2653
precedence over regular ignores. Such exceptions are used to specify
2654
2654
files that should be versioned which would otherwise be ignored.
2695
2695
_see_also = ['status', 'ignored', 'patterns']
2696
2696
takes_args = ['name_pattern*']
2697
takes_options = ['directory',
2698
Option('default-rules',
2699
help='Display the default ignore rules that bzr uses.')
2698
Option('old-default-rules',
2699
help='Write out the ignore rules bzr < 0.9 always used.')
2702
def run(self, name_pattern_list=None, default_rules=None,
2702
def run(self, name_pattern_list=None, old_default_rules=None):
2704
2703
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:
2704
if old_default_rules is not None:
2705
# dump the rules and exit
2706
for pattern in ignores.OLD_DEFAULTS:
2708
2707
self.outf.write("%s\n" % pattern)
2710
2709
if not name_pattern_list:
2711
2710
raise errors.BzrCommandError("ignore requires at least one "
2712
"NAME_PATTERN or --default-rules.")
2711
"NAME_PATTERN or --old-default-rules")
2713
2712
name_pattern_list = [globbing.normalize_pattern(p)
2714
2713
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
2714
for name_pattern in name_pattern_list:
2724
2715
if (name_pattern[0] == '/' or
2725
2716
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2726
2717
raise errors.BzrCommandError(
2727
2718
"NAME_PATTERN should not be an absolute path")
2728
tree, relpath = WorkingTree.open_containing(directory)
2719
tree, relpath = WorkingTree.open_containing(u'.')
2729
2720
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2730
2721
ignored = globbing.Globster(name_pattern_list)
2732
self.add_cleanup(tree.lock_read().unlock)
2733
2724
for entry in tree.list_files():
2735
2726
if id is not None:
2736
2727
filename = entry[0]
2737
2728
if ignored.match(filename):
2738
2729
matches.append(filename)
2739
2731
if len(matches) > 0:
2740
2732
self.outf.write("Warning: the following files are version controlled and"
2741
2733
" match your ignore pattern:\n%s"
2757
2749
encoding_type = 'replace'
2758
2750
_see_also = ['ignore', 'ls']
2759
takes_options = ['directory']
2761
2752
@display_command
2762
def run(self, directory=u'.'):
2763
tree = WorkingTree.open_containing(directory)[0]
2764
self.add_cleanup(tree.lock_read().unlock)
2754
tree = WorkingTree.open_containing(u'.')[0]
2756
self.add_cleanup(tree.unlock)
2765
2757
for path, file_class, kind, file_id, entry in tree.list_files():
2766
2758
if file_class != 'I':
2780
2772
takes_args = ['revno']
2781
takes_options = ['directory']
2783
2774
@display_command
2784
def run(self, revno, directory=u'.'):
2775
def run(self, revno):
2786
2777
revno = int(revno)
2787
2778
except ValueError:
2788
2779
raise errors.BzrCommandError("not a valid revision-number: %r"
2790
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2781
revid = WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2791
2782
self.outf.write("%s\n" % revid)
2835
2826
'revision in which it was changed.'),
2837
2828
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2838
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2829
root=None, filters=False, per_file_timestamps=False):
2839
2830
from bzrlib.export import export
2841
2832
if branch_or_subdir is None:
2842
tree = WorkingTree.open_containing(directory)[0]
2833
tree = WorkingTree.open_containing(u'.')[0]
2843
2834
b = tree.branch
2876
2867
@display_command
2877
2868
def run(self, filename, revision=None, name_from_revision=False,
2878
filters=False, directory=None):
2879
2870
if revision is not None and len(revision) != 1:
2880
2871
raise errors.BzrCommandError("bzr cat --revision takes exactly"
2881
2872
" one revision specifier")
2882
2873
tree, branch, relpath = \
2883
_open_directory_or_containing_tree_or_branch(filename, directory)
2884
self.add_cleanup(branch.lock_read().unlock)
2874
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2876
self.add_cleanup(branch.unlock)
2885
2877
return self._run(tree, branch, relpath, filename, revision,
2886
2878
name_from_revision, filters)
3158
3151
def get_message(commit_obj):
3159
3152
"""Callback to get commit message"""
3161
f = codecs.open(file, 'rt', osutils.get_user_encoding())
3163
my_message = f.read()
3154
my_message = codecs.open(
3155
file, 'rt', osutils.get_user_encoding()).read()
3166
3156
elif message is not None:
3167
3157
my_message = message
3323
3313
bzr whoami "Frank Chu <fchu@example.com>"
3325
takes_options = [ 'directory',
3315
takes_options = [ Option('email',
3327
3316
help='Display email address only.'),
3328
3317
Option('branch',
3329
3318
help='Set identity for the current branch instead of '
3333
3322
encoding_type = 'replace'
3335
3324
@display_command
3336
def run(self, email=False, branch=False, name=None, directory=None):
3325
def run(self, email=False, branch=False, name=None):
3337
3326
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()
3327
# use branch if we're inside one; otherwise global config
3329
c = Branch.open_containing('.')[0].get_config()
3330
except errors.NotBranchError:
3331
c = config.GlobalConfig()
3347
3333
self.outf.write(c.user_email() + '\n')
3359
3345
# 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()
3347
c = Branch.open_containing('.')[0].get_config()
3366
3349
c = config.GlobalConfig()
3367
3350
c.set_user_option('email', name)
3380
3363
_see_also = ['info']
3381
3364
takes_args = ['nickname?']
3382
takes_options = ['directory']
3383
def run(self, nickname=None, directory=u'.'):
3384
branch = Branch.open_containing(directory)[0]
3365
def run(self, nickname=None):
3366
branch = Branch.open_containing(u'.')[0]
3385
3367
if nickname is None:
3386
3368
self.printme(branch)
3537
3519
'throughout the test suite.',
3538
3520
type=get_transport_type),
3539
3521
Option('benchmark',
3540
help='Run the benchmarks rather than selftests.',
3522
help='Run the benchmarks rather than selftests.'),
3542
3523
Option('lsprof-timed',
3543
3524
help='Generate lsprof output for benchmarked'
3544
3525
' sections of code.'),
3545
3526
Option('lsprof-tests',
3546
3527
help='Generate lsprof output for each test.'),
3528
Option('cache-dir', type=str,
3529
help='Cache intermediate benchmark output in this '
3547
3531
Option('first',
3548
3532
help='Run all tests, but run specified tests first.',
3549
3533
short_name='f',
3584
3568
def run(self, testspecs_list=None, verbose=False, one=False,
3585
3569
transport=None, benchmark=None,
3570
lsprof_timed=None, cache_dir=None,
3587
3571
first=False, list_only=False,
3588
3572
randomize=None, exclude=None, strict=False,
3589
3573
load_list=None, debugflag=None, starting_with=None, subunit=False,
3590
3574
parallel=None, lsprof_tests=False):
3591
3575
from bzrlib.tests import selftest
3576
import bzrlib.benchmarks as benchmarks
3577
from bzrlib.benchmarks import tree_creator
3593
3579
# Make deprecation warnings visible, unless -Werror is set
3594
3580
symbol_versioning.activate_deprecation_warnings(override=False)
3582
if cache_dir is not None:
3583
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3596
3584
if testspecs_list is not None:
3597
3585
pattern = '|'.join(testspecs_list)
3604
3592
raise errors.BzrCommandError("subunit not available. subunit "
3605
3593
"needs to be installed to use --subunit.")
3606
3594
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
3596
self.additional_selftest_args.setdefault(
3618
3597
'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
3599
test_suite_factory = benchmarks.test_suite
3600
# Unless user explicitly asks for quiet, be verbose in benchmarks
3601
verbose = not is_quiet()
3602
# TODO: should possibly lock the history file...
3603
benchfile = open(".perf_history", "at", buffering=1)
3604
self.add_cleanup(benchfile.close)
3606
test_suite_factory = None
3624
3608
selftest_kwargs = {"verbose": verbose,
3625
3609
"pattern": pattern,
3626
3610
"stop_on_failure": one,
3628
3612
"test_suite_factory": test_suite_factory,
3629
3613
"lsprof_timed": lsprof_timed,
3630
3614
"lsprof_tests": lsprof_tests,
3615
"bench_history": benchfile,
3631
3616
"matching_tests_first": first,
3632
3617
"list_only": list_only,
3633
3618
"random_seed": randomize,
3683
3668
branch1 = Branch.open_containing(branch)[0]
3684
3669
branch2 = Branch.open_containing(other)[0]
3685
self.add_cleanup(branch1.lock_read().unlock)
3686
self.add_cleanup(branch2.lock_read().unlock)
3671
self.add_cleanup(branch1.unlock)
3673
self.add_cleanup(branch2.unlock)
3687
3674
last1 = ensure_null(branch1.last_revision())
3688
3675
last2 = ensure_null(branch2.last_revision())
3783
3770
' completely merged into the source, pull from the'
3784
3771
' source rather than merging. When this happens,'
3785
3772
' you do not need to commit the result.'),
3786
custom_help('directory',
3787
3774
help='Branch to merge into, '
3788
'rather than the one containing the working directory.'),
3775
'rather than the one containing the working directory.',
3789
3779
Option('preview', help='Instead of merging, show a diff of the'
3791
3781
Option('interactive', help='Select changes interactively.',
3824
3814
unversioned_filter=tree.is_ignored, view_info=view_info)
3825
3815
pb = ui.ui_factory.nested_progress_bar()
3826
3816
self.add_cleanup(pb.finished)
3827
self.add_cleanup(tree.lock_write().unlock)
3818
self.add_cleanup(tree.unlock)
3828
3819
if location is not None:
3830
3821
mergeable = bundle.read_mergeable_from_url(location,
3891
3882
def _do_preview(self, merger):
3892
3883
from bzrlib.diff import show_diff_trees
3893
3884
result_tree = self._get_preview(merger)
3894
path_encoding = osutils.get_diff_header_encoding()
3895
3885
show_diff_trees(merger.this_tree, result_tree, self.outf,
3896
old_label='', new_label='',
3897
path_encoding=path_encoding)
3886
old_label='', new_label='')
3899
3888
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3900
3889
merger.change_reporter = change_reporter
4088
4077
if merge_type is None:
4089
4078
merge_type = _mod_merge.Merge3Merger
4090
4079
tree, file_list = tree_files(file_list)
4091
self.add_cleanup(tree.lock_write().unlock)
4081
self.add_cleanup(tree.unlock)
4092
4082
parents = tree.get_parent_ids()
4093
4083
if len(parents) != 2:
4094
4084
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4204
4194
def run(self, revision=None, no_backup=False, file_list=None,
4205
4195
forget_merges=None):
4206
4196
tree, file_list = tree_files(file_list)
4207
self.add_cleanup(tree.lock_tree_write().unlock)
4197
tree.lock_tree_write()
4198
self.add_cleanup(tree.unlock)
4208
4199
if forget_merges:
4209
4200
tree.set_parent_ids(tree.get_parent_ids()[:1])
4327
4317
theirs_only=False,
4328
4318
log_format=None, long=False, short=False, line=False,
4329
4319
show_ids=False, verbose=False, this=False, other=False,
4330
include_merges=False, revision=None, my_revision=None,
4320
include_merges=False, revision=None, my_revision=None):
4332
4321
from bzrlib.missing import find_unmerged, iter_log_revisions
4333
4322
def message(s):
4334
4323
if not is_quiet():
4365
4355
if remote_branch.base == local_branch.base:
4366
4356
remote_branch = local_branch
4368
self.add_cleanup(remote_branch.lock_read().unlock)
4358
remote_branch.lock_read()
4359
self.add_cleanup(remote_branch.unlock)
4370
4361
local_revid_range = _revision_range_to_revid_range(
4371
4362
_get_revision_range(my_revision, local_branch,
4426
4417
message("Branches are up to date.\n")
4427
4418
self.cleanup_now()
4428
4419
if not status_code and parent is None and other_branch is not None:
4429
self.add_cleanup(local_branch.lock_write().unlock)
4420
local_branch.lock_write()
4421
self.add_cleanup(local_branch.unlock)
4430
4422
# handle race conditions - a parent might be set while we run.
4431
4423
if local_branch.get_parent() is None:
4432
4424
local_branch.set_parent(remote_branch.base)
4562
4555
Option('long', help='Show commit date in annotations.'),
4567
4559
encoding_type = 'exact'
4569
4561
@display_command
4570
4562
def run(self, filename, all=False, long=False, revision=None,
4571
show_ids=False, directory=None):
4572
4564
from bzrlib.annotate import annotate_file, annotate_file_tree
4573
4565
wt, branch, relpath = \
4574
_open_directory_or_containing_tree_or_branch(filename, directory)
4566
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
4575
4567
if wt is not None:
4576
self.add_cleanup(wt.lock_read().unlock)
4569
self.add_cleanup(wt.unlock)
4578
self.add_cleanup(branch.lock_read().unlock)
4572
self.add_cleanup(branch.unlock)
4579
4573
tree = _get_one_revision_tree('annotate', revision, branch=branch)
4580
self.add_cleanup(tree.lock_read().unlock)
4575
self.add_cleanup(tree.unlock)
4581
4576
if wt is not None:
4582
4577
file_id = wt.path2id(relpath)
4602
4597
hidden = True # is this right ?
4603
4598
takes_args = ['revision_id*']
4604
takes_options = ['directory', 'revision']
4599
takes_options = ['revision']
4606
def run(self, revision_id_list=None, revision=None, directory=u'.'):
4601
def run(self, revision_id_list=None, revision=None):
4607
4602
if revision_id_list is not None and revision is not None:
4608
4603
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
4609
4604
if revision_id_list is None and revision is None:
4610
4605
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)
4606
b = WorkingTree.open_containing(u'.')[0].branch
4608
self.add_cleanup(b.unlock)
4613
4609
return self._run(b, revision_id_list, revision)
4615
4611
def _run(self, b, revision_id_list, revision):
4675
4670
_see_also = ['checkouts', 'unbind']
4676
4671
takes_args = ['location?']
4677
takes_options = ['directory']
4679
def run(self, location=None, directory=u'.'):
4680
b, relpath = Branch.open_containing(directory)
4674
def run(self, location=None):
4675
b, relpath = Branch.open_containing(u'.')
4681
4676
if location is None:
4683
4678
location = b.get_old_bound_location()
4711
4706
_see_also = ['checkouts', 'bind']
4712
4707
takes_args = []
4713
takes_options = ['directory']
4715
def run(self, directory=u'.'):
4716
b, relpath = Branch.open_containing(directory)
4711
b, relpath = Branch.open_containing(u'.')
4717
4712
if not b.unbind():
4718
4713
raise errors.BzrCommandError('Local branch is not bound')
4765
4760
b = control.open_branch()
4767
4762
if tree is not None:
4768
self.add_cleanup(tree.lock_write().unlock)
4764
self.add_cleanup(tree.unlock)
4770
self.add_cleanup(b.lock_write().unlock)
4767
self.add_cleanup(b.unlock)
4771
4768
return self._run(b, tree, dry_run, verbose, revision, force, local=local)
4773
4770
def _run(self, b, tree, dry_run, verbose, revision, force, local=False):
4881
4878
'result in a dynamically allocated port. The default port '
4882
4879
'depends on the protocol.',
4884
custom_help('directory',
4885
help='Serve contents of this directory.'),
4882
help='Serve contents of this directory.',
4886
4884
Option('allow-writes',
4887
4885
help='By default the server is a readonly server. Supplying '
4888
4886
'--allow-writes enables write access to the contents of '
4916
4914
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4917
4915
protocol=None):
4918
from bzrlib import transport
4916
from bzrlib.transport import get_transport, transport_server_registry
4919
4917
if directory is None:
4920
4918
directory = os.getcwd()
4921
4919
if protocol is None:
4922
protocol = transport.transport_server_registry.get()
4920
protocol = transport_server_registry.get()
4923
4921
host, port = self.get_host_and_port(port)
4924
4922
url = urlutils.local_path_to_url(directory)
4925
4923
if not allow_writes:
4926
4924
url = 'readonly+' + url
4927
t = transport.get_transport(url)
4928
protocol(t, host, port, inet)
4925
transport = get_transport(url)
4926
protocol(transport, host, port, inet)
4931
4929
class cmd_join(Command):
5043
5040
encoding_type = 'exact'
5045
5042
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5046
sign=False, revision=None, mail_to=None, message=None,
5043
sign=False, revision=None, mail_to=None, message=None):
5048
5044
from bzrlib.revision import ensure_null, NULL_REVISION
5049
5045
include_patch, include_bundle = {
5050
5046
'plain': (False, False),
5051
5047
'diff': (True, False),
5052
5048
'bundle': (True, True),
5054
branch = Branch.open(directory)
5050
branch = Branch.open('.')
5055
5051
stored_submit_branch = branch.get_submit_branch()
5056
5052
if submit_branch is None:
5057
5053
submit_branch = stored_submit_branch
5142
5138
given, in which case it is sent to a file.
5144
5140
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.
5141
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5146
5142
If the preferred client can't be found (or used), your editor will be used.
5148
5144
To use a specific mail program, set the mail_client configuration option.
5369
5369
_see_also = ['tag']
5370
5370
takes_options = [
5371
custom_help('directory',
5372
help='Branch whose tags should be displayed.'),
5372
help='Branch whose tags should be displayed.',
5373
5376
RegistryOption.from_kwargs('sort',
5374
5377
'Sort tags by different criteria.', title='Sorting',
5375
5378
alpha='Sort tags lexicographically (default).',
5547
5551
takes_args = ['to_location?']
5548
takes_options = ['directory',
5552
takes_options = [Option('force',
5550
5553
help='Switch even if local commits will be lost.'),
5552
5555
Option('create-branch', short_name='b',
5557
5560
def run(self, to_location=None, force=False, create_branch=False,
5558
revision=None, directory=u'.'):
5559
5562
from bzrlib import switch
5560
tree_location = directory
5561
5564
revision = _get_one_revision('switch', revision)
5562
5565
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5563
5566
if to_location is None:
5564
5567
if revision is None:
5565
5568
raise errors.BzrCommandError('You must supply either a'
5566
5569
' revision or a location')
5567
to_location = tree_location
5569
5572
branch = control_dir.open_branch()
5570
5573
had_explicit_nick = branch.get_config().has_explicit_nickname()
5860
5862
_see_also = ['unshelve']
5862
5864
def run(self, revision=None, all=False, file_list=None, message=None,
5863
writer=None, list=False, destroy=False, directory=u'.'):
5865
writer=None, list=False, destroy=False):
5865
5867
return self.run_for_list()
5866
5868
from bzrlib.shelf_ui import Shelver
5868
5870
writer = bzrlib.option.diff_writer_registry.get()
5870
5872
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5871
file_list, message, destroy=destroy, directory=directory)
5873
file_list, message, destroy=destroy)
5917
5919
_see_also = ['shelve']
5919
def run(self, shelf_id=None, action='apply', directory=u'.'):
5921
def run(self, shelf_id=None, action='apply'):
5920
5922
from bzrlib.shelf_ui import Unshelver
5921
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
5923
unshelver = Unshelver.from_args(shelf_id, action)
5923
5925
unshelver.run()
5941
5943
To check what clean-tree will do, use --dry-run.
5943
takes_options = ['directory',
5944
Option('ignored', help='Delete all ignored files.'),
5945
takes_options = [Option('ignored', help='Delete all ignored files.'),
5945
5946
Option('detritus', help='Delete conflict files, merge'
5946
5947
' backups, and failed selftest dirs.'),
5947
5948
Option('unknown',
5950
5951
' deleting them.'),
5951
5952
Option('force', help='Do not prompt before deleting.')]
5952
5953
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
5953
force=False, directory=u'.'):
5954
5955
from bzrlib.clean_tree import clean_tree
5955
5956
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)
5960
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5961
dry_run=dry_run, no_prompt=force)
5963
5964
class cmd_reference(Command):