762
359
class cmd_mv(Command):
763
360
"""Move or rename a file.
766
363
bzr mv OLDNAME NEWNAME
768
364
bzr mv SOURCE... DESTINATION
770
366
If the last argument is a versioned directory, all the other names
771
367
are moved into it. Otherwise, there must be exactly two arguments
772
and the file is changed to a new name.
774
If OLDNAME does not exist on the filesystem but is versioned and
775
NEWNAME does exist on the filesystem but is not versioned, mv
776
assumes that the file has been manually moved and only updates
777
its internal inventory to reflect that change.
778
The same is valid when moving many SOURCE files to a DESTINATION.
368
and the file is changed to a new name, which must not already exist.
780
370
Files cannot be moved between branches.
783
373
takes_args = ['names*']
784
takes_options = [Option("after", help="Move only the bzr identifier"
785
" of the file, because the file has already been moved."),
786
Option('auto', help='Automatically guess renames.'),
787
Option('dry-run', help='Avoid making changes when guessing renames.'),
789
374
aliases = ['move', 'rename']
790
375
encoding_type = 'replace'
792
def run(self, names_list, after=False, auto=False, dry_run=False):
794
return self.run_auto(names_list, after, dry_run)
796
raise errors.BzrCommandError('--dry-run requires --auto.')
377
def run(self, names_list):
797
378
if names_list is None:
799
381
if len(names_list) < 2:
800
raise errors.BzrCommandError("missing file argument")
801
tree, rel_names = tree_files(names_list, canonicalize=False)
802
tree.lock_tree_write()
803
self.add_cleanup(tree.unlock)
804
self._run(tree, names_list, rel_names, after)
806
def run_auto(self, names_list, after, dry_run):
807
if names_list is not None and len(names_list) > 1:
808
raise errors.BzrCommandError('Only one path may be specified to'
811
raise errors.BzrCommandError('--after cannot be specified with'
813
work_tree, file_list = tree_files(names_list, default_branch='.')
814
work_tree.lock_tree_write()
815
self.add_cleanup(work_tree.unlock)
816
rename_map.RenameMap.guess_renames(work_tree, dry_run)
818
def _run(self, tree, names_list, rel_names, after):
819
into_existing = osutils.isdir(names_list[-1])
820
if into_existing and len(names_list) == 2:
822
# a. case-insensitive filesystem and change case of dir
823
# b. move directory after the fact (if the source used to be
824
# a directory, but now doesn't exist in the working tree
825
# and the target is an existing directory, just rename it)
826
if (not tree.case_sensitive
827
and rel_names[0].lower() == rel_names[1].lower()):
828
into_existing = False
831
# 'fix' the case of a potential 'from'
832
from_id = tree.path2id(
833
tree.get_canonical_inventory_path(rel_names[0]))
834
if (not osutils.lexists(names_list[0]) and
835
from_id and inv.get_file_kind(from_id) == "directory"):
836
into_existing = False
382
raise BzrCommandError("missing file argument")
383
tree, rel_names = tree_files(names_list)
385
if os.path.isdir(names_list[-1]):
839
386
# move into existing directory
840
# All entries reference existing inventory items, so fix them up
841
# for cicp file-systems.
842
rel_names = tree.get_canonical_inventory_paths(rel_names)
843
for src, dest in tree.move(rel_names[:-1], rel_names[-1], after=after):
845
self.outf.write("%s => %s\n" % (src, dest))
387
for pair in tree.move(rel_names[:-1], rel_names[-1]):
388
self.outf.write("%s => %s\n" % pair)
847
390
if len(names_list) != 2:
848
raise errors.BzrCommandError('to mv multiple files the'
849
' destination must be a versioned'
852
# for cicp file-systems: the src references an existing inventory
854
src = tree.get_canonical_inventory_path(rel_names[0])
855
# Find the canonical version of the destination: In all cases, the
856
# parent of the target must be in the inventory, so we fetch the
857
# canonical version from there (we do not always *use* the
858
# canonicalized tail portion - we may be attempting to rename the
860
canon_dest = tree.get_canonical_inventory_path(rel_names[1])
861
dest_parent = osutils.dirname(canon_dest)
862
spec_tail = osutils.basename(rel_names[1])
863
# For a CICP file-system, we need to avoid creating 2 inventory
864
# entries that differ only by case. So regardless of the case
865
# we *want* to use (ie, specified by the user or the file-system),
866
# we must always choose to use the case of any existing inventory
867
# items. The only exception to this is when we are attempting a
868
# case-only rename (ie, canonical versions of src and dest are
870
dest_id = tree.path2id(canon_dest)
871
if dest_id is None or tree.path2id(src) == dest_id:
872
# No existing item we care about, so work out what case we
873
# are actually going to use.
875
# If 'after' is specified, the tail must refer to a file on disk.
877
dest_parent_fq = osutils.pathjoin(tree.basedir, dest_parent)
879
# pathjoin with an empty tail adds a slash, which breaks
881
dest_parent_fq = tree.basedir
883
dest_tail = osutils.canonical_relpath(
885
osutils.pathjoin(dest_parent_fq, spec_tail))
887
# not 'after', so case as specified is used
888
dest_tail = spec_tail
890
# Use the existing item so 'mv' fails with AlreadyVersioned.
891
dest_tail = os.path.basename(canon_dest)
892
dest = osutils.pathjoin(dest_parent, dest_tail)
893
mutter("attempting to move %s => %s", src, dest)
894
tree.rename_one(src, dest, after=after)
896
self.outf.write("%s => %s\n" % (src, dest))
391
raise BzrCommandError('to mv multiple files the destination '
392
'must be a versioned directory')
393
tree.rename_one(rel_names[0], rel_names[1])
394
self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1]))
899
397
class cmd_pull(Command):
900
398
"""Turn this branch into a mirror of another branch.
902
By default, this command only works on branches that have not diverged.
903
Branches are considered diverged if the destination branch's most recent
904
commit is one that has not been merged (directly or indirectly) into the
400
This command only works on branches that have not diverged. Branches are
401
considered diverged if the destination branch's most recent commit is one
402
that has not been merged (directly or indirectly) into the parent.
907
404
If branches have diverged, you can use 'bzr merge' to integrate the changes
908
405
from one into the other. Once one branch has merged, the other should
909
406
be able to pull it again.
911
If you want to replace your local changes and just want your branch to
912
match the remote one, use pull --overwrite. This will work even if the two
913
branches have diverged.
408
If you want to forget your local changes and just update your branch to
409
match the remote one, use pull --overwrite.
915
411
If there is no default location set, the first pull will set it. After
916
412
that, you can omit the location to use the default. To change the
917
413
default, use --remember. The value will only be saved if the remote
918
414
location can be accessed.
920
Note: The location can be specified either in the form of a branch,
921
or in the form of a path to a file containing a merge directive generated
925
_see_also = ['push', 'update', 'status-flags', 'send']
926
takes_options = ['remember', 'overwrite', 'revision',
927
custom_help('verbose',
928
help='Show logs of pulled revisions.'),
930
help='Branch to pull into, '
931
'rather than the one containing the working directory.',
936
help="Perform a local pull in a bound "
937
"branch. Local pulls are not applied to "
417
takes_options = ['remember', 'overwrite', 'revision', 'verbose']
941
418
takes_args = ['location?']
942
419
encoding_type = 'replace'
944
def run(self, location=None, remember=False, overwrite=False,
945
revision=None, verbose=False,
946
directory=None, local=False):
421
def run(self, location=None, remember=False, overwrite=False, revision=None, verbose=False):
947
422
# FIXME: too much stuff is in the command class
950
if directory is None:
953
tree_to = WorkingTree.open_containing(directory)[0]
424
tree_to = WorkingTree.open_containing(u'.')[0]
954
425
branch_to = tree_to.branch
955
except errors.NoWorkingTree:
426
except NoWorkingTree:
957
branch_to = Branch.open_containing(directory)[0]
959
if local and not branch_to.get_bound_location():
960
raise errors.LocalRequiresBoundBranch()
428
branch_to = Branch.open_containing(u'.')[0]
962
possible_transports = []
963
431
if location is not None:
965
mergeable = bundle.read_mergeable_from_url(location,
966
possible_transports=possible_transports)
967
except errors.NotABundle:
433
reader = bundle.read_bundle_from_url(location)
435
pass # Continue on considering this url a Branch
970
437
stored_loc = branch_to.get_parent()
971
438
if location is None:
972
439
if stored_loc is None:
973
raise errors.BzrCommandError("No pull location known or"
440
raise BzrCommandError("No pull location known or specified.")
976
442
display_url = urlutils.unescape_for_display(stored_loc,
977
443
self.outf.encoding)
979
self.outf.write("Using saved parent location: %s\n" % display_url)
444
self.outf.write("Using saved location: %s\n" % display_url)
980
445
location = stored_loc
982
revision = _get_one_revision('pull', revision)
983
if mergeable is not None:
984
if revision is not None:
985
raise errors.BzrCommandError(
986
'Cannot use -r with merge directives or bundles')
987
mergeable.install_revisions(branch_to.repository)
988
base_revision_id, revision_id, verified = \
989
mergeable.get_merge_request(branch_to.repository)
448
if reader is not None:
449
install_bundle(branch_to.repository, reader)
990
450
branch_from = branch_to
992
branch_from = Branch.open(location,
993
possible_transports=possible_transports)
452
branch_from = Branch.open(location)
995
454
if branch_to.get_parent() is None or remember:
996
455
branch_to.set_parent(branch_from.base)
998
if branch_from is not branch_to:
999
branch_from.lock_read()
1000
self.add_cleanup(branch_from.unlock)
1001
if revision is not None:
1002
revision_id = revision.as_revision_id(branch_from)
459
if reader is not None:
460
rev_id = reader.target
461
elif len(revision) == 1:
462
rev_id = revision[0].in_history(branch_from).rev_id
464
raise BzrCommandError('bzr pull --revision takes one value.')
1004
branch_to.lock_write()
1005
self.add_cleanup(branch_to.unlock)
466
old_rh = branch_to.revision_history()
1006
467
if tree_to is not None:
1007
view_info = _get_view_info_for_change_reporter(tree_to)
1008
change_reporter = delta._ChangeReporter(
1009
unversioned_filter=tree_to.is_ignored,
1010
view_info=view_info)
1011
result = tree_to.pull(
1012
branch_from, overwrite, revision_id, change_reporter,
1013
possible_transports=possible_transports, local=local)
468
count = tree_to.pull(branch_from, overwrite, rev_id)
1015
result = branch_to.pull(
1016
branch_from, overwrite, revision_id, local=local)
470
count = branch_to.pull(branch_from, overwrite, rev_id)
471
note('%d revision(s) pulled.' % (count,))
1018
result.report(self.outf)
1019
if verbose and result.old_revid != result.new_revid:
1020
log.show_branch_change(
1021
branch_to, self.outf, result.old_revno,
474
new_rh = branch_to.revision_history()
477
from bzrlib.log import show_changed_revisions
478
show_changed_revisions(branch_to, old_rh, new_rh,
1025
482
class cmd_push(Command):
1026
483
"""Update a mirror of this branch.
1028
485
The target branch will not have its working tree populated because this
1029
486
is both expensive, and is not supported on remote file systems.
1031
488
Some smart servers or protocols *may* put the working tree in place in
1048
505
location can be accessed.
1051
_see_also = ['pull', 'update', 'working-trees']
1052
takes_options = ['remember', 'overwrite', 'verbose', 'revision',
1053
Option('create-prefix',
1054
help='Create the path leading up to the branch '
1055
'if it does not already exist.'),
1057
help='Branch to push from, '
1058
'rather than the one containing the working directory.',
1062
Option('use-existing-dir',
1063
help='By default push will fail if the target'
1064
' directory exists, but does not already'
1065
' have a control directory. This flag will'
1066
' allow push to proceed.'),
1068
help='Create a stacked branch that references the public location '
1069
'of the parent branch.'),
1070
Option('stacked-on',
1071
help='Create a stacked branch that refers to another branch '
1072
'for the commit history. Only the work not present in the '
1073
'referenced branch is included in the branch created.',
1076
help='Refuse to push if there are uncommitted changes in'
1077
' the working tree, --no-strict disables the check.'),
508
takes_options = ['remember', 'overwrite', 'verbose',
509
Option('create-prefix',
510
help='Create the path leading up to the branch '
511
'if it does not already exist')]
1079
512
takes_args = ['location?']
1080
513
encoding_type = 'replace'
1082
515
def run(self, location=None, remember=False, overwrite=False,
1083
create_prefix=False, verbose=False, revision=None,
1084
use_existing_dir=False, directory=None, stacked_on=None,
1085
stacked=False, strict=None):
1086
from bzrlib.push import _show_push_branch
1088
if directory is None:
1090
# Get the source branch
1092
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1094
strict = br_from.get_config().get_user_option_as_bool('push_strict')
1095
if strict is None: strict = True # default value
1096
# Get the tip's revision_id
1097
revision = _get_one_revision('push', revision)
1098
if revision is not None:
1099
revision_id = revision.in_history(br_from).rev_id
1102
if strict and tree is not None and revision_id is None:
1103
if (tree.has_changes()):
1104
raise errors.UncommittedChanges(
1105
tree, more='Use --no-strict to force the push.')
1106
if tree.last_revision() != tree.branch.last_revision():
1107
# The tree has lost sync with its branch, there is little
1108
# chance that the user is aware of it but he can still force
1109
# the push with --no-strict
1110
raise errors.OutOfDateTree(
1111
tree, more='Use --no-strict to force the push.')
1113
# Get the stacked_on branch, if any
1114
if stacked_on is not None:
1115
stacked_on = urlutils.normalize_url(stacked_on)
1117
parent_url = br_from.get_parent()
1119
parent = Branch.open(parent_url)
1120
stacked_on = parent.get_public_branch()
1122
# I considered excluding non-http url's here, thus forcing
1123
# 'public' branches only, but that only works for some
1124
# users, so it's best to just depend on the user spotting an
1125
# error by the feedback given to them. RBC 20080227.
1126
stacked_on = parent_url
1128
raise errors.BzrCommandError(
1129
"Could not determine branch to refer to.")
1131
# Get the destination location
516
create_prefix=False, verbose=False):
517
# FIXME: Way too big! Put this into a function called from the
519
from bzrlib.transport import get_transport
521
br_from = Branch.open_containing('.')[0]
522
stored_loc = br_from.get_push_location()
1132
523
if location is None:
1133
stored_loc = br_from.get_push_location()
1134
524
if stored_loc is None:
1135
raise errors.BzrCommandError(
1136
"No push location known or specified.")
525
raise BzrCommandError("No push location known or specified.")
1138
527
display_url = urlutils.unescape_for_display(stored_loc,
1139
528
self.outf.encoding)
1140
self.outf.write("Using saved push location: %s\n" % display_url)
529
self.outf.write("Using saved location: %s\n" % display_url)
1141
530
location = stored_loc
1143
_show_push_branch(br_from, revision_id, location, self.outf,
1144
verbose=verbose, overwrite=overwrite, remember=remember,
1145
stacked_on=stacked_on, create_prefix=create_prefix,
1146
use_existing_dir=use_existing_dir)
532
transport = get_transport(location)
533
location_url = transport.base
537
dir_to = bzrdir.BzrDir.open(location_url)
538
br_to = dir_to.open_branch()
539
except NotBranchError:
541
transport = transport.clone('..')
542
if not create_prefix:
544
relurl = transport.relpath(location_url)
545
mutter('creating directory %s => %s', location_url, relurl)
546
transport.mkdir(relurl)
548
raise BzrCommandError("Parent directory of %s "
549
"does not exist." % location)
551
current = transport.base
552
needed = [(transport, transport.relpath(location_url))]
555
transport, relpath = needed[-1]
556
transport.mkdir(relpath)
559
new_transport = transport.clone('..')
560
needed.append((new_transport,
561
new_transport.relpath(transport.base)))
562
if new_transport.base == transport.base:
563
raise BzrCommandError("Could not create "
565
dir_to = br_from.bzrdir.clone(location_url,
566
revision_id=br_from.last_revision())
567
br_to = dir_to.open_branch()
568
count = len(br_to.revision_history())
569
# We successfully created the target, remember it
570
if br_from.get_push_location() is None or remember:
571
br_from.set_push_location(br_to.base)
573
# We were able to connect to the remote location, so remember it
574
# we don't need to successfully push because of possible divergence.
575
if br_from.get_push_location() is None or remember:
576
br_from.set_push_location(br_to.base)
577
old_rh = br_to.revision_history()
580
tree_to = dir_to.open_workingtree()
581
except errors.NotLocalUrl:
582
warning('This transport does not update the working '
583
'tree of: %s' % (br_to.base,))
584
count = br_to.pull(br_from, overwrite)
585
except NoWorkingTree:
586
count = br_to.pull(br_from, overwrite)
588
count = tree_to.pull(br_from, overwrite)
589
except DivergedBranches:
590
raise BzrCommandError("These branches have diverged."
591
" Try a merge then push with overwrite.")
592
note('%d revision(s) pushed.' % (count,))
595
new_rh = br_to.revision_history()
598
from bzrlib.log import show_changed_revisions
599
show_changed_revisions(br_to, old_rh, new_rh,
1149
603
class cmd_branch(Command):
1150
"""Create a new branch that is a copy of an existing branch.
604
"""Create a new copy of a branch.
1152
606
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
1153
607
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1154
If the FROM_LOCATION has no / or path separator embedded, the TO_LOCATION
1155
is derived from the FROM_LOCATION by stripping a leading scheme or drive
1156
identifier, if any. For example, "branch lp:foo-bar" will attempt to
1159
609
To retrieve the branch as of a particular revision, supply the --revision
1160
610
parameter, as in "branch foo/bar -r 5".
612
--basis is to speed up branching from remote branches. When specified, it
613
copies all the file-contents, inventory and revision data from the basis
614
branch before copying anything from the remote branch.
1163
_see_also = ['checkout']
1164
616
takes_args = ['from_location', 'to_location?']
1165
takes_options = ['revision', Option('hardlink',
1166
help='Hard-link working tree files where possible.'),
1168
help="Create a branch without a working-tree."),
1170
help="Switch the checkout in the current directory "
1171
"to the new branch."),
1173
help='Create a stacked branch referring to the source branch. '
1174
'The new branch will depend on the availability of the source '
1175
'branch for all operations.'),
1176
Option('standalone',
1177
help='Do not use a shared repository, even if available.'),
1178
Option('use-existing-dir',
1179
help='By default branch will fail if the target'
1180
' directory exists, but does not already'
1181
' have a control directory. This flag will'
1182
' allow branch to proceed.'),
1184
help="Bind new branch to from location."),
617
takes_options = ['revision', 'basis']
1186
618
aliases = ['get', 'clone']
1188
def run(self, from_location, to_location=None, revision=None,
1189
hardlink=False, stacked=False, standalone=False, no_tree=False,
1190
use_existing_dir=False, switch=False, bind=False):
1191
from bzrlib import switch as _mod_switch
1192
from bzrlib.tag import _merge_tags_if_possible
1193
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1195
revision = _get_one_revision('branch', revision)
620
def run(self, from_location, to_location=None, revision=None, basis=None):
621
from bzrlib.transport import get_transport
624
elif len(revision) > 1:
625
raise BzrCommandError(
626
'bzr branch --revision takes exactly 1 revision value')
628
br_from = Branch.open(from_location)
630
if e.errno == errno.ENOENT:
631
raise BzrCommandError('Source location "%s" does not'
632
' exist.' % to_location)
1196
635
br_from.lock_read()
1197
self.add_cleanup(br_from.unlock)
1198
if revision is not None:
1199
revision_id = revision.as_revision_id(br_from)
1201
# FIXME - wt.last_revision, fallback to branch, fall back to
1202
# None or perhaps NULL_REVISION to mean copy nothing
1204
revision_id = br_from.last_revision()
1205
if to_location is None:
1206
to_location = urlutils.derive_to_location(from_location)
1207
to_transport = transport.get_transport(to_location)
1209
to_transport.mkdir('.')
1210
except errors.FileExists:
1211
if not use_existing_dir:
1212
raise errors.BzrCommandError('Target directory "%s" '
1213
'already exists.' % to_location)
1216
bzrdir.BzrDir.open_from_transport(to_transport)
1217
except errors.NotBranchError:
1220
raise errors.AlreadyBranchError(to_location)
1221
except errors.NoSuchFile:
1222
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1225
# preserve whatever source format we have.
1226
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1227
possible_transports=[to_transport],
1228
accelerator_tree=accelerator_tree,
1229
hardlink=hardlink, stacked=stacked,
1230
force_new_repo=standalone,
1231
create_tree_if_local=not no_tree,
1232
source_branch=br_from)
1233
branch = dir.open_branch()
1234
except errors.NoSuchRevision:
1235
to_transport.delete_tree('.')
1236
msg = "The branch %s has no revision %s." % (from_location,
1238
raise errors.BzrCommandError(msg)
1239
_merge_tags_if_possible(br_from, branch)
1240
# If the source branch is stacked, the new branch may
1241
# be stacked whether we asked for that explicitly or not.
1242
# We therefore need a try/except here and not just 'if stacked:'
1244
note('Created new stacked branch referring to %s.' %
1245
branch.get_stacked_on_url())
1246
except (errors.NotStacked, errors.UnstackableBranchFormat,
1247
errors.UnstackableRepositoryFormat), e:
637
if basis is not None:
638
basis_dir = bzrdir.BzrDir.open_containing(basis)[0]
641
if len(revision) == 1 and revision[0] is not None:
642
revision_id = revision[0].in_history(br_from)[1]
644
# FIXME - wt.last_revision, fallback to branch, fall back to
645
# None or perhaps NULL_REVISION to mean copy nothing
647
revision_id = br_from.last_revision()
648
if to_location is None:
649
to_location = os.path.basename(from_location.rstrip("/\\"))
652
name = os.path.basename(to_location) + '\n'
654
to_transport = get_transport(to_location)
656
to_transport.mkdir('.')
657
except errors.FileExists:
658
raise BzrCommandError('Target directory "%s" already'
659
' exists.' % to_location)
660
except errors.NoSuchFile:
661
raise BzrCommandError('Parent of "%s" does not exist.' %
664
# preserve whatever source format we have.
665
dir = br_from.bzrdir.sprout(to_transport.base,
666
revision_id, basis_dir)
667
branch = dir.open_branch()
668
except errors.NoSuchRevision:
669
to_transport.delete_tree('.')
670
msg = "The branch %s has no revision %s." % (from_location, revision[0])
671
raise BzrCommandError(msg)
672
except errors.UnlistableBranch:
673
osutils.rmtree(to_location)
674
msg = "The branch %s cannot be used as a --basis" % (basis,)
675
raise BzrCommandError(msg)
677
branch.control_files.put_utf8('branch-name', name)
1248
678
note('Branched %d revision(s).' % branch.revno())
1250
# Bind to the parent
1251
parent_branch = Branch.open(from_location)
1252
branch.bind(parent_branch)
1253
note('New branch bound to %s' % from_location)
1255
# Switch to the new branch
1256
wt, _ = WorkingTree.open_containing('.')
1257
_mod_switch.switch(wt.bzrdir, branch)
1258
note('Switched to branch: %s',
1259
urlutils.unescape_for_display(branch.base, 'utf-8'))
1262
683
class cmd_checkout(Command):
1363
792
class cmd_update(Command):
1364
793
"""Update a tree to have the latest code committed to its branch.
1366
795
This will perform a merge into the working tree, and may generate
1367
conflicts. If you have any local changes, you will still
796
conflicts. If you have any local changes, you will still
1368
797
need to commit them after the update for the update to be complete.
1370
If you want to discard your local changes, you can just do a
799
If you want to discard your local changes, you can just do a
1371
800
'bzr revert' instead of 'bzr commit' after the update.
1373
If the tree's branch is bound to a master branch, it will also update
1374
the branch from the master.
1377
_see_also = ['pull', 'working-trees', 'status-flags']
1378
802
takes_args = ['dir?']
1379
takes_options = ['revision']
1382
def run(self, dir='.', revision=None):
1383
if revision is not None and len(revision) != 1:
1384
raise errors.BzrCommandError(
1385
"bzr update --revision takes exactly one revision")
804
def run(self, dir='.'):
1386
805
tree = WorkingTree.open_containing(dir)[0]
1387
branch = tree.branch
1388
possible_transports = []
1389
master = branch.get_master_branch(
1390
possible_transports=possible_transports)
1391
if master is not None:
1393
branch_location = master.base
1395
tree.lock_tree_write()
1396
branch_location = tree.branch.base
1397
self.add_cleanup(tree.unlock)
1398
# get rid of the final '/' and be ready for display
1399
branch_location = urlutils.unescape_for_display(branch_location[:-1],
1401
existing_pending_merges = tree.get_parent_ids()[1:]
1405
# may need to fetch data into a heavyweight checkout
1406
# XXX: this may take some time, maybe we should display a
1408
old_tip = branch.update(possible_transports)
1409
if revision is not None:
1410
revision_id = revision[0].as_revision_id(branch)
1412
revision_id = branch.last_revision()
1413
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1414
revno = branch.revision_id_to_revno(revision_id)
1415
note("Tree is up to date at revision %d of branch %s" %
1416
(revno, branch_location))
1418
view_info = _get_view_info_for_change_reporter(tree)
1419
change_reporter = delta._ChangeReporter(
1420
unversioned_filter=tree.is_ignored,
1421
view_info=view_info)
1423
conflicts = tree.update(
1425
possible_transports=possible_transports,
1426
revision=revision_id,
1428
except errors.NoSuchRevision, e:
1429
raise errors.BzrCommandError(
1430
"branch has no revision %s\n"
1431
"bzr update --revision only works"
1432
" for a revision in the branch history"
1434
revno = tree.branch.revision_id_to_revno(
1435
_mod_revision.ensure_null(tree.last_revision()))
1436
note('Updated to revision %d of branch %s' %
1437
(revno, branch_location))
1438
if tree.get_parent_ids()[1:] != existing_pending_merges:
1439
note('Your local commits will now show as pending merges with '
1440
"'bzr status', and can be committed with 'bzr commit'.")
808
last_rev = tree.last_revision()
809
if last_rev == tree.branch.last_revision():
810
# may be up to date, check master too.
811
master = tree.branch.get_master_branch()
812
if master is None or last_rev == master.last_revision():
813
revno = tree.branch.revision_id_to_revno(last_rev)
814
note("Tree is up to date at revision %d." % (revno,))
816
conflicts = tree.update()
817
revno = tree.branch.revision_id_to_revno(tree.last_revision())
818
note('Updated to revision %d.' % (revno,))
1447
827
class cmd_info(Command):
1448
828
"""Show information about a working tree, branch or repository.
1450
830
This command will show all known locations and formats associated to the
1451
tree, branch or repository.
1453
In verbose mode, statistical information is included with each report.
1454
To see extended statistic information, use a verbosity level of 2 or
1455
higher by specifying the verbose option multiple times, e.g. -vv.
831
tree, branch or repository. Statistical information is included with
1457
834
Branches and working trees will also report any missing revisions.
1461
Display information on the format and related locations:
1465
Display the above together with extended format information and
1466
basic statistics (like the number of files in the working tree and
1467
number of revisions in the branch and repository):
1471
Display the above together with number of committers to the branch:
1475
_see_also = ['revno', 'working-trees', 'repositories']
1476
836
takes_args = ['location?']
1477
837
takes_options = ['verbose']
1478
encoding_type = 'replace'
1480
839
@display_command
1481
840
def run(self, location=None, verbose=False):
1483
noise_level = get_verbosity_level()
1486
841
from bzrlib.info import show_bzrdir_info
1487
842
show_bzrdir_info(bzrdir.BzrDir.open_containing(location)[0],
1488
verbose=noise_level, outfile=self.outf)
1491
846
class cmd_remove(Command):
1492
"""Remove files or directories.
1494
This makes bzr stop tracking changes to the specified files. bzr will delete
1495
them if they can easily be recovered using revert. If no options or
1496
parameters are given bzr will scan for files that are being tracked by bzr
1497
but missing in your tree and stop tracking them for you.
847
"""Make a file unversioned.
849
This makes bzr stop tracking changes to a versioned file. It does
850
not delete the working copy.
852
You can specify one or more files, and/or --new. If you specify --new,
853
only 'added' files will be removed. If you specify both, then new files
854
in the specified directories will be removed. If the directories are
855
also new, they will also be removed.
1499
857
takes_args = ['file*']
1500
takes_options = ['verbose',
1501
Option('new', help='Only remove files that have never been committed.'),
1502
RegistryOption.from_kwargs('file-deletion-strategy',
1503
'The file deletion mode to be used.',
1504
title='Deletion Strategy', value_switches=True, enum_switch=False,
1505
safe='Only delete files if they can be'
1506
' safely recovered (default).',
1507
keep='Delete from bzr but leave the working copy.',
1508
force='Delete all the specified files, even if they can not be '
1509
'recovered and even if they are non-empty directories.')]
1510
aliases = ['rm', 'del']
858
takes_options = ['verbose', Option('new', help='remove newly-added files')]
1511
860
encoding_type = 'replace'
1513
def run(self, file_list, verbose=False, new=False,
1514
file_deletion_strategy='safe'):
862
def run(self, file_list, verbose=False, new=False):
1515
863
tree, file_list = tree_files(file_list)
1517
if file_list is not None:
1518
file_list = [f for f in file_list]
1521
self.add_cleanup(tree.unlock)
1522
# Heuristics should probably all move into tree.remove_smart or
1525
added = tree.changes_from(tree.basis_tree(),
1526
specific_files=file_list).added
1527
file_list = sorted([f[0] for f in added], reverse=True)
865
if file_list is None:
866
raise BzrCommandError('Specify one or more files to remove, or'
869
from bzrlib.delta import compare_trees
870
added = [compare_trees(tree.basis_tree(), tree,
871
specific_files=file_list).added]
872
file_list = sorted([f[0] for f in added[0]], reverse=True)
1528
873
if len(file_list) == 0:
1529
raise errors.BzrCommandError('No matching files.')
1530
elif file_list is None:
1531
# missing files show up in iter_changes(basis) as
1532
# versioned-with-no-kind.
1534
for change in tree.iter_changes(tree.basis_tree()):
1535
# Find paths in the working tree that have no kind:
1536
if change[1][1] is not None and change[6][1] is None:
1537
missing.append(change[1][1])
1538
file_list = sorted(missing, reverse=True)
1539
file_deletion_strategy = 'keep'
1540
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1541
keep_files=file_deletion_strategy=='keep',
1542
force=file_deletion_strategy=='force')
874
raise BzrCommandError('No matching files.')
875
tree.remove(file_list, verbose=verbose, to_file=self.outf)
1545
878
class cmd_file_id(Command):
1661
987
Use this to create an empty branch, or before importing an
1662
988
existing project.
1664
If there is a repository in a parent directory of the location, then
990
If there is a repository in a parent directory of the location, then
1665
991
the history of the branch will be stored in the repository. Otherwise
1666
init creates a standalone branch which carries its own history
1667
in the .bzr directory.
992
init creates a standalone branch which carries its own history in
1669
995
If there is already a branch at the location but it has no working tree,
1670
996
the tree can be populated with 'bzr checkout'.
1672
Recipe for importing a tree of files::
998
Recipe for importing a tree of files:
1678
bzr commit -m "imported project"
1003
bzr commit -m 'imported project'
1681
_see_also = ['init-repository', 'branch', 'checkout']
1682
1005
takes_args = ['location?']
1683
1006
takes_options = [
1684
Option('create-prefix',
1685
help='Create the path leading up to the branch '
1686
'if it does not already exist.'),
1687
RegistryOption('format',
1688
help='Specify a format for this branch. '
1689
'See "help formats".',
1690
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
1691
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1692
value_switches=True,
1693
title="Branch format",
1695
Option('append-revisions-only',
1696
help='Never change revnos or the existing log.'
1697
' Append revisions to it only.')
1699
def run(self, location=None, format=None, append_revisions_only=False,
1700
create_prefix=False):
1008
help='Specify a format for this branch. Current'
1009
' formats are: default, knit, metaweave and'
1010
' weave. Default is knit; metaweave and'
1011
' weave are deprecated',
1012
type=get_format_type),
1014
def run(self, location=None, format=None):
1701
1015
if format is None:
1702
format = bzrdir.format_registry.make_bzrdir('default')
1016
format = get_format_type('default')
1703
1017
if location is None:
1704
1018
location = u'.'
1706
to_transport = transport.get_transport(location)
1708
# The path has to exist to initialize a
1709
# branch inside of it.
1710
# Just using os.mkdir, since I don't
1711
# believe that we want to create a bunch of
1712
# locations if the user supplies an extended path
1714
to_transport.ensure_base()
1715
except errors.NoSuchFile:
1716
if not create_prefix:
1717
raise errors.BzrCommandError("Parent directory of %s"
1719
"\nYou may supply --create-prefix to create all"
1720
" leading parent directories."
1722
to_transport.create_prefix()
1725
a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
1726
except errors.NotBranchError:
1020
# The path has to exist to initialize a
1021
# branch inside of it.
1022
# Just using os.mkdir, since I don't
1023
# believe that we want to create a bunch of
1024
# locations if the user supplies an extended path
1025
if not os.path.exists(location):
1028
existing_bzrdir = bzrdir.BzrDir.open(location)
1029
except NotBranchError:
1727
1030
# really a NotBzrDir error...
1728
create_branch = bzrdir.BzrDir.create_branch_convenience
1729
branch = create_branch(to_transport.base, format=format,
1730
possible_transports=[to_transport])
1731
a_bzrdir = branch.bzrdir
1031
bzrdir.BzrDir.create_branch_convenience(location, format=format)
1733
from bzrlib.transport.local import LocalTransport
1734
if a_bzrdir.has_branch():
1735
if (isinstance(to_transport, LocalTransport)
1736
and not a_bzrdir.has_workingtree()):
1737
raise errors.BranchExistsWithoutWorkingTree(location)
1738
raise errors.AlreadyBranchError(location)
1739
branch = a_bzrdir.create_branch()
1740
a_bzrdir.create_workingtree()
1741
if append_revisions_only:
1743
branch.set_append_revisions_only(True)
1744
except errors.UpgradeRequired:
1745
raise errors.BzrCommandError('This branch format cannot be set'
1746
' to append-revisions-only. Try --default.')
1748
from bzrlib.info import describe_layout, describe_format
1750
tree = a_bzrdir.open_workingtree(recommend_upgrade=False)
1751
except (errors.NoWorkingTree, errors.NotLocalUrl):
1753
repository = branch.repository
1754
layout = describe_layout(repository, branch, tree).lower()
1755
format = describe_format(a_bzrdir, repository, branch, tree)
1756
self.outf.write("Created a %s (format: %s)\n" % (layout, format))
1757
if repository.is_shared():
1758
#XXX: maybe this can be refactored into transport.path_or_url()
1759
url = repository.bzrdir.root_transport.external_url()
1761
url = urlutils.local_path_from_url(url)
1762
except errors.InvalidURL:
1764
self.outf.write("Using shared repository: %s\n" % url)
1033
if existing_bzrdir.has_branch():
1034
if existing_bzrdir.has_workingtree():
1035
raise errors.AlreadyBranchError(location)
1037
raise errors.BranchExistsWithoutWorkingTree(location)
1039
existing_bzrdir.create_branch()
1040
existing_bzrdir.create_workingtree()
1767
1043
class cmd_init_repository(Command):
1768
"""Create a shared repository for branches to share storage space.
1770
New branches created under the repository directory will store their
1771
revisions in the repository, not in the branch directory. For branches
1772
with shared history, this reduces the amount of storage needed and
1773
speeds up the creation of new branches.
1775
If the --no-trees option is given then the branches in the repository
1776
will not have working trees by default. They will still exist as
1777
directories on disk, but they will not have separate copies of the
1778
files at a certain revision. This can be useful for repositories that
1779
store branches which are interacted with through checkouts or remote
1780
branches, such as on a server.
1783
Create a shared repository holding just branches::
1785
bzr init-repo --no-trees repo
1788
Make a lightweight checkout elsewhere::
1790
bzr checkout --lightweight repo/trunk trunk-checkout
1044
"""Create a shared repository to hold branches.
1046
New branches created under the repository directory will store their revisions
1047
in the repository, not in the branch directory, if the branch format supports
1053
bzr checkout --lightweight repo/trunk trunk-checkout
1795
_see_also = ['init', 'branch', 'checkout', 'repositories']
1796
takes_args = ["location"]
1797
takes_options = [RegistryOption('format',
1798
help='Specify a format for this repository. See'
1799
' "bzr help formats" for details.',
1800
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
1801
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1802
value_switches=True, title='Repository format'),
1804
help='Branches in the repository will default to'
1805
' not having a working tree.'),
1057
takes_args = ["location"]
1058
takes_options = [Option('format',
1059
help='Specify a format for this repository.'
1060
' Current formats are: default, knit,'
1061
' metaweave and weave. Default is knit;'
1062
' metaweave and weave are deprecated',
1063
type=get_format_type),
1065
help='Allows branches in repository to have'
1807
1067
aliases = ["init-repo"]
1809
def run(self, location, format=None, no_trees=False):
1068
def run(self, location, format=None, trees=False):
1069
from bzrlib.transport import get_transport
1810
1070
if format is None:
1811
format = bzrdir.format_registry.make_bzrdir('default')
1813
if location is None:
1816
to_transport = transport.get_transport(location)
1817
to_transport.ensure_base()
1819
newdir = format.initialize_on_transport(to_transport)
1071
format = get_format_type('default')
1072
transport = get_transport(location)
1073
if not transport.has('.'):
1075
newdir = format.initialize_on_transport(transport)
1820
1076
repo = newdir.create_repository(shared=True)
1821
repo.set_make_working_trees(not no_trees)
1823
from bzrlib.info import show_bzrdir_info
1824
show_bzrdir_info(repo.bzrdir, verbose=0, outfile=self.outf)
1077
repo.set_make_working_trees(trees)
1827
1080
class cmd_diff(Command):
1828
"""Show differences in the working tree, between revisions or branches.
1830
If no arguments are given, all changes for the current tree are listed.
1831
If files are given, only the changes in those files are listed.
1832
Remote and multiple branches can be compared by using the --old and
1833
--new options. If not provided, the default for both is derived from
1834
the first argument, if any, or the current tree if no arguments are
1081
"""Show differences in the working tree or between revisions.
1083
If files are listed, only the changes in those files are listed.
1084
Otherwise, all changes for the tree are listed.
1837
1086
"bzr diff -p1" is equivalent to "bzr diff --prefix old/:new/", and
1838
1087
produces patches suitable for "patch -p1".
1842
2 - unrepresentable changes
1847
Shows the difference in the working tree versus the last commit::
1851
Difference between the working tree and revision 1::
1855
Difference between revision 3 and revision 1::
1859
Difference between revision 3 and revision 1 for branch xxx::
1863
To see the changes introduced in revision X::
1867
Note that in the case of a merge, the -c option shows the changes
1868
compared to the left hand parent. To see the changes against
1869
another parent, use::
1871
bzr diff -r<chosen_parent>..X
1873
The changes introduced by revision 2 (equivalent to -r1..2)::
1877
Show just the differences for file NEWS::
1881
Show the differences in working tree xxx for file NEWS::
1885
Show the differences from branch xxx to this working tree:
1889
Show the differences between two branches for file NEWS::
1891
bzr diff --old xxx --new yyy NEWS
1893
Same as 'bzr diff' but prefix paths with old/ and new/::
1895
bzr diff --prefix old/:new/
1091
Shows the difference in the working tree versus the last commit
1093
Difference between the working tree and revision 1
1095
Difference between revision 2 and revision 1
1096
bzr diff --diff-prefix old/:new/
1097
Same as 'bzr diff' but prefix paths with old/ and new/
1098
bzr diff bzr.mine bzr.dev
1099
Show the differences between the two working trees
1101
Show just the differences for 'foo.c'
1897
_see_also = ['status']
1103
# TODO: Option to use external diff command; could be GNU diff, wdiff,
1104
# or a graphical diff.
1106
# TODO: Python difflib is not exactly the same as unidiff; should
1107
# either fix it up or prefer to use an external diff.
1109
# TODO: Selected-file diff is inefficient and doesn't show you
1112
# TODO: This probably handles non-Unix newlines poorly.
1898
1114
takes_args = ['file*']
1900
Option('diff-options', type=str,
1901
help='Pass these options to the external diff program.'),
1902
Option('prefix', type=str,
1904
help='Set prefixes added to old and new filenames, as '
1905
'two values separated by a colon. (eg "old/:new/").'),
1907
help='Branch/tree to compare from.',
1911
help='Branch/tree to compare to.',
1917
help='Use this command to compare files.',
1115
takes_options = ['revision', 'diff-options', 'prefix']
1921
1116
aliases = ['di', 'dif']
1922
1117
encoding_type = 'exact'
1924
1119
@display_command
1925
1120
def run(self, revision=None, file_list=None, diff_options=None,
1926
prefix=None, old=None, new=None, using=None):
1927
from bzrlib.diff import get_trees_and_branches_to_diff, show_diff_trees
1122
from bzrlib.diff import diff_cmd_helper, show_diff_trees
1929
1124
if (prefix is None) or (prefix == '0'):
1930
1125
# diff -p0 format
2057
1244
self.outf.write(tree.basedir + '\n')
2060
def _parse_limit(limitstring):
2062
return int(limitstring)
2064
msg = "The limit argument must be an integer."
2065
raise errors.BzrCommandError(msg)
2068
def _parse_levels(s):
2072
msg = "The levels argument must be an integer."
2073
raise errors.BzrCommandError(msg)
2076
1247
class cmd_log(Command):
2077
"""Show historical log for a branch or subset of a branch.
2079
log is bzr's default tool for exploring the history of a branch.
2080
The branch to use is taken from the first parameter. If no parameters
2081
are given, the branch containing the working directory is logged.
2082
Here are some simple examples::
2084
bzr log log the current branch
2085
bzr log foo.py log a file in its branch
2086
bzr log http://server/branch log a branch on a server
2088
The filtering, ordering and information shown for each revision can
2089
be controlled as explained below. By default, all revisions are
2090
shown sorted (topologically) so that newer revisions appear before
2091
older ones and descendants always appear before ancestors. If displayed,
2092
merged revisions are shown indented under the revision in which they
2097
The log format controls how information about each revision is
2098
displayed. The standard log formats are called ``long``, ``short``
2099
and ``line``. The default is long. See ``bzr help log-formats``
2100
for more details on log formats.
2102
The following options can be used to control what information is
2105
-l N display a maximum of N revisions
2106
-n N display N levels of revisions (0 for all, 1 for collapsed)
2107
-v display a status summary (delta) for each revision
2108
-p display a diff (patch) for each revision
2109
--show-ids display revision-ids (and file-ids), not just revnos
2111
Note that the default number of levels to display is a function of the
2112
log format. If the -n option is not used, the standard log formats show
2113
just the top level (mainline).
2115
Status summaries are shown using status flags like A, M, etc. To see
2116
the changes explained using words like ``added`` and ``modified``
2117
instead, use the -vv option.
2121
To display revisions from oldest to newest, use the --forward option.
2122
In most cases, using this option will have little impact on the total
2123
time taken to produce a log, though --forward does not incrementally
2124
display revisions like --reverse does when it can.
2126
:Revision filtering:
2128
The -r option can be used to specify what revision or range of revisions
2129
to filter against. The various forms are shown below::
2131
-rX display revision X
2132
-rX.. display revision X and later
2133
-r..Y display up to and including revision Y
2134
-rX..Y display from X to Y inclusive
2136
See ``bzr help revisionspec`` for details on how to specify X and Y.
2137
Some common examples are given below::
2139
-r-1 show just the tip
2140
-r-10.. show the last 10 mainline revisions
2141
-rsubmit:.. show what's new on this branch
2142
-rancestor:path.. show changes since the common ancestor of this
2143
branch and the one at location path
2144
-rdate:yesterday.. show changes since yesterday
2146
When logging a range of revisions using -rX..Y, log starts at
2147
revision Y and searches back in history through the primary
2148
("left-hand") parents until it finds X. When logging just the
2149
top level (using -n1), an error is reported if X is not found
2150
along the way. If multi-level logging is used (-n0), X may be
2151
a nested merge revision and the log will be truncated accordingly.
2155
If parameters are given and the first one is not a branch, the log
2156
will be filtered to show only those revisions that changed the
2157
nominated files or directories.
2159
Filenames are interpreted within their historical context. To log a
2160
deleted file, specify a revision range so that the file existed at
2161
the end or start of the range.
2163
Historical context is also important when interpreting pathnames of
2164
renamed files/directories. Consider the following example:
2166
* revision 1: add tutorial.txt
2167
* revision 2: modify tutorial.txt
2168
* revision 3: rename tutorial.txt to guide.txt; add tutorial.txt
2172
* ``bzr log guide.txt`` will log the file added in revision 1
2174
* ``bzr log tutorial.txt`` will log the new file added in revision 3
2176
* ``bzr log -r2 -p tutorial.txt`` will show the changes made to
2177
the original file in revision 2.
2179
* ``bzr log -r2 -p guide.txt`` will display an error message as there
2180
was no file called guide.txt in revision 2.
2182
Renames are always followed by log. By design, there is no need to
2183
explicitly ask for this (and no way to stop logging a file back
2184
until it was last renamed).
2188
The --message option can be used for finding revisions that match a
2189
regular expression in a commit message.
2193
GUI tools and IDEs are often better at exploring history than command
2194
line tools: you may prefer qlog or viz from qbzr or bzr-gtk, the
2195
bzr-explorer shell, or the Loggerhead web interface. See the Plugin
2196
Guide <http://doc.bazaar.canonical.com/plugins/en/> and
2197
<http://wiki.bazaar.canonical.com/IDEIntegration>.
2199
You may find it useful to add the aliases below to ``bazaar.conf``::
2203
top = log -l10 --line
2206
``bzr tip`` will then show the latest revision while ``bzr top``
2207
will show the last 10 mainline revisions. To see the details of a
2208
particular revision X, ``bzr show -rX``.
2210
If you are interested in looking deeper into a particular merge X,
2211
use ``bzr log -n0 -rX``.
2213
``bzr log -v`` on a branch with lots of history is currently
2214
very slow. A fix for this issue is currently under development.
2215
With or without that fix, it is recommended that a revision range
2216
be given when using the -v option.
2218
bzr has a generic full-text matching plugin, bzr-search, that can be
2219
used to find revisions matching user names, commit messages, etc.
2220
Among other features, this plugin can find all revisions containing
2221
a list of words but not others.
2223
When exploring non-mainline history on large projects with deep
2224
history, the performance of log can be greatly improved by installing
2225
the historycache plugin. This plugin buffers historical information
2226
trading disk space for faster speed.
1248
"""Show log of a branch, file, or directory.
1250
By default show the log of the branch containing the working directory.
1252
To request a range of logs, you can use the command -r begin..end
1253
-r revision requests a specific revision, -r ..end or -r begin.. are
1259
bzr log -r -10.. http://server/branch
2228
takes_args = ['file*']
2229
_see_also = ['log-formats', 'revisionspec']
2232
help='Show from oldest to newest.'),
2234
custom_help('verbose',
2235
help='Show files changed in each revision.'),
2239
type=bzrlib.option._parse_revision_str,
2241
help='Show just the specified revision.'
2242
' See also "help revisionspec".'),
2246
help='Number of levels to display - 0 for all, 1 for flat.',
2248
type=_parse_levels),
2251
help='Show revisions whose message matches this '
2252
'regular expression.',
2256
help='Limit the output to the first N revisions.',
2261
help='Show changes made in each revision as a patch.'),
2262
Option('include-merges',
2263
help='Show merged revisions like --levels 0 does.'),
1262
# TODO: Make --revision support uuid: and hash: [future tag:] notation.
1264
takes_args = ['location?']
1265
takes_options = [Option('forward',
1266
help='show from oldest to newest'),
1269
help='show files changed in each revision'),
1270
'show-ids', 'revision',
1274
help='show revisions whose message matches this regexp',
2265
1278
encoding_type = 'replace'
2267
1280
@display_command
2268
def run(self, file_list=None, timezone='original',
1281
def run(self, location=None, timezone='original',
2270
1283
show_ids=False,
2274
1286
log_format=None,
2279
include_merges=False):
2280
from bzrlib.log import (
2282
make_log_request_dict,
2283
_get_info_for_log_files,
1291
from bzrlib.log import log_formatter, show_log
1292
assert message is None or isinstance(message, basestring), \
1293
"invalid message argument %r" % message
2285
1294
direction = (forward and 'forward') or 'reverse'
2290
raise errors.BzrCommandError(
2291
'--levels and --include-merges are mutually exclusive')
2293
if change is not None:
2295
raise errors.RangeInChangeOption()
2296
if revision is not None:
2297
raise errors.BzrCommandError(
2298
'--revision and --change are mutually exclusive')
2303
filter_by_dir = False
2305
# find the file ids to log and check for directory filtering
2306
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2307
revision, file_list)
2308
self.add_cleanup(b.unlock)
2309
for relpath, file_id, kind in file_info_list:
2311
raise errors.BzrCommandError(
2312
"Path unknown at end or start of revision range: %s" %
2314
# If the relpath is the top of the tree, we log everything
2319
file_ids.append(file_id)
2320
filter_by_dir = filter_by_dir or (
2321
kind in ['directory', 'tree-reference'])
2324
# FIXME ? log the current subdir only RBC 20060203
2325
if revision is not None \
2326
and len(revision) > 0 and revision[0].get_branch():
2327
location = revision[0].get_branch()
2330
dir, relpath = bzrdir.BzrDir.open_containing(location)
2331
b = dir.open_branch()
2333
self.add_cleanup(b.unlock)
2334
rev1, rev2 = _get_revision_range(revision, b, self.name())
2336
# Decide on the type of delta & diff filtering to use
2337
# TODO: add an --all-files option to make this configurable & consistent
2345
diff_type = 'partial'
2349
# Build the log formatter
2350
if log_format is None:
2351
log_format = log.log_formatter_registry.get_default(b)
2352
# Make a non-encoding output to include the diffs - bug 328007
2353
unencoded_output = ui.ui_factory.make_output_stream(encoding_type='exact')
2354
lf = log_format(show_ids=show_ids, to_file=self.outf,
2355
to_exact_file=unencoded_output,
2356
show_timezone=timezone,
2357
delta_format=get_verbosity_level(),
2359
show_advice=levels is None)
2361
# Choose the algorithm for doing the logging. It's annoying
2362
# having multiple code paths like this but necessary until
2363
# the underlying repository format is faster at generating
2364
# deltas or can provide everything we need from the indices.
2365
# The default algorithm - match-using-deltas - works for
2366
# multiple files and directories and is faster for small
2367
# amounts of history (200 revisions say). However, it's too
2368
# slow for logging a single file in a repository with deep
2369
# history, i.e. > 10K revisions. In the spirit of "do no
2370
# evil when adding features", we continue to use the
2371
# original algorithm - per-file-graph - for the "single
2372
# file that isn't a directory without showing a delta" case.
2373
partial_history = revision and b.repository._format.supports_chks
2374
match_using_deltas = (len(file_ids) != 1 or filter_by_dir
2375
or delta_type or partial_history)
2377
# Build the LogRequest and execute it
2378
if len(file_ids) == 0:
2380
rqst = make_log_request_dict(
2381
direction=direction, specific_fileids=file_ids,
2382
start_revision=rev1, end_revision=rev2, limit=limit,
2383
message_search=message, delta_type=delta_type,
2384
diff_type=diff_type, _match_using_deltas=match_using_deltas)
2385
Logger(b, rqst).show(lf)
2388
def _get_revision_range(revisionspec_list, branch, command_name):
2389
"""Take the input of a revision option and turn it into a revision range.
2391
It returns RevisionInfo objects which can be used to obtain the rev_id's
2392
of the desired revisions. It does some user input validations.
2394
if revisionspec_list is None:
2397
elif len(revisionspec_list) == 1:
2398
rev1 = rev2 = revisionspec_list[0].in_history(branch)
2399
elif len(revisionspec_list) == 2:
2400
start_spec = revisionspec_list[0]
2401
end_spec = revisionspec_list[1]
2402
if end_spec.get_branch() != start_spec.get_branch():
2403
# b is taken from revision[0].get_branch(), and
2404
# show_log will use its revision_history. Having
2405
# different branches will lead to weird behaviors.
2406
raise errors.BzrCommandError(
2407
"bzr %s doesn't accept two revisions in different"
2408
" branches." % command_name)
2409
rev1 = start_spec.in_history(branch)
2410
# Avoid loading all of history when we know a missing
2411
# end of range means the last revision ...
2412
if end_spec.spec is None:
2413
last_revno, last_revision_id = branch.last_revision_info()
2414
rev2 = RevisionInfo(branch, last_revno, last_revision_id)
2416
rev2 = end_spec.in_history(branch)
2418
raise errors.BzrCommandError(
2419
'bzr %s --revision takes one or two values.' % command_name)
2423
def _revision_range_to_revid_range(revision_range):
2426
if revision_range[0] is not None:
2427
rev_id1 = revision_range[0].rev_id
2428
if revision_range[1] is not None:
2429
rev_id2 = revision_range[1].rev_id
2430
return rev_id1, rev_id2
1299
# find the file id to log:
1301
dir, fp = bzrdir.BzrDir.open_containing(location)
1302
b = dir.open_branch()
1306
inv = dir.open_workingtree().inventory
1307
except (errors.NotBranchError, errors.NotLocalUrl):
1308
# either no tree, or is remote.
1309
inv = b.basis_tree().inventory
1310
file_id = inv.path2id(fp)
1313
# FIXME ? log the current subdir only RBC 20060203
1314
dir, relpath = bzrdir.BzrDir.open_containing('.')
1315
b = dir.open_branch()
1317
if revision is None:
1320
elif len(revision) == 1:
1321
rev1 = rev2 = revision[0].in_history(b).revno
1322
elif len(revision) == 2:
1323
if revision[0].spec is None:
1324
# missing begin-range means first revision
1327
rev1 = revision[0].in_history(b).revno
1329
if revision[1].spec is None:
1330
# missing end-range means last known revision
1333
rev2 = revision[1].in_history(b).revno
1335
raise BzrCommandError('bzr log --revision takes one or two values.')
1337
# By this point, the revision numbers are converted to the +ve
1338
# form if they were supplied in the -ve form, so we can do
1339
# this comparison in relative safety
1341
(rev2, rev1) = (rev1, rev2)
1343
if (log_format == None):
1344
default = b.get_config().log_format()
1345
log_format = get_log_format(long=long, short=short, line=line,
1347
lf = log_formatter(log_format,
1350
show_timezone=timezone)
1356
direction=direction,
1357
start_revision=rev1,
2432
1362
def get_log_format(long=False, short=False, line=False, default='long'):
2433
1363
log_format = default
3451
1901
return FakeNFSServer
3452
1902
msg = "No known transport type %s. Supported types are: sftp\n" %\
3454
raise errors.BzrCommandError(msg)
1904
raise BzrCommandError(msg)
3457
1907
takes_args = ['testspecs*']
3458
1908
takes_options = ['verbose',
3460
help='Stop when one test fails.',
1909
Option('one', help='stop when one test fails'),
1910
Option('keep-output',
1911
help='keep output directories when tests fail'),
3464
1913
help='Use a different transport by default '
3465
1914
'throughout the test suite.',
3466
1915
type=get_transport_type),
3468
help='Run the benchmarks rather than selftests.'),
1916
Option('benchmark', help='run the bzr bencharks.'),
3469
1917
Option('lsprof-timed',
3470
help='Generate lsprof output for benchmarked'
1918
help='generate lsprof output for benchmarked'
3471
1919
' sections of code.'),
3472
Option('lsprof-tests',
3473
help='Generate lsprof output for each test.'),
3474
Option('cache-dir', type=str,
3475
help='Cache intermediate benchmark output in this '
3478
help='Run all tests, but run specified tests first.',
3482
help='List the tests instead of running them.'),
3483
RegistryOption('parallel',
3484
help="Run the test suite in parallel.",
3485
lazy_registry=('bzrlib.tests', 'parallel_registry'),
3486
value_switches=False,
3488
Option('randomize', type=str, argname="SEED",
3489
help='Randomize the order of tests using the given'
3490
' seed or "now" for the current time.'),
3491
Option('exclude', type=str, argname="PATTERN",
3493
help='Exclude tests that match this regular'
3496
help='Output test progress via subunit.'),
3497
Option('strict', help='Fail on missing dependencies or '
3499
Option('load-list', type=str, argname='TESTLISTFILE',
3500
help='Load a test id list from a text file.'),
3501
ListOption('debugflag', type=str, short_name='E',
3502
help='Turn on a selftest debug flag.'),
3503
ListOption('starting-with', type=str, argname='TESTID',
3504
param_name='starting_with', short_name='s',
3506
'Load only the tests starting with TESTID.'),
3508
encoding_type = 'replace'
3511
Command.__init__(self)
3512
self.additional_selftest_args = {}
3514
def run(self, testspecs_list=None, verbose=False, one=False,
3515
transport=None, benchmark=None,
3516
lsprof_timed=None, cache_dir=None,
3517
first=False, list_only=False,
3518
randomize=None, exclude=None, strict=False,
3519
load_list=None, debugflag=None, starting_with=None, subunit=False,
3520
parallel=None, lsprof_tests=False):
1922
def run(self, testspecs_list=None, verbose=None, one=False,
1923
keep_output=False, transport=None, benchmark=None,
3521
1926
from bzrlib.tests import selftest
3522
1927
import bzrlib.benchmarks as benchmarks
3523
from bzrlib.benchmarks import tree_creator
3525
# Make deprecation warnings visible, unless -Werror is set
3526
symbol_versioning.activate_deprecation_warnings(override=False)
3528
if cache_dir is not None:
3529
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
3530
if testspecs_list is not None:
3531
pattern = '|'.join(testspecs_list)
3536
from bzrlib.tests import SubUnitBzrRunner
3538
raise errors.BzrCommandError("subunit not available. subunit "
3539
"needs to be installed to use --subunit.")
3540
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3542
self.additional_selftest_args.setdefault(
3543
'suite_decorators', []).append(parallel)
3545
test_suite_factory = benchmarks.test_suite
3546
# Unless user explicitly asks for quiet, be verbose in benchmarks
3547
verbose = not is_quiet()
3548
# TODO: should possibly lock the history file...
3549
benchfile = open(".perf_history", "at", buffering=1)
3550
self.add_cleanup(benchfile.close)
3552
test_suite_factory = None
3554
selftest_kwargs = {"verbose": verbose,
3556
"stop_on_failure": one,
3557
"transport": transport,
3558
"test_suite_factory": test_suite_factory,
3559
"lsprof_timed": lsprof_timed,
3560
"lsprof_tests": lsprof_tests,
3561
"bench_history": benchfile,
3562
"matching_tests_first": first,
3563
"list_only": list_only,
3564
"random_seed": randomize,
3565
"exclude_pattern": exclude,
3567
"load_list": load_list,
3568
"debug_flags": debugflag,
3569
"starting_with": starting_with
3571
selftest_kwargs.update(self.additional_selftest_args)
3572
result = selftest(**selftest_kwargs)
3573
return int(not result)
1928
# we don't want progress meters from the tests to go to the
1929
# real output; and we don't want log messages cluttering up
1931
save_ui = ui.ui_factory
1932
print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
1933
print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
1935
info('running tests...')
1937
ui.ui_factory = ui.SilentUIFactory()
1938
if testspecs_list is not None:
1939
pattern = '|'.join(testspecs_list)
1943
test_suite_factory = benchmarks.test_suite
1947
test_suite_factory = None
1950
result = selftest(verbose=verbose,
1952
stop_on_failure=one,
1953
keep_output=keep_output,
1954
transport=transport,
1955
test_suite_factory=test_suite_factory,
1956
lsprof_timed=lsprof_timed)
1958
info('tests passed')
1960
info('tests failed')
1961
return int(not result)
1963
ui.ui_factory = save_ui
1966
def _get_bzr_branch():
1967
"""If bzr is run from a branch, return Branch or None"""
1968
from os.path import dirname
1971
branch = Branch.open(dirname(osutils.abspath(dirname(__file__))))
1973
except errors.BzrError:
1979
print "bzr (bazaar-ng) %s" % bzrlib.__version__
1980
# is bzrlib itself in a branch?
1981
branch = _get_bzr_branch()
1983
rh = branch.revision_history()
1985
print " bzr checkout, revision %d" % (revno,)
1986
print " nick: %s" % (branch.nick,)
1988
print " revid: %s" % (rh[-1],)
1989
print "Using python interpreter:", sys.executable
1991
print "Using python standard library:", os.path.dirname(site.__file__)
1992
print "Using bzrlib:",
1993
if len(bzrlib.__path__) > 1:
1994
# print repr, which is a good enough way of making it clear it's
1995
# more than one element (eg ['/foo/bar', '/foo/bzr'])
1996
print repr(bzrlib.__path__)
1998
print bzrlib.__path__[0]
2001
print bzrlib.__copyright__
2002
print "http://bazaar-vcs.org/"
2004
print "bzr comes with ABSOLUTELY NO WARRANTY. bzr is free software, and"
2005
print "you may use, modify and redistribute it under the terms of the GNU"
2006
print "General Public License version 2 or later."
3576
2009
class cmd_version(Command):
3577
2010
"""Show version of bzr."""
3579
encoding_type = 'replace'
3581
Option("short", help="Print just the version number."),
3584
2011
@display_command
3585
def run(self, short=False):
3586
from bzrlib.version import show_version
3588
self.outf.write(bzrlib.version_string + '\n')
3590
show_version(to_file=self.outf)
3593
2015
class cmd_rocks(Command):
3594
2016
"""Statement of optimism."""
3598
2018
@display_command
3600
print "It sure does!"
2020
print "it sure does!"
3603
2023
class cmd_find_merge_base(Command):
3604
"""Find and print a base revision for merging two branches."""
2024
"""Find and print a base revision for merging two branches.
3605
2026
# TODO: Options to specify revisions on either side, as if
3606
2027
# merging only part of the history.
3607
2028
takes_args = ['branch', 'other']
3610
2031
@display_command
3611
2032
def run(self, branch, other):
3612
from bzrlib.revision import ensure_null
2033
from bzrlib.revision import common_ancestor, MultipleRevisionSources
3614
2035
branch1 = Branch.open_containing(branch)[0]
3615
2036
branch2 = Branch.open_containing(other)[0]
3617
self.add_cleanup(branch1.unlock)
3619
self.add_cleanup(branch2.unlock)
3620
last1 = ensure_null(branch1.last_revision())
3621
last2 = ensure_null(branch2.last_revision())
3623
graph = branch1.repository.get_graph(branch2.repository)
3624
base_rev_id = graph.find_unique_lca(last1, last2)
2038
history_1 = branch1.revision_history()
2039
history_2 = branch2.revision_history()
2041
last1 = branch1.last_revision()
2042
last2 = branch2.last_revision()
2044
source = MultipleRevisionSources(branch1.repository,
2047
base_rev_id = common_ancestor(last1, last2, source)
3626
2049
print 'merge base is revision %s' % base_rev_id
3629
2052
class cmd_merge(Command):
3630
2053
"""Perform a three-way merge.
3632
The source of the merge can be specified either in the form of a branch,
3633
or in the form of a path to a file containing a merge directive generated
3634
with bzr send. If neither is specified, the default is the upstream branch
3635
or the branch most recently merged using --remember.
3637
When merging a branch, by default the tip will be merged. To pick a different
3638
revision, pass --revision. If you specify two values, the first will be used as
3639
BASE and the second one as OTHER. Merging individual revisions, or a subset of
3640
available revisions, like this is commonly referred to as "cherrypicking".
3642
Revision numbers are always relative to the branch being merged.
2055
The branch is the branch you will merge from. By default, it will merge
2056
the latest revision. If you specify a revision, that revision will be
2057
merged. If you specify two revisions, the first will be used as a BASE,
2058
and the second one as OTHER. Revision numbers are always relative to the
3644
2061
By default, bzr will try to merge in all new work from the other
3645
2062
branch, automatically determining an appropriate base. If this
3646
2063
fails, you may need to give an explicit base.
3648
2065
Merge will do its best to combine the changes in two branches, but there
3649
2066
are some kinds of problems only a human can fix. When it encounters those,
3650
2067
it will mark a conflict. A conflict means that you need to fix something,
3657
2074
default, use --remember. The value will only be saved if the remote
3658
2075
location can be accessed.
3660
The results of the merge are placed into the destination working
3661
directory, where they can be reviewed (with bzr diff), tested, and then
3662
committed to record the result of the merge.
2079
To merge the latest revision from bzr.dev
2080
bzr merge ../bzr.dev
2082
To merge changes up to and including revision 82 from bzr.dev
2083
bzr merge -r 82 ../bzr.dev
2085
To merge the changes introduced by 82, without previous changes:
2086
bzr merge -r 81..82 ../bzr.dev
3664
2088
merge refuses to run if there are any uncommitted changes, unless
3665
--force is given. The --force option can also be used to create a
3666
merge revision which has more than two parents.
3668
If one would like to merge changes from the working tree of the other
3669
branch without merging any committed revisions, the --uncommitted option
3672
To select only some changes to merge, use "merge -i", which will prompt
3673
you to apply each diff hunk and file change, similar to "shelve".
3676
To merge the latest revision from bzr.dev::
3678
bzr merge ../bzr.dev
3680
To merge changes up to and including revision 82 from bzr.dev::
3682
bzr merge -r 82 ../bzr.dev
3684
To merge the changes introduced by 82, without previous changes::
3686
bzr merge -r 81..82 ../bzr.dev
3688
To apply a merge directive contained in /tmp/merge::
3690
bzr merge /tmp/merge
3692
To create a merge revision with three parents from two branches
3693
feature1a and feature1b:
3695
bzr merge ../feature1a
3696
bzr merge ../feature1b --force
3697
bzr commit -m 'revision with three parents'
2091
The following merge types are available:
3700
encoding_type = 'exact'
3701
_see_also = ['update', 'remerge', 'status-flags', 'send']
3702
takes_args = ['location?']
3707
help='Merge even if the destination tree has uncommitted changes.'),
3711
Option('show-base', help="Show base revision text in "
3713
Option('uncommitted', help='Apply uncommitted changes'
3714
' from a working copy, instead of branch changes.'),
3715
Option('pull', help='If the destination is already'
3716
' completely merged into the source, pull from the'
3717
' source rather than merging. When this happens,'
3718
' you do not need to commit the result.'),
3720
help='Branch to merge into, '
3721
'rather than the one containing the working directory.',
3725
Option('preview', help='Instead of merging, show a diff of the'
3727
Option('interactive', help='Select changes interactively.',
3731
def run(self, location=None, revision=None, force=False,
3732
merge_type=None, show_base=False, reprocess=None, remember=False,
3733
uncommitted=False, pull=False,
2093
takes_args = ['branch?']
2094
takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
2095
Option('show-base', help="Show base revision text in "
2099
from merge import merge_type_help
2100
from inspect import getdoc
2101
return getdoc(self) + '\n' + merge_type_help()
2103
def run(self, branch=None, revision=None, force=False, merge_type=None,
2104
show_base=False, reprocess=False, remember=False):
3738
2105
if merge_type is None:
3739
merge_type = _mod_merge.Merge3Merger
3741
if directory is None: directory = u'.'
3742
possible_transports = []
3744
allow_pending = True
3745
verified = 'inapplicable'
3746
tree = WorkingTree.open_containing(directory)[0]
3749
basis_tree = tree.revision_tree(tree.last_revision())
3750
except errors.NoSuchRevision:
3751
basis_tree = tree.basis_tree()
3753
# die as quickly as possible if there are uncommitted changes
3755
if tree.has_changes():
3756
raise errors.UncommittedChanges(tree)
3758
view_info = _get_view_info_for_change_reporter(tree)
3759
change_reporter = delta._ChangeReporter(
3760
unversioned_filter=tree.is_ignored, view_info=view_info)
2106
merge_type = Merge3Merger
2108
tree = WorkingTree.open_containing(u'.')[0]
2110
if branch is not None:
2112
reader = bundle.read_bundle_from_url(branch)
2114
pass # Continue on considering this url a Branch
2116
conflicts = merge_bundle(reader, tree, not force, merge_type,
2117
reprocess, show_base)
2123
branch = self._get_remembered_parent(tree, branch, 'Merging from')
2125
if revision is None or len(revision) < 1:
2127
other = [branch, -1]
2128
other_branch, path = Branch.open_containing(branch)
2130
if len(revision) == 1:
2132
other_branch, path = Branch.open_containing(branch)
2133
revno = revision[0].in_history(other_branch).revno
2134
other = [branch, revno]
2136
assert len(revision) == 2
2137
if None in revision:
2138
raise BzrCommandError(
2139
"Merge doesn't permit that revision specifier.")
2140
other_branch, path = Branch.open_containing(branch)
2142
base = [branch, revision[0].in_history(other_branch).revno]
2143
other = [branch, revision[1].in_history(other_branch).revno]
2145
if tree.branch.get_parent() is None or remember:
2146
tree.branch.set_parent(other_branch.base)
2149
interesting_files = [path]
2151
interesting_files = None
3761
2152
pb = ui.ui_factory.nested_progress_bar()
3762
self.add_cleanup(pb.finished)
3764
self.add_cleanup(tree.unlock)
3765
if location is not None:
3767
mergeable = bundle.read_mergeable_from_url(location,
3768
possible_transports=possible_transports)
3769
except errors.NotABundle:
2155
conflict_count = merge(other, base, check_clean=(not force),
2156
merge_type=merge_type,
2157
reprocess=reprocess,
2158
show_base=show_base,
2159
pb=pb, file_list=interesting_files)
2162
if conflict_count != 0:
3773
raise errors.BzrCommandError('Cannot use --uncommitted'
3774
' with bundles or merge directives.')
3776
if revision is not None:
3777
raise errors.BzrCommandError(
3778
'Cannot use -r with merge directives or bundles')
3779
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3782
if merger is None and uncommitted:
3783
if revision is not None and len(revision) > 0:
3784
raise errors.BzrCommandError('Cannot use --uncommitted and'
3785
' --revision at the same time.')
3786
merger = self.get_merger_from_uncommitted(tree, location, pb)
3787
allow_pending = False
3790
merger, allow_pending = self._get_merger_from_branch(tree,
3791
location, revision, remember, possible_transports, pb)
3793
merger.merge_type = merge_type
3794
merger.reprocess = reprocess
3795
merger.show_base = show_base
3796
self.sanity_check_merger(merger)
3797
if (merger.base_rev_id == merger.other_rev_id and
3798
merger.other_rev_id is not None):
3799
note('Nothing to do.')
3802
if merger.interesting_files is not None:
3803
raise errors.BzrCommandError('Cannot pull individual files')
3804
if (merger.base_rev_id == tree.last_revision()):
3805
result = tree.pull(merger.other_branch, False,
3806
merger.other_rev_id)
3807
result.report(self.outf)
3809
if merger.this_basis is None:
3810
raise errors.BzrCommandError(
3811
"This branch has no commits."
3812
" (perhaps you would prefer 'bzr pull')")
3814
return self._do_preview(merger)
3816
return self._do_interactive(merger)
3818
return self._do_merge(merger, change_reporter, allow_pending,
3821
def _get_preview(self, merger):
3822
tree_merger = merger.make_merger()
3823
tt = tree_merger.make_preview_transform()
3824
self.add_cleanup(tt.finalize)
3825
result_tree = tt.get_preview_tree()
3828
def _do_preview(self, merger):
3829
from bzrlib.diff import show_diff_trees
3830
result_tree = self._get_preview(merger)
3831
show_diff_trees(merger.this_tree, result_tree, self.outf,
3832
old_label='', new_label='')
3834
def _do_merge(self, merger, change_reporter, allow_pending, verified):
3835
merger.change_reporter = change_reporter
3836
conflict_count = merger.do_merge()
3838
merger.set_pending()
3839
if verified == 'failed':
3840
warning('Preview patch does not match changes')
3841
if conflict_count != 0:
3846
def _do_interactive(self, merger):
3847
"""Perform an interactive merge.
3849
This works by generating a preview tree of the merge, then using
3850
Shelver to selectively remove the differences between the working tree
3851
and the preview tree.
3853
from bzrlib import shelf_ui
3854
result_tree = self._get_preview(merger)
3855
writer = bzrlib.option.diff_writer_registry.get()
3856
shelver = shelf_ui.Shelver(merger.this_tree, result_tree, destroy=True,
3857
reporter=shelf_ui.ApplyReporter(),
3858
diff_writer=writer(sys.stdout))
3864
def sanity_check_merger(self, merger):
3865
if (merger.show_base and
3866
not merger.merge_type is _mod_merge.Merge3Merger):
3867
raise errors.BzrCommandError("Show-base is not supported for this"
3868
" merge type. %s" % merger.merge_type)
3869
if merger.reprocess is None:
3870
if merger.show_base:
3871
merger.reprocess = False
3873
# Use reprocess if the merger supports it
3874
merger.reprocess = merger.merge_type.supports_reprocess
3875
if merger.reprocess and not merger.merge_type.supports_reprocess:
3876
raise errors.BzrCommandError("Conflict reduction is not supported"
3877
" for merge type %s." %
3879
if merger.reprocess and merger.show_base:
3880
raise errors.BzrCommandError("Cannot do conflict reduction and"
3883
def _get_merger_from_branch(self, tree, location, revision, remember,
3884
possible_transports, pb):
3885
"""Produce a merger from a location, assuming it refers to a branch."""
3886
from bzrlib.tag import _merge_tags_if_possible
3887
# find the branch locations
3888
other_loc, user_location = self._select_branch_location(tree, location,
3890
if revision is not None and len(revision) == 2:
3891
base_loc, _unused = self._select_branch_location(tree,
3892
location, revision, 0)
3894
base_loc = other_loc
3896
other_branch, other_path = Branch.open_containing(other_loc,
3897
possible_transports)
3898
if base_loc == other_loc:
3899
base_branch = other_branch
3901
base_branch, base_path = Branch.open_containing(base_loc,
3902
possible_transports)
3903
# Find the revision ids
3904
other_revision_id = None
3905
base_revision_id = None
3906
if revision is not None:
3907
if len(revision) >= 1:
3908
other_revision_id = revision[-1].as_revision_id(other_branch)
3909
if len(revision) == 2:
3910
base_revision_id = revision[0].as_revision_id(base_branch)
3911
if other_revision_id is None:
3912
other_revision_id = _mod_revision.ensure_null(
3913
other_branch.last_revision())
3914
# Remember where we merge from
3915
if ((remember or tree.branch.get_submit_branch() is None) and
3916
user_location is not None):
3917
tree.branch.set_submit_branch(other_branch.base)
3918
_merge_tags_if_possible(other_branch, tree.branch)
3919
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
3920
other_revision_id, base_revision_id, other_branch, base_branch)
3921
if other_path != '':
3922
allow_pending = False
3923
merger.interesting_files = [other_path]
3925
allow_pending = True
3926
return merger, allow_pending
3928
def get_merger_from_uncommitted(self, tree, location, pb):
3929
"""Get a merger for uncommitted changes.
3931
:param tree: The tree the merger should apply to.
3932
:param location: The location containing uncommitted changes.
3933
:param pb: The progress bar to use for showing progress.
3935
location = self._select_branch_location(tree, location)[0]
3936
other_tree, other_path = WorkingTree.open_containing(location)
3937
merger = _mod_merge.Merger.from_uncommitted(tree, other_tree, pb)
3938
if other_path != '':
3939
merger.interesting_files = [other_path]
3942
def _select_branch_location(self, tree, user_location, revision=None,
3944
"""Select a branch location, according to possible inputs.
3946
If provided, branches from ``revision`` are preferred. (Both
3947
``revision`` and ``index`` must be supplied.)
3949
Otherwise, the ``location`` parameter is used. If it is None, then the
3950
``submit`` or ``parent`` location is used, and a note is printed.
3952
:param tree: The working tree to select a branch for merging into
3953
:param location: The location entered by the user
3954
:param revision: The revision parameter to the command
3955
:param index: The index to use for the revision parameter. Negative
3956
indices are permitted.
3957
:return: (selected_location, user_location). The default location
3958
will be the user-entered location.
3960
if (revision is not None and index is not None
3961
and revision[index] is not None):
3962
branch = revision[index].get_branch()
3963
if branch is not None:
3964
return branch, branch
3965
if user_location is None:
3966
location = self._get_remembered(tree, 'Merging from')
3968
location = user_location
3969
return location, user_location
3971
def _get_remembered(self, tree, verb_string):
2166
except errors.AmbiguousBase, e:
2167
m = ("sorry, bzr can't determine the right merge base yet\n"
2168
"candidates are:\n "
2169
+ "\n ".join(e.bases)
2171
"please specify an explicit base with -r,\n"
2172
"and (if you want) report this to the bzr developers\n")
2175
# TODO: move up to common parent; this isn't merge-specific anymore.
2176
def _get_remembered_parent(self, tree, supplied_location, verb_string):
3972
2177
"""Use tree.branch's parent if none was supplied.
3974
2179
Report if the remembered location was used.
3976
stored_location = tree.branch.get_submit_branch()
3977
stored_location_type = "submit"
3978
if stored_location is None:
3979
stored_location = tree.branch.get_parent()
3980
stored_location_type = "parent"
2181
if supplied_location is not None:
2182
return supplied_location
2183
stored_location = tree.branch.get_parent()
3981
2184
mutter("%s", stored_location)
3982
2185
if stored_location is None:
3983
raise errors.BzrCommandError("No location specified or remembered")
3984
display_url = urlutils.unescape_for_display(stored_location, 'utf-8')
3985
note(u"%s remembered %s location %s", verb_string,
3986
stored_location_type, display_url)
2186
raise BzrCommandError("No location specified or remembered")
2187
display_url = urlutils.unescape_for_display(stored_location, self.outf.encoding)
2188
self.outf.write("%s remembered location %s\n" % (verb_string, display_url))
3987
2189
return stored_location
3991
2193
"""Redo a merge.
3993
2195
Use this if you want to try a different merge technique while resolving
3994
conflicts. Some merge techniques are better than others, and remerge
2196
conflicts. Some merge techniques are better than others, and remerge
3995
2197
lets you try different ones on different files.
3997
2199
The options for remerge have the same meaning and defaults as the ones for
3998
2200
merge. The difference is that remerge can (only) be run when there is a
3999
2201
pending merge, and it lets you specify particular files.
2204
$ bzr remerge --show-base
4002
2205
Re-do the merge of all conflicted files, and show the base text in
4003
conflict regions, in addition to the usual THIS and OTHER texts::
4005
bzr remerge --show-base
2206
conflict regions, in addition to the usual THIS and OTHER texts.
2208
$ bzr remerge --merge-type weave --reprocess foobar
4007
2209
Re-do the merge of "foobar", using the weave merge algorithm, with
4008
additional processing to reduce the size of conflict regions::
4010
bzr remerge --merge-type weave --reprocess foobar
2210
additional processing to reduce the size of conflict regions.
2212
The following merge types are available:"""
4012
2213
takes_args = ['file*']
4017
help="Show base revision text in conflicts."),
2214
takes_options = ['merge-type', 'reprocess',
2215
Option('show-base', help="Show base revision text in "
2219
from merge import merge_type_help
2220
from inspect import getdoc
2221
return getdoc(self) + '\n' + merge_type_help()
4020
2223
def run(self, file_list=None, merge_type=None, show_base=False,
4021
2224
reprocess=False):
2225
from bzrlib.merge import merge_inner, transform_tree
4022
2226
if merge_type is None:
4023
merge_type = _mod_merge.Merge3Merger
2227
merge_type = Merge3Merger
4024
2228
tree, file_list = tree_files(file_list)
4025
2229
tree.lock_write()
4026
self.add_cleanup(tree.unlock)
4027
parents = tree.get_parent_ids()
4028
if len(parents) != 2:
4029
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4030
" merges. Not cherrypicking or"
4032
repository = tree.branch.repository
4033
interesting_ids = None
4035
conflicts = tree.conflicts()
4036
if file_list is not None:
4037
interesting_ids = set()
4038
for filename in file_list:
4039
file_id = tree.path2id(filename)
4041
raise errors.NotVersionedError(filename)
4042
interesting_ids.add(file_id)
4043
if tree.kind(file_id) != "directory":
4046
for name, ie in tree.inventory.iter_entries(file_id):
4047
interesting_ids.add(ie.file_id)
4048
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
4050
# Remerge only supports resolving contents conflicts
4051
allowed_conflicts = ('text conflict', 'contents conflict')
4052
restore_files = [c.path for c in conflicts
4053
if c.typestring in allowed_conflicts]
4054
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
4055
tree.set_conflicts(ConflictList(new_conflicts))
4056
if file_list is not None:
4057
restore_files = file_list
4058
for filename in restore_files:
4060
restore(tree.abspath(filename))
4061
except errors.NotConflicted:
4063
# Disable pending merges, because the file texts we are remerging
4064
# have not had those merges performed. If we use the wrong parents
4065
# list, we imply that the working tree text has seen and rejected
4066
# all the changes from the other tree, when in fact those changes
4067
# have not yet been seen.
4068
pb = ui.ui_factory.nested_progress_bar()
4069
tree.set_parent_ids(parents[:1])
4071
merger = _mod_merge.Merger.from_revision_ids(pb,
4073
merger.interesting_ids = interesting_ids
4074
merger.merge_type = merge_type
4075
merger.show_base = show_base
4076
merger.reprocess = reprocess
4077
conflicts = merger.do_merge()
2231
pending_merges = tree.pending_merges()
2232
if len(pending_merges) != 1:
2233
raise BzrCommandError("Sorry, remerge only works after normal"
2234
" merges. Not cherrypicking or"
2236
repository = tree.branch.repository
2237
base_revision = common_ancestor(tree.branch.last_revision(),
2238
pending_merges[0], repository)
2239
base_tree = repository.revision_tree(base_revision)
2240
other_tree = repository.revision_tree(pending_merges[0])
2241
interesting_ids = None
2243
conflicts = tree.conflicts()
2244
if file_list is not None:
2245
interesting_ids = set()
2246
for filename in file_list:
2247
file_id = tree.path2id(filename)
2249
raise NotVersionedError(filename)
2250
interesting_ids.add(file_id)
2251
if tree.kind(file_id) != "directory":
2254
for name, ie in tree.inventory.iter_entries(file_id):
2255
interesting_ids.add(ie.file_id)
2256
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
2257
transform_tree(tree, tree.basis_tree(), interesting_ids)
2258
tree.set_conflicts(ConflictList(new_conflicts))
2259
if file_list is None:
2260
restore_files = list(tree.iter_conflicts())
2262
restore_files = file_list
2263
for filename in restore_files:
2265
restore(tree.abspath(filename))
2266
except NotConflicted:
2268
conflicts = merge_inner(tree.branch, other_tree, base_tree,
2270
interesting_ids=interesting_ids,
2271
other_rev_id=pending_merges[0],
2272
merge_type=merge_type,
2273
show_base=show_base,
2274
reprocess=reprocess)
4079
tree.set_parent_ids(parents)
4081
2277
if conflicts > 0:
4087
2282
class cmd_revert(Command):
4088
"""Revert files to a previous revision.
4090
Giving a list of files will revert only those files. Otherwise, all files
4091
will be reverted. If the revision is not specified with '--revision', the
4092
last committed revision is used.
4094
To remove only some changes, without reverting to a prior version, use
4095
merge instead. For example, "merge . --revision -2..-3" will remove the
4096
changes introduced by -2, without affecting the changes introduced by -1.
4097
Or to remove certain changes on a hunk-by-hunk basis, see the Shelf plugin.
4099
By default, any files that have been manually changed will be backed up
4100
first. (Files changed only by merge are not backed up.) Backup files have
4101
'.~#~' appended to their name, where # is a number.
4103
When you provide files, you can use their current pathname or the pathname
4104
from the target revision. So you can use revert to "undelete" a file by
4105
name. If you name a directory, all the contents of that directory will be
4108
If you have newly added files since the target revision, they will be
4109
removed. If the files to be removed have been changed, backups will be
4110
created as above. Directories containing unknown files will not be
4113
The working tree contains a list of revisions that have been merged but
4114
not yet committed. These revisions will be included as additional parents
4115
of the next commit. Normally, using revert clears that list as well as
4116
reverting the files. If any files are specified, revert leaves the list
4117
of uncommitted merges alone and reverts only the files. Use ``bzr revert
4118
.`` in the tree root to revert all files but keep the recorded merges,
4119
and ``bzr revert --forget-merges`` to clear the pending merge list without
4120
reverting any files.
4122
Using "bzr revert --forget-merges", it is possible to apply all of the
4123
changes from a branch in a single revision. To do this, perform the merge
4124
as desired. Then doing revert with the "--forget-merges" option will keep
4125
the content of the tree as it was, but it will clear the list of pending
4126
merges. The next commit will then contain all of the changes that are
4127
present in the other branch, but without any other parent revisions.
4128
Because this technique forgets where these changes originated, it may
4129
cause additional conflicts on later merges involving the same source and
2283
"""Reverse all changes since the last commit.
2285
Only versioned files are affected. Specify filenames to revert only
2286
those files. By default, any files that are changed will be backed up
2287
first. Backup files have a '~' appended to their name.
4133
_see_also = ['cat', 'export']
4136
Option('no-backup', "Do not save backups of reverted files."),
4137
Option('forget-merges',
4138
'Remove pending merge marker, without changing any files.'),
2289
takes_options = ['revision', 'no-backup']
4140
2290
takes_args = ['file*']
2291
aliases = ['merge-revert']
4142
def run(self, revision=None, no_backup=False, file_list=None,
4143
forget_merges=None):
2293
def run(self, revision=None, no_backup=False, file_list=None):
2294
from bzrlib.commands import parse_spec
2295
if file_list is not None:
2296
if len(file_list) == 0:
2297
raise BzrCommandError("No files specified")
4144
2301
tree, file_list = tree_files(file_list)
4146
self.add_cleanup(tree.unlock)
4148
tree.set_parent_ids(tree.get_parent_ids()[:1])
2302
if revision is None:
2303
# FIXME should be tree.last_revision
2304
rev_id = tree.last_revision()
2305
elif len(revision) != 1:
2306
raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
4150
self._revert_tree_to_revision(tree, revision, file_list, no_backup)
4153
def _revert_tree_to_revision(tree, revision, file_list, no_backup):
4154
rev_tree = _get_one_revision_tree('revert', revision, tree=tree)
2308
rev_id = revision[0].in_history(tree.branch).rev_id
4155
2309
pb = ui.ui_factory.nested_progress_bar()
4157
tree.revert(file_list, rev_tree, not no_backup, pb,
4158
report_changes=True)
2311
tree.revert(file_list,
2312
tree.branch.repository.revision_tree(rev_id),
4163
2318
class cmd_assert_fail(Command):
4164
2319
"""Test reporting of assertion failures"""
4165
# intended just for use in testing
4170
raise AssertionError("always fails")
2322
assert False, "always fails"
4173
2325
class cmd_help(Command):
4174
2326
"""Show help on a command or other topic.
4177
_see_also = ['topics']
4179
Option('long', 'Show help on all commands.'),
2328
For a list of all available commands, say 'bzr help commands'."""
2329
takes_options = [Option('long', 'show help on all commands')]
4181
2330
takes_args = ['topic?']
4182
2331
aliases = ['?', '--help', '-?', '-h']
4184
2333
@display_command
4185
2334
def run(self, topic=None, long=False):
4187
2336
if topic is None and long:
4188
2337
topic = "commands"
4189
bzrlib.help.help(topic)
4192
2341
class cmd_shell_complete(Command):
4193
2342
"""Show appropriate completions for context.
4195
For a list of all available commands, say 'bzr shell-complete'.
2344
For a list of all available commands, say 'bzr shell-complete'."""
4197
2345
takes_args = ['context?']
4198
2346
aliases = ['s-c']
4201
2349
@display_command
4202
2350
def run(self, context=None):
4203
2351
import shellcomplete
4204
2352
shellcomplete.shellcomplete(context)
2355
class cmd_fetch(Command):
2356
"""Copy in history from another branch but don't merge it.
2358
This is an internal method used for pull and merge."""
2360
takes_args = ['from_branch', 'to_branch']
2361
def run(self, from_branch, to_branch):
2362
from bzrlib.fetch import Fetcher
2363
from_b = Branch.open(from_branch)
2364
to_b = Branch.open(to_branch)
2365
Fetcher(to_b, from_b)
4207
2368
class cmd_missing(Command):
4208
2369
"""Show unmerged/unpulled revisions between two branches.
4210
OTHER_BRANCH may be local or remote.
4212
To filter on a range of revisions, you can use the command -r begin..end
4213
-r revision requests a specific revision, -r ..end or -r begin.. are
4217
1 - some missing revisions
4218
0 - no missing revisions
4222
Determine the missing revisions between this and the branch at the
4223
remembered pull location::
4227
Determine the missing revisions between this and another branch::
4229
bzr missing http://server/branch
4231
Determine the missing revisions up to a specific revision on the other
4234
bzr missing -r ..-10
4236
Determine the missing revisions up to a specific revision on this
4239
bzr missing --my-revision ..-10
4242
_see_also = ['merge', 'pull']
2371
OTHER_BRANCH may be local or remote."""
4243
2372
takes_args = ['other_branch?']
4245
Option('reverse', 'Reverse the order of revisions.'),
4247
'Display changes in the local branch only.'),
4248
Option('this' , 'Same as --mine-only.'),
4249
Option('theirs-only',
4250
'Display changes in the remote branch only.'),
4251
Option('other', 'Same as --theirs-only.'),
4255
custom_help('revision',
4256
help='Filter on other branch revisions (inclusive). '
4257
'See "help revisionspec" for details.'),
4258
Option('my-revision',
4259
type=_parse_revision_str,
4260
help='Filter on local branch revisions (inclusive). '
4261
'See "help revisionspec" for details.'),
4262
Option('include-merges',
4263
'Show all revisions in addition to the mainline ones.'),
2373
takes_options = [Option('reverse', 'Reverse the order of revisions'),
2375
'Display changes in the local branch only'),
2376
Option('theirs-only',
2377
'Display changes in the remote branch only'),
4265
2385
encoding_type = 'replace'
4267
2387
@display_command
4268
2388
def run(self, other_branch=None, reverse=False, mine_only=False,
4270
log_format=None, long=False, short=False, line=False,
4271
show_ids=False, verbose=False, this=False, other=False,
4272
include_merges=False, revision=None, my_revision=None):
4273
from bzrlib.missing import find_unmerged, iter_log_revisions
4282
# TODO: We should probably check that we don't have mine-only and
4283
# theirs-only set, but it gets complicated because we also have
4284
# this and other which could be used.
2389
theirs_only=False, log_format=None, long=False, short=False, line=False,
2390
show_ids=False, verbose=False):
2391
from bzrlib.missing import find_unmerged, iter_log_data
2392
from bzrlib.log import log_formatter
4291
2393
local_branch = Branch.open_containing(u".")[0]
4292
2394
parent = local_branch.get_parent()
4293
2395
if other_branch is None:
4294
2396
other_branch = parent
4295
2397
if other_branch is None:
4296
raise errors.BzrCommandError("No peer location known"
4298
display_url = urlutils.unescape_for_display(parent,
4300
message("Using saved parent location: "
4301
+ display_url + "\n")
2398
raise BzrCommandError("No missing location known or specified.")
2399
print "Using last location: " + local_branch.get_parent()
4303
2400
remote_branch = Branch.open(other_branch)
4304
2401
if remote_branch.base == local_branch.base:
4305
2402
remote_branch = local_branch
4307
2403
local_branch.lock_read()
4308
self.add_cleanup(local_branch.unlock)
4309
local_revid_range = _revision_range_to_revid_range(
4310
_get_revision_range(my_revision, local_branch,
4313
remote_branch.lock_read()
4314
self.add_cleanup(remote_branch.unlock)
4315
remote_revid_range = _revision_range_to_revid_range(
4316
_get_revision_range(revision,
4317
remote_branch, self.name()))
4319
local_extra, remote_extra = find_unmerged(
4320
local_branch, remote_branch, restrict,
4321
backward=not reverse,
4322
include_merges=include_merges,
4323
local_revid_range=local_revid_range,
4324
remote_revid_range=remote_revid_range)
4326
if log_format is None:
4327
registry = log.log_formatter_registry
4328
log_format = registry.get_default(local_branch)
4329
lf = log_format(to_file=self.outf,
4331
show_timezone='original')
4334
if local_extra and not theirs_only:
4335
message("You have %d extra revision(s):\n" %
4337
for revision in iter_log_revisions(local_extra,
4338
local_branch.repository,
4340
lf.log_revision(revision)
4341
printed_local = True
4344
printed_local = False
4346
if remote_extra and not mine_only:
4347
if printed_local is True:
4349
message("You are missing %d revision(s):\n" %
4351
for revision in iter_log_revisions(remote_extra,
4352
remote_branch.repository,
4354
lf.log_revision(revision)
4357
if mine_only and not local_extra:
4358
# We checked local, and found nothing extra
4359
message('This branch is up to date.\n')
4360
elif theirs_only and not remote_extra:
4361
# We checked remote, and found nothing extra
4362
message('Other branch is up to date.\n')
4363
elif not (mine_only or theirs_only or local_extra or
4365
# We checked both branches, and neither one had extra
4367
message("Branches are up to date.\n")
2405
remote_branch.lock_read()
2407
local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
2408
if (log_format == None):
2409
default = local_branch.get_config().log_format()
2410
log_format = get_log_format(long=long, short=short,
2411
line=line, default=default)
2412
lf = log_formatter(log_format,
2415
show_timezone='original')
2416
if reverse is False:
2417
local_extra.reverse()
2418
remote_extra.reverse()
2419
if local_extra and not theirs_only:
2420
print "You have %d extra revision(s):" % len(local_extra)
2421
for data in iter_log_data(local_extra, local_branch.repository,
2424
printed_local = True
2426
printed_local = False
2427
if remote_extra and not mine_only:
2428
if printed_local is True:
2430
print "You are missing %d revision(s):" % len(remote_extra)
2431
for data in iter_log_data(remote_extra, remote_branch.repository,
2434
if not remote_extra and not local_extra:
2436
print "Branches are up to date."
2440
remote_branch.unlock()
2442
local_branch.unlock()
4369
2443
if not status_code and parent is None and other_branch is not None:
4370
2444
local_branch.lock_write()
4371
self.add_cleanup(local_branch.unlock)
4372
# handle race conditions - a parent might be set while we run.
4373
if local_branch.get_parent() is None:
4374
local_branch.set_parent(remote_branch.base)
2446
# handle race conditions - a parent might be set while we run.
2447
if local_branch.get_parent() is None:
2448
local_branch.set_parent(remote_branch.base)
2450
local_branch.unlock()
4375
2451
return status_code
4378
class cmd_pack(Command):
4379
"""Compress the data within a repository."""
4381
_see_also = ['repositories']
4382
takes_args = ['branch_or_repo?']
4384
def run(self, branch_or_repo='.'):
4385
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4387
branch = dir.open_branch()
4388
repository = branch.repository
4389
except errors.NotBranchError:
4390
repository = dir.open_repository()
4394
2454
class cmd_plugins(Command):
4395
"""List the installed plugins.
4397
This command displays the list of installed plugins including
4398
version of plugin and a short description of each.
4400
--verbose shows the path where each plugin is located.
4402
A plugin is an external component for Bazaar that extends the
4403
revision control system, by adding or replacing code in Bazaar.
4404
Plugins can do a variety of things, including overriding commands,
4405
adding new commands, providing additional network transports and
4406
customizing log output.
4408
See the Bazaar Plugin Guide <http://doc.bazaar.canonical.com/plugins/en/>
4409
for further information on plugins including where to find them and how to
4410
install them. Instructions are also provided there on how to write new
4411
plugins using the Python programming language.
4413
takes_options = ['verbose']
4415
2457
@display_command
4416
def run(self, verbose=False):
4417
2459
import bzrlib.plugin
4418
2460
from inspect import getdoc
4420
for name, plugin in bzrlib.plugin.plugins().items():
4421
version = plugin.__version__
4422
if version == 'unknown':
4424
name_ver = '%s %s' % (name, version)
4425
d = getdoc(plugin.module)
2461
for name, plugin in bzrlib.plugin.all_plugins().items():
2462
if hasattr(plugin, '__path__'):
2463
print plugin.__path__[0]
2464
elif hasattr(plugin, '__file__'):
2465
print plugin.__file__
4427
doc = d.split('\n')[0]
4429
doc = '(no description)'
4430
result.append((name_ver, doc, plugin.path()))
4431
for name_ver, doc, path in sorted(result):
2471
print '\t', d.split('\n')[0]
4439
2474
class cmd_testament(Command):
4440
2475
"""Show testament (signing-form) of a revision."""
4443
Option('long', help='Produce long-format testament.'),
4445
help='Produce a strict-format testament.')]
2476
takes_options = ['revision', 'long',
2477
Option('strict', help='Produce a strict-format'
4446
2479
takes_args = ['branch?']
4447
2480
@display_command
4448
2481
def run(self, branch=u'.', revision=None, long=False, strict=False):
4773
2719
control.break_lock()
4774
2720
except NotImplementedError:
4778
class cmd_wait_until_signalled(Command):
4779
"""Test helper for test_start_and_stop_bzr_subprocess_send_signal.
4781
This just prints a line to signal when it is ready, then blocks on stdin.
4787
sys.stdout.write("running\n")
4789
sys.stdin.readline()
4792
class cmd_serve(Command):
4793
"""Run the bzr server."""
4795
aliases = ['server']
4799
help='Serve on stdin/out for use from inetd or sshd.'),
4800
RegistryOption('protocol',
4801
help="Protocol to serve.",
4802
lazy_registry=('bzrlib.transport', 'transport_server_registry'),
4803
value_switches=True),
4805
help='Listen for connections on nominated port of the form '
4806
'[hostname:]portnumber. Passing 0 as the port number will '
4807
'result in a dynamically allocated port. The default port '
4808
'depends on the protocol.',
4811
help='Serve contents of this directory.',
4813
Option('allow-writes',
4814
help='By default the server is a readonly server. Supplying '
4815
'--allow-writes enables write access to the contents of '
4816
'the served directory and below. Note that ``bzr serve`` '
4817
'does not perform authentication, so unless some form of '
4818
'external authentication is arranged supplying this '
4819
'option leads to global uncontrolled write access to your '
4824
def get_host_and_port(self, port):
4825
"""Return the host and port to run the smart server on.
4827
If 'port' is None, None will be returned for the host and port.
4829
If 'port' has a colon in it, the string before the colon will be
4830
interpreted as the host.
4832
:param port: A string of the port to run the server on.
4833
:return: A tuple of (host, port), where 'host' is a host name or IP,
4834
and port is an integer TCP/IP port.
4837
if port is not None:
4839
host, port = port.split(':')
4843
def run(self, port=None, inet=False, directory=None, allow_writes=False,
4845
from bzrlib.transport import get_transport, transport_server_registry
4846
if directory is None:
4847
directory = os.getcwd()
4848
if protocol is None:
4849
protocol = transport_server_registry.get()
4850
host, port = self.get_host_and_port(port)
4851
url = urlutils.local_path_to_url(directory)
4852
if not allow_writes:
4853
url = 'readonly+' + url
4854
transport = get_transport(url)
4855
protocol(transport, host, port, inet)
4858
class cmd_join(Command):
4859
"""Combine a tree into its containing tree.
4861
This command requires the target tree to be in a rich-root format.
4863
The TREE argument should be an independent tree, inside another tree, but
4864
not part of it. (Such trees can be produced by "bzr split", but also by
4865
running "bzr branch" with the target inside a tree.)
4867
The result is a combined tree, with the subtree no longer an independant
4868
part. This is marked as a merge of the subtree into the containing tree,
4869
and all history is preserved.
4872
_see_also = ['split']
4873
takes_args = ['tree']
4875
Option('reference', help='Join by reference.', hidden=True),
4878
def run(self, tree, reference=False):
4879
sub_tree = WorkingTree.open(tree)
4880
parent_dir = osutils.dirname(sub_tree.basedir)
4881
containing_tree = WorkingTree.open_containing(parent_dir)[0]
4882
repo = containing_tree.branch.repository
4883
if not repo.supports_rich_root():
4884
raise errors.BzrCommandError(
4885
"Can't join trees because %s doesn't support rich root data.\n"
4886
"You can use bzr upgrade on the repository."
4890
containing_tree.add_reference(sub_tree)
4891
except errors.BadReferenceTarget, e:
4892
# XXX: Would be better to just raise a nicely printable
4893
# exception from the real origin. Also below. mbp 20070306
4894
raise errors.BzrCommandError("Cannot join %s. %s" %
4898
containing_tree.subsume(sub_tree)
4899
except errors.BadSubsumeSource, e:
4900
raise errors.BzrCommandError("Cannot join %s. %s" %
4904
class cmd_split(Command):
4905
"""Split a subdirectory of a tree into a separate tree.
4907
This command will produce a target tree in a format that supports
4908
rich roots, like 'rich-root' or 'rich-root-pack'. These formats cannot be
4909
converted into earlier formats like 'dirstate-tags'.
4911
The TREE argument should be a subdirectory of a working tree. That
4912
subdirectory will be converted into an independent tree, with its own
4913
branch. Commits in the top-level tree will not apply to the new subtree.
4916
_see_also = ['join']
4917
takes_args = ['tree']
4919
def run(self, tree):
4920
containing_tree, subdir = WorkingTree.open_containing(tree)
4921
sub_id = containing_tree.path2id(subdir)
4923
raise errors.NotVersionedError(subdir)
4925
containing_tree.extract(sub_id)
4926
except errors.RootNotRich:
4927
raise errors.RichRootUpgradeRequired(containing_tree.branch.base)
4930
class cmd_merge_directive(Command):
4931
"""Generate a merge directive for auto-merge tools.
4933
A directive requests a merge to be performed, and also provides all the
4934
information necessary to do so. This means it must either include a
4935
revision bundle, or the location of a branch containing the desired
4938
A submit branch (the location to merge into) must be supplied the first
4939
time the command is issued. After it has been supplied once, it will
4940
be remembered as the default.
4942
A public branch is optional if a revision bundle is supplied, but required
4943
if --diff or --plain is specified. It will be remembered as the default
4944
after the first use.
4947
takes_args = ['submit_branch?', 'public_branch?']
4951
_see_also = ['send']
4954
RegistryOption.from_kwargs('patch-type',
4955
'The type of patch to include in the directive.',
4957
value_switches=True,
4959
bundle='Bazaar revision bundle (default).',
4960
diff='Normal unified diff.',
4961
plain='No patch, just directive.'),
4962
Option('sign', help='GPG-sign the directive.'), 'revision',
4963
Option('mail-to', type=str,
4964
help='Instead of printing the directive, email to this address.'),
4965
Option('message', type=str, short_name='m',
4966
help='Message to use when committing this merge.')
4969
encoding_type = 'exact'
4971
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
4972
sign=False, revision=None, mail_to=None, message=None):
4973
from bzrlib.revision import ensure_null, NULL_REVISION
4974
include_patch, include_bundle = {
4975
'plain': (False, False),
4976
'diff': (True, False),
4977
'bundle': (True, True),
4979
branch = Branch.open('.')
4980
stored_submit_branch = branch.get_submit_branch()
4981
if submit_branch is None:
4982
submit_branch = stored_submit_branch
4984
if stored_submit_branch is None:
4985
branch.set_submit_branch(submit_branch)
4986
if submit_branch is None:
4987
submit_branch = branch.get_parent()
4988
if submit_branch is None:
4989
raise errors.BzrCommandError('No submit branch specified or known')
4991
stored_public_branch = branch.get_public_branch()
4992
if public_branch is None:
4993
public_branch = stored_public_branch
4994
elif stored_public_branch is None:
4995
branch.set_public_branch(public_branch)
4996
if not include_bundle and public_branch is None:
4997
raise errors.BzrCommandError('No public branch specified or'
4999
base_revision_id = None
5000
if revision is not None:
5001
if len(revision) > 2:
5002
raise errors.BzrCommandError('bzr merge-directive takes '
5003
'at most two one revision identifiers')
5004
revision_id = revision[-1].as_revision_id(branch)
5005
if len(revision) == 2:
5006
base_revision_id = revision[0].as_revision_id(branch)
5008
revision_id = branch.last_revision()
5009
revision_id = ensure_null(revision_id)
5010
if revision_id == NULL_REVISION:
5011
raise errors.BzrCommandError('No revisions to bundle.')
5012
directive = merge_directive.MergeDirective2.from_objects(
5013
branch.repository, revision_id, time.time(),
5014
osutils.local_time_offset(), submit_branch,
5015
public_branch=public_branch, include_patch=include_patch,
5016
include_bundle=include_bundle, message=message,
5017
base_revision_id=base_revision_id)
5020
self.outf.write(directive.to_signed(branch))
5022
self.outf.writelines(directive.to_lines())
5024
message = directive.to_email(mail_to, branch, sign)
5025
s = SMTPConnection(branch.get_config())
5026
s.send_email(message)
5029
class cmd_send(Command):
5030
"""Mail or create a merge-directive for submitting changes.
5032
A merge directive provides many things needed for requesting merges:
5034
* A machine-readable description of the merge to perform
5036
* An optional patch that is a preview of the changes requested
5038
* An optional bundle of revision data, so that the changes can be applied
5039
directly from the merge directive, without retrieving data from a
5042
`bzr send` creates a compact data set that, when applied using bzr
5043
merge, has the same effect as merging from the source branch.
5045
By default the merge directive is self-contained and can be applied to any
5046
branch containing submit_branch in its ancestory without needing access to
5049
If --no-bundle is specified, then Bazaar doesn't send the contents of the
5050
revisions, but only a structured request to merge from the
5051
public_location. In that case the public_branch is needed and it must be
5052
up-to-date and accessible to the recipient. The public_branch is always
5053
included if known, so that people can check it later.
5055
The submit branch defaults to the parent of the source branch, but can be
5056
overridden. Both submit branch and public branch will be remembered in
5057
branch.conf the first time they are used for a particular branch. The
5058
source branch defaults to that containing the working directory, but can
5059
be changed using --from.
5061
In order to calculate those changes, bzr must analyse the submit branch.
5062
Therefore it is most efficient for the submit branch to be a local mirror.
5063
If a public location is known for the submit_branch, that location is used
5064
in the merge directive.
5066
The default behaviour is to send the merge directive by mail, unless -o is
5067
given, in which case it is sent to a file.
5069
Mail is sent using your preferred mail program. This should be transparent
5070
on Windows (it uses MAPI). On Linux, it requires the xdg-email utility.
5071
If the preferred client can't be found (or used), your editor will be used.
5073
To use a specific mail program, set the mail_client configuration option.
5074
(For Thunderbird 1.5, this works around some bugs.) Supported values for
5075
specific clients are "claws", "evolution", "kmail", "mail.app" (MacOS X's
5076
Mail.app), "mutt", and "thunderbird"; generic options are "default",
5077
"editor", "emacsclient", "mapi", and "xdg-email". Plugins may also add
5080
If mail is being sent, a to address is required. This can be supplied
5081
either on the commandline, by setting the submit_to configuration
5082
option in the branch itself or the child_submit_to configuration option
5083
in the submit branch.
5085
Two formats are currently supported: "4" uses revision bundle format 4 and
5086
merge directive format 2. It is significantly faster and smaller than
5087
older formats. It is compatible with Bazaar 0.19 and later. It is the
5088
default. "0.9" uses revision bundle format 0.9 and merge directive
5089
format 1. It is compatible with Bazaar 0.12 - 0.18.
5091
The merge directives created by bzr send may be applied using bzr merge or
5092
bzr pull by specifying a file containing a merge directive as the location.
5094
bzr send makes extensive use of public locations to map local locations into
5095
URLs that can be used by other people. See `bzr help configuration` to
5096
set them, and use `bzr info` to display them.
5099
encoding_type = 'exact'
5101
_see_also = ['merge', 'pull']
5103
takes_args = ['submit_branch?', 'public_branch?']
5107
help='Do not include a bundle in the merge directive.'),
5108
Option('no-patch', help='Do not include a preview patch in the merge'
5111
help='Remember submit and public branch.'),
5113
help='Branch to generate the submission from, '
5114
'rather than the one containing the working directory.',
5117
Option('output', short_name='o',
5118
help='Write merge directive to this file; '
5119
'use - for stdout.',
5122
help='Refuse to send if there are uncommitted changes in'
5123
' the working tree, --no-strict disables the check.'),
5124
Option('mail-to', help='Mail the request to this address.',
5128
Option('body', help='Body for the email.', type=unicode),
5129
RegistryOption('format',
5130
help='Use the specified output format.',
5131
lazy_registry=('bzrlib.send', 'format_registry')),
5134
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5135
no_patch=False, revision=None, remember=False, output=None,
5136
format=None, mail_to=None, message=None, body=None,
5137
strict=None, **kwargs):
5138
from bzrlib.send import send
5139
return send(submit_branch, revision, public_branch, remember,
5140
format, no_bundle, no_patch, output,
5141
kwargs.get('from', '.'), mail_to, message, body,
5146
class cmd_bundle_revisions(cmd_send):
5147
"""Create a merge-directive for submitting changes.
5149
A merge directive provides many things needed for requesting merges:
5151
* A machine-readable description of the merge to perform
5153
* An optional patch that is a preview of the changes requested
5155
* An optional bundle of revision data, so that the changes can be applied
5156
directly from the merge directive, without retrieving data from a
5159
If --no-bundle is specified, then public_branch is needed (and must be
5160
up-to-date), so that the receiver can perform the merge using the
5161
public_branch. The public_branch is always included if known, so that
5162
people can check it later.
5164
The submit branch defaults to the parent, but can be overridden. Both
5165
submit branch and public branch will be remembered if supplied.
5167
If a public_branch is known for the submit_branch, that public submit
5168
branch is used in the merge instructions. This means that a local mirror
5169
can be used as your actual submit branch, once you have set public_branch
5172
Two formats are currently supported: "4" uses revision bundle format 4 and
5173
merge directive format 2. It is significantly faster and smaller than
5174
older formats. It is compatible with Bazaar 0.19 and later. It is the
5175
default. "0.9" uses revision bundle format 0.9 and merge directive
5176
format 1. It is compatible with Bazaar 0.12 - 0.18.
5181
help='Do not include a bundle in the merge directive.'),
5182
Option('no-patch', help='Do not include a preview patch in the merge'
5185
help='Remember submit and public branch.'),
5187
help='Branch to generate the submission from, '
5188
'rather than the one containing the working directory.',
5191
Option('output', short_name='o', help='Write directive to this file.',
5194
help='Refuse to bundle revisions if there are uncommitted'
5195
' changes in the working tree, --no-strict disables the check.'),
5197
RegistryOption('format',
5198
help='Use the specified output format.',
5199
lazy_registry=('bzrlib.send', 'format_registry')),
5201
aliases = ['bundle']
5203
_see_also = ['send', 'merge']
5207
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5208
no_patch=False, revision=None, remember=False, output=None,
5209
format=None, strict=None, **kwargs):
5212
from bzrlib.send import send
5213
return send(submit_branch, revision, public_branch, remember,
5214
format, no_bundle, no_patch, output,
5215
kwargs.get('from', '.'), None, None, None,
5216
self.outf, strict=strict)
5219
class cmd_tag(Command):
5220
"""Create, remove or modify a tag naming a revision.
5222
Tags give human-meaningful names to revisions. Commands that take a -r
5223
(--revision) option can be given -rtag:X, where X is any previously
5226
Tags are stored in the branch. Tags are copied from one branch to another
5227
along when you branch, push, pull or merge.
5229
It is an error to give a tag name that already exists unless you pass
5230
--force, in which case the tag is moved to point to the new revision.
5232
To rename a tag (change the name but keep it on the same revsion), run ``bzr
5233
tag new-name -r tag:old-name`` and then ``bzr tag --delete oldname``.
5236
_see_also = ['commit', 'tags']
5237
takes_args = ['tag_name']
5240
help='Delete this tag rather than placing it.',
5243
help='Branch in which to place the tag.',
5248
help='Replace existing tags.',
5253
def run(self, tag_name,
5259
branch, relpath = Branch.open_containing(directory)
5261
self.add_cleanup(branch.unlock)
5263
branch.tags.delete_tag(tag_name)
5264
self.outf.write('Deleted tag %s.\n' % tag_name)
5267
if len(revision) != 1:
5268
raise errors.BzrCommandError(
5269
"Tags can only be placed on a single revision, "
5271
revision_id = revision[0].as_revision_id(branch)
5273
revision_id = branch.last_revision()
5274
if (not force) and branch.tags.has_tag(tag_name):
5275
raise errors.TagAlreadyExists(tag_name)
5276
branch.tags.set_tag(tag_name, revision_id)
5277
self.outf.write('Created tag %s.\n' % tag_name)
5280
class cmd_tags(Command):
5283
This command shows a table of tag names and the revisions they reference.
5289
help='Branch whose tags should be displayed.',
5293
RegistryOption.from_kwargs('sort',
5294
'Sort tags by different criteria.', title='Sorting',
5295
alpha='Sort tags lexicographically (default).',
5296
time='Sort tags chronologically.',
5309
branch, relpath = Branch.open_containing(directory)
5311
tags = branch.tags.get_tag_dict().items()
5316
self.add_cleanup(branch.unlock)
5318
graph = branch.repository.get_graph()
5319
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5320
revid1, revid2 = rev1.rev_id, rev2.rev_id
5321
# only show revisions between revid1 and revid2 (inclusive)
5322
tags = [(tag, revid) for tag, revid in tags if
5323
graph.is_between(revid, revid1, revid2)]
5326
elif sort == 'time':
5328
for tag, revid in tags:
5330
revobj = branch.repository.get_revision(revid)
5331
except errors.NoSuchRevision:
5332
timestamp = sys.maxint # place them at the end
5334
timestamp = revobj.timestamp
5335
timestamps[revid] = timestamp
5336
tags.sort(key=lambda x: timestamps[x[1]])
5338
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5339
for index, (tag, revid) in enumerate(tags):
5341
revno = branch.revision_id_to_dotted_revno(revid)
5342
if isinstance(revno, tuple):
5343
revno = '.'.join(map(str, revno))
5344
except errors.NoSuchRevision:
5345
# Bad tag data/merges can lead to tagged revisions
5346
# which are not in this branch. Fail gracefully ...
5348
tags[index] = (tag, revno)
5350
for tag, revspec in tags:
5351
self.outf.write('%-20s %s\n' % (tag, revspec))
5354
class cmd_reconfigure(Command):
5355
"""Reconfigure the type of a bzr directory.
5357
A target configuration must be specified.
5359
For checkouts, the bind-to location will be auto-detected if not specified.
5360
The order of preference is
5361
1. For a lightweight checkout, the current bound location.
5362
2. For branches that used to be checkouts, the previously-bound location.
5363
3. The push location.
5364
4. The parent location.
5365
If none of these is available, --bind-to must be specified.
5368
_see_also = ['branches', 'checkouts', 'standalone-trees', 'working-trees']
5369
takes_args = ['location?']
5371
RegistryOption.from_kwargs(
5373
title='Target type',
5374
help='The type to reconfigure the directory to.',
5375
value_switches=True, enum_switch=False,
5376
branch='Reconfigure to be an unbound branch with no working tree.',
5377
tree='Reconfigure to be an unbound branch with a working tree.',
5378
checkout='Reconfigure to be a bound branch with a working tree.',
5379
lightweight_checkout='Reconfigure to be a lightweight'
5380
' checkout (with no local history).',
5381
standalone='Reconfigure to be a standalone branch '
5382
'(i.e. stop using shared repository).',
5383
use_shared='Reconfigure to use a shared repository.',
5384
with_trees='Reconfigure repository to create '
5385
'working trees on branches by default.',
5386
with_no_trees='Reconfigure repository to not create '
5387
'working trees on branches by default.'
5389
Option('bind-to', help='Branch to bind checkout to.', type=str),
5391
help='Perform reconfiguration even if local changes'
5393
Option('stacked-on',
5394
help='Reconfigure a branch to be stacked on another branch.',
5398
help='Reconfigure a branch to be unstacked. This '
5399
'may require copying substantial data into it.',
5403
def run(self, location=None, target_type=None, bind_to=None, force=False,
5406
directory = bzrdir.BzrDir.open(location)
5407
if stacked_on and unstacked:
5408
raise BzrCommandError("Can't use both --stacked-on and --unstacked")
5409
elif stacked_on is not None:
5410
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5412
reconfigure.ReconfigureUnstacked().apply(directory)
5413
# At the moment you can use --stacked-on and a different
5414
# reconfiguration shape at the same time; there seems no good reason
5416
if target_type is None:
5417
if stacked_on or unstacked:
5420
raise errors.BzrCommandError('No target configuration '
5422
elif target_type == 'branch':
5423
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5424
elif target_type == 'tree':
5425
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5426
elif target_type == 'checkout':
5427
reconfiguration = reconfigure.Reconfigure.to_checkout(
5429
elif target_type == 'lightweight-checkout':
5430
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5432
elif target_type == 'use-shared':
5433
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5434
elif target_type == 'standalone':
5435
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5436
elif target_type == 'with-trees':
5437
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5439
elif target_type == 'with-no-trees':
5440
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5442
reconfiguration.apply(force)
5445
class cmd_switch(Command):
5446
"""Set the branch of a checkout and update.
5448
For lightweight checkouts, this changes the branch being referenced.
5449
For heavyweight checkouts, this checks that there are no local commits
5450
versus the current bound branch, then it makes the local branch a mirror
5451
of the new location and binds to it.
5453
In both cases, the working tree is updated and uncommitted changes
5454
are merged. The user can commit or revert these as they desire.
5456
Pending merges need to be committed or reverted before using switch.
5458
The path to the branch to switch to can be specified relative to the parent
5459
directory of the current branch. For example, if you are currently in a
5460
checkout of /path/to/branch, specifying 'newbranch' will find a branch at
5463
Bound branches use the nickname of its master branch unless it is set
5464
locally, in which case switching will update the local nickname to be
5468
takes_args = ['to_location?']
5469
takes_options = [Option('force',
5470
help='Switch even if local commits will be lost.'),
5472
Option('create-branch', short_name='b',
5473
help='Create the target branch from this one before'
5474
' switching to it.'),
5477
def run(self, to_location=None, force=False, create_branch=False,
5479
from bzrlib import switch
5481
revision = _get_one_revision('switch', revision)
5482
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5483
if to_location is None:
5484
if revision is None:
5485
raise errors.BzrCommandError('You must supply either a'
5486
' revision or a location')
5489
branch = control_dir.open_branch()
5490
had_explicit_nick = branch.get_config().has_explicit_nickname()
5491
except errors.NotBranchError:
5493
had_explicit_nick = False
5496
raise errors.BzrCommandError('cannot create branch without'
5498
to_location = directory_service.directories.dereference(
5500
if '/' not in to_location and '\\' not in to_location:
5501
# This path is meant to be relative to the existing branch
5502
this_url = self._get_branch_location(control_dir)
5503
to_location = urlutils.join(this_url, '..', to_location)
5504
to_branch = branch.bzrdir.sprout(to_location,
5505
possible_transports=[branch.bzrdir.root_transport],
5506
source_branch=branch).open_branch()
5509
to_branch = Branch.open(to_location)
5510
except errors.NotBranchError:
5511
this_url = self._get_branch_location(control_dir)
5512
to_branch = Branch.open(
5513
urlutils.join(this_url, '..', to_location))
5514
if revision is not None:
5515
revision = revision.as_revision_id(to_branch)
5516
switch.switch(control_dir, to_branch, force, revision_id=revision)
5517
if had_explicit_nick:
5518
branch = control_dir.open_branch() #get the new branch!
5519
branch.nick = to_branch.nick
5520
note('Switched to branch: %s',
5521
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5523
def _get_branch_location(self, control_dir):
5524
"""Return location of branch for this control dir."""
5526
this_branch = control_dir.open_branch()
5527
# This may be a heavy checkout, where we want the master branch
5528
master_location = this_branch.get_bound_location()
5529
if master_location is not None:
5530
return master_location
5531
# If not, use a local sibling
5532
return this_branch.base
5533
except errors.NotBranchError:
5534
format = control_dir.find_branch_format()
5535
if getattr(format, 'get_reference', None) is not None:
5536
return format.get_reference(control_dir)
5538
return control_dir.root_transport.base
5541
class cmd_view(Command):
5542
"""Manage filtered views.
5544
Views provide a mask over the tree so that users can focus on
5545
a subset of a tree when doing their work. After creating a view,
5546
commands that support a list of files - status, diff, commit, etc -
5547
effectively have that list of files implicitly given each time.
5548
An explicit list of files can still be given but those files
5549
must be within the current view.
5551
In most cases, a view has a short life-span: it is created to make
5552
a selected change and is deleted once that change is committed.
5553
At other times, you may wish to create one or more named views
5554
and switch between them.
5556
To disable the current view without deleting it, you can switch to
5557
the pseudo view called ``off``. This can be useful when you need
5558
to see the whole tree for an operation or two (e.g. merge) but
5559
want to switch back to your view after that.
5562
To define the current view::
5564
bzr view file1 dir1 ...
5566
To list the current view::
5570
To delete the current view::
5574
To disable the current view without deleting it::
5576
bzr view --switch off
5578
To define a named view and switch to it::
5580
bzr view --name view-name file1 dir1 ...
5582
To list a named view::
5584
bzr view --name view-name
5586
To delete a named view::
5588
bzr view --name view-name --delete
5590
To switch to a named view::
5592
bzr view --switch view-name
5594
To list all views defined::
5598
To delete all views::
5600
bzr view --delete --all
5604
takes_args = ['file*']
5607
help='Apply list or delete action to all views.',
5610
help='Delete the view.',
5613
help='Name of the view to define, list or delete.',
5617
help='Name of the view to switch to.',
5622
def run(self, file_list,
5628
tree, file_list = tree_files(file_list, apply_view=False)
5629
current_view, view_dict = tree.views.get_view_info()
5634
raise errors.BzrCommandError(
5635
"Both --delete and a file list specified")
5637
raise errors.BzrCommandError(
5638
"Both --delete and --switch specified")
5640
tree.views.set_view_info(None, {})
5641
self.outf.write("Deleted all views.\n")
5643
raise errors.BzrCommandError("No current view to delete")
5645
tree.views.delete_view(name)
5646
self.outf.write("Deleted '%s' view.\n" % name)
5649
raise errors.BzrCommandError(
5650
"Both --switch and a file list specified")
5652
raise errors.BzrCommandError(
5653
"Both --switch and --all specified")
5654
elif switch == 'off':
5655
if current_view is None:
5656
raise errors.BzrCommandError("No current view to disable")
5657
tree.views.set_view_info(None, view_dict)
5658
self.outf.write("Disabled '%s' view.\n" % (current_view))
5660
tree.views.set_view_info(switch, view_dict)
5661
view_str = views.view_display_str(tree.views.lookup_view())
5662
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
5665
self.outf.write('Views defined:\n')
5666
for view in sorted(view_dict):
5667
if view == current_view:
5671
view_str = views.view_display_str(view_dict[view])
5672
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5674
self.outf.write('No views defined.\n')
5677
# No name given and no current view set
5680
raise errors.BzrCommandError(
5681
"Cannot change the 'off' pseudo view")
5682
tree.views.set_view(name, sorted(file_list))
5683
view_str = views.view_display_str(tree.views.lookup_view())
5684
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
5688
# No name given and no current view set
5689
self.outf.write('No current view.\n')
5691
view_str = views.view_display_str(tree.views.lookup_view(name))
5692
self.outf.write("'%s' view is: %s\n" % (name, view_str))
5695
class cmd_hooks(Command):
5701
for hook_key in sorted(hooks.known_hooks.keys()):
5702
some_hooks = hooks.known_hooks_key_to_object(hook_key)
5703
self.outf.write("%s:\n" % type(some_hooks).__name__)
5704
for hook_name, hook_point in sorted(some_hooks.items()):
5705
self.outf.write(" %s:\n" % (hook_name,))
5706
found_hooks = list(hook_point)
5708
for hook in found_hooks:
5709
self.outf.write(" %s\n" %
5710
(some_hooks.get_hook_name(hook),))
5712
self.outf.write(" <no hooks installed>\n")
5715
class cmd_shelve(Command):
5716
"""Temporarily set aside some changes from the current tree.
5718
Shelve allows you to temporarily put changes you've made "on the shelf",
5719
ie. out of the way, until a later time when you can bring them back from
5720
the shelf with the 'unshelve' command. The changes are stored alongside
5721
your working tree, and so they aren't propagated along with your branch nor
5722
will they survive its deletion.
5724
If shelve --list is specified, previously-shelved changes are listed.
5726
Shelve is intended to help separate several sets of changes that have
5727
been inappropriately mingled. If you just want to get rid of all changes
5728
and you don't need to restore them later, use revert. If you want to
5729
shelve all text changes at once, use shelve --all.
5731
If filenames are specified, only the changes to those files will be
5732
shelved. Other files will be left untouched.
5734
If a revision is specified, changes since that revision will be shelved.
5736
You can put multiple items on the shelf, and by default, 'unshelve' will
5737
restore the most recently shelved changes.
5740
takes_args = ['file*']
5744
Option('all', help='Shelve all changes.'),
5746
RegistryOption('writer', 'Method to use for writing diffs.',
5747
bzrlib.option.diff_writer_registry,
5748
value_switches=True, enum_switch=False),
5750
Option('list', help='List shelved changes.'),
5752
help='Destroy removed changes instead of shelving them.'),
5754
_see_also = ['unshelve']
5756
def run(self, revision=None, all=False, file_list=None, message=None,
5757
writer=None, list=False, destroy=False):
5759
return self.run_for_list()
5760
from bzrlib.shelf_ui import Shelver
5762
writer = bzrlib.option.diff_writer_registry.get()
5764
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
5765
file_list, message, destroy=destroy)
5770
except errors.UserAbort:
5773
def run_for_list(self):
5774
tree = WorkingTree.open_containing('.')[0]
5776
self.add_cleanup(tree.unlock)
5777
manager = tree.get_shelf_manager()
5778
shelves = manager.active_shelves()
5779
if len(shelves) == 0:
5780
note('No shelved changes.')
5782
for shelf_id in reversed(shelves):
5783
message = manager.get_metadata(shelf_id).get('message')
5785
message = '<no message>'
5786
self.outf.write('%3d: %s\n' % (shelf_id, message))
5790
class cmd_unshelve(Command):
5791
"""Restore shelved changes.
5793
By default, the most recently shelved changes are restored. However if you
5794
specify a shelf by id those changes will be restored instead. This works
5795
best when the changes don't depend on each other.
5798
takes_args = ['shelf_id?']
5800
RegistryOption.from_kwargs(
5801
'action', help="The action to perform.",
5802
enum_switch=False, value_switches=True,
5803
apply="Apply changes and remove from the shelf.",
5804
dry_run="Show changes, but do not apply or remove them.",
5805
preview="Instead of unshelving the changes, show the diff that "
5806
"would result from unshelving.",
5807
delete_only="Delete changes without applying them.",
5808
keep="Apply changes but don't delete them.",
5811
_see_also = ['shelve']
5813
def run(self, shelf_id=None, action='apply'):
5814
from bzrlib.shelf_ui import Unshelver
5815
unshelver = Unshelver.from_args(shelf_id, action)
5819
unshelver.tree.unlock()
5822
class cmd_clean_tree(Command):
5823
"""Remove unwanted files from working tree.
5825
By default, only unknown files, not ignored files, are deleted. Versioned
5826
files are never deleted.
5828
Another class is 'detritus', which includes files emitted by bzr during
5829
normal operations and selftests. (The value of these files decreases with
5832
If no options are specified, unknown files are deleted. Otherwise, option
5833
flags are respected, and may be combined.
5835
To check what clean-tree will do, use --dry-run.
5837
takes_options = [Option('ignored', help='Delete all ignored files.'),
5838
Option('detritus', help='Delete conflict files, merge'
5839
' backups, and failed selftest dirs.'),
5841
help='Delete files unknown to bzr (default).'),
5842
Option('dry-run', help='Show files to delete instead of'
5844
Option('force', help='Do not prompt before deleting.')]
5845
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
5847
from bzrlib.clean_tree import clean_tree
5848
if not (unknown or ignored or detritus):
5852
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
5853
dry_run=dry_run, no_prompt=force)
5856
class cmd_reference(Command):
5857
"""list, view and set branch locations for nested trees.
5859
If no arguments are provided, lists the branch locations for nested trees.
5860
If one argument is provided, display the branch location for that tree.
5861
If two arguments are provided, set the branch location for that tree.
5866
takes_args = ['path?', 'location?']
5868
def run(self, path=None, location=None):
5870
if path is not None:
5872
tree, branch, relpath =(
5873
bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
5874
if path is not None:
5877
tree = branch.basis_tree()
5879
info = branch._get_all_reference_info().iteritems()
5880
self._display_reference_info(tree, branch, info)
5882
file_id = tree.path2id(path)
5884
raise errors.NotVersionedError(path)
5885
if location is None:
5886
info = [(file_id, branch.get_reference_info(file_id))]
5887
self._display_reference_info(tree, branch, info)
5889
branch.set_reference_info(file_id, path, location)
5891
def _display_reference_info(self, tree, branch, info):
5893
for file_id, (path, location) in info:
5895
path = tree.id2path(file_id)
5896
except errors.NoSuchId:
5898
ref_list.append((path, location))
5899
for path, location in sorted(ref_list):
5900
self.outf.write('%s %s\n' % (path, location))
2725
# command-line interpretation helper for merge-related commands
2726
def merge(other_revision, base_revision,
2727
check_clean=True, ignore_zero=False,
2728
this_dir=None, backup_files=False, merge_type=Merge3Merger,
2729
file_list=None, show_base=False, reprocess=False,
2730
pb=DummyProgress()):
2731
"""Merge changes into a tree.
2734
list(path, revno) Base for three-way merge.
2735
If [None, None] then a base will be automatically determined.
2737
list(path, revno) Other revision for three-way merge.
2739
Directory to merge changes into; '.' by default.
2741
If true, this_dir must have no uncommitted changes before the
2743
ignore_zero - If true, suppress the "zero conflicts" message when
2744
there are no conflicts; should be set when doing something we expect
2745
to complete perfectly.
2746
file_list - If supplied, merge only changes to selected files.
2748
All available ancestors of other_revision and base_revision are
2749
automatically pulled into the branch.
2751
The revno may be -1 to indicate the last revision on the branch, which is
2754
This function is intended for use from the command line; programmatic
2755
clients might prefer to call merge.merge_inner(), which has less magic
2758
from bzrlib.merge import Merger
2759
if this_dir is None:
2761
this_tree = WorkingTree.open_containing(this_dir)[0]
2762
if show_base and not merge_type is Merge3Merger:
2763
raise BzrCommandError("Show-base is not supported for this merge"
2764
" type. %s" % merge_type)
2765
if reprocess and not merge_type.supports_reprocess:
2766
raise BzrCommandError("Conflict reduction is not supported for merge"
2767
" type %s." % merge_type)
2768
if reprocess and show_base:
2769
raise BzrCommandError("Cannot do conflict reduction and show base.")
2771
merger = Merger(this_tree.branch, this_tree=this_tree, pb=pb)
2772
merger.pp = ProgressPhase("Merge phase", 5, pb)
2773
merger.pp.next_phase()
2774
merger.check_basis(check_clean)
2775
merger.set_other(other_revision)
2776
merger.pp.next_phase()
2777
merger.set_base(base_revision)
2778
if merger.base_rev_id == merger.other_rev_id:
2779
note('Nothing to do.')
2781
merger.backup_files = backup_files
2782
merger.merge_type = merge_type
2783
merger.set_interesting_files(file_list)
2784
merger.show_base = show_base
2785
merger.reprocess = reprocess
2786
conflicts = merger.do_merge()
2787
if file_list is None:
2788
merger.set_pending()
5903
2794
# these get imported and then picked up by the scan for cmd_*
5904
2795
# TODO: Some more consistent way to split command definitions across files;
5905
# we do need to load at least some information about them to know of
2796
# we do need to load at least some information about them to know of
5906
2797
# aliases. ideally we would avoid loading the implementation until the
5907
2798
# details were needed.
5908
from bzrlib.cmd_version_info import cmd_version_info
5909
2799
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
5910
from bzrlib.bundle.commands import (
5913
from bzrlib.foreign import cmd_dpush
2800
from bzrlib.bundle.commands import cmd_bundle_revisions
5914
2801
from bzrlib.sign_my_commits import cmd_sign_my_commits
5915
from bzrlib.weave_commands import cmd_versionedfile_list, \
2802
from bzrlib.weave_commands import cmd_weave_list, cmd_weave_join, \
5916
2803
cmd_weave_plan_merge, cmd_weave_merge_text