123
203
# opens the branch?)
125
205
class cmd_status(Command):
126
"""Display status summary.
206
__doc__ = """Display status summary.
128
208
This reports on versioned and unknown files, reporting them
129
209
grouped by state. Possible states are:
132
212
Versioned in the working copy but not in the previous revision.
135
215
Versioned in the previous revision but removed or deleted
136
216
in the working copy.
139
219
Path of this file changed from the previous revision;
140
220
the text may also have changed. This includes files whose
141
221
parent directory was renamed.
144
224
Text has changed since the previous revision.
227
File kind has been changed (e.g. from file to directory).
147
230
Not versioned and not matching an ignore pattern.
149
To see ignored files use 'bzr ignored'. For details in the
232
Additionally for directories, symlinks and files with an executable
233
bit, Bazaar indicates their type using a trailing character: '/', '@'
236
To see ignored files use 'bzr ignored'. For details on the
150
237
changes to file texts, use 'bzr diff'.
152
--short gives a one character status flag for each item, similar
153
to the SVN's status command.
239
Note that --short or -S gives status flags for each item, similar
240
to Subversion's status command. To get output similar to svn -q,
155
243
If no arguments are specified, the status of the entire working
156
244
directory is shown. Otherwise, only the status of the specified
157
245
files or directories is reported. If a directory is given, status
158
246
is reported for everything inside that directory.
160
If a revision argument is given, the status is calculated against
161
that revision, or between two revisions if two are provided.
248
Before merges are committed, the pending merge tip revisions are
249
shown. To see all pending merge revisions, use the -v option.
250
To skip the display of pending merge information altogether, use
251
the no-pending option or specify a file/directory.
253
To compare the working directory to a specific revision, pass a
254
single revision to the revision argument.
256
To see which files have changed in a specific revision, or between
257
two revisions, pass a revision range to the revision argument.
258
This will produce the same results as calling 'bzr diff --summarize'.
164
261
# TODO: --no-recurse, --recurse options
166
263
takes_args = ['file*']
167
takes_options = ['show-ids', 'revision', 'short']
264
takes_options = ['show-ids', 'revision', 'change', 'verbose',
265
Option('short', help='Use short status indicators.',
267
Option('versioned', help='Only show versioned files.',
269
Option('no-pending', help='Don\'t show pending merges.',
168
272
aliases = ['st', 'stat']
170
274
encoding_type = 'replace'
275
_see_also = ['diff', 'revert', 'status-flags']
173
def run(self, show_ids=False, file_list=None, revision=None, short=False):
278
def run(self, show_ids=False, file_list=None, revision=None, short=False,
279
versioned=False, no_pending=False, verbose=False):
174
280
from bzrlib.status import show_tree_status
176
tree, file_list = tree_files(file_list)
282
if revision and len(revision) > 2:
283
raise errors.BzrCommandError('bzr status --revision takes exactly'
284
' one or two revision specifiers')
286
tree, relfile_list = WorkingTree.open_containing_paths(file_list)
287
# Avoid asking for specific files when that is not needed.
288
if relfile_list == ['']:
290
# Don't disable pending merges for full trees other than '.'.
291
if file_list == ['.']:
293
# A specific path within a tree was given.
294
elif relfile_list is not None:
178
296
show_tree_status(tree, show_ids=show_ids,
179
specific_files=file_list, revision=revision,
297
specific_files=relfile_list, revision=revision,
298
to_file=self.outf, short=short, versioned=versioned,
299
show_pending=(not no_pending), verbose=verbose)
184
302
class cmd_cat_revision(Command):
185
"""Write out metadata for a revision.
303
__doc__ = """Write out metadata for a revision.
187
305
The revision to print can either be specified by a specific
188
306
revision identifier, or you can use --revision.
192
310
takes_args = ['revision_id?']
193
takes_options = ['revision']
311
takes_options = ['directory', 'revision']
194
312
# cat-revision is more for frontends so should be exact
195
313
encoding = 'strict'
315
def print_revision(self, revisions, revid):
316
stream = revisions.get_record_stream([(revid,)], 'unordered', True)
317
record = stream.next()
318
if record.storage_kind == 'absent':
319
raise errors.NoSuchRevision(revisions, revid)
320
revtext = record.get_bytes_as('fulltext')
321
self.outf.write(revtext.decode('utf-8'))
198
def run(self, revision_id=None, revision=None):
324
def run(self, revision_id=None, revision=None, directory=u'.'):
200
325
if revision_id is not None and revision is not None:
201
326
raise errors.BzrCommandError('You can only supply one of'
202
327
' revision_id or --revision')
203
328
if revision_id is None and revision is None:
204
329
raise errors.BzrCommandError('You must supply either'
205
330
' --revision or a revision_id')
206
b = WorkingTree.open_containing(u'.')[0].branch
208
# TODO: jam 20060112 should cat-revision always output utf-8?
209
if revision_id is not None:
210
self.outf.write(b.repository.get_revision_xml(revision_id).decode('utf-8'))
211
elif revision is not None:
214
raise errors.BzrCommandError('You cannot specify a NULL'
216
revno, rev_id = rev.in_history(b)
217
self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
332
b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
334
revisions = b.repository.revisions
335
if revisions is None:
336
raise errors.BzrCommandError('Repository %r does not support '
337
'access to raw revision texts')
339
b.repository.lock_read()
341
# TODO: jam 20060112 should cat-revision always output utf-8?
342
if revision_id is not None:
343
revision_id = osutils.safe_revision_id(revision_id, warn=False)
345
self.print_revision(revisions, revision_id)
346
except errors.NoSuchRevision:
347
msg = "The repository %s contains no revision %s." % (
348
b.repository.base, revision_id)
349
raise errors.BzrCommandError(msg)
350
elif revision is not None:
353
raise errors.BzrCommandError(
354
'You cannot specify a NULL revision.')
355
rev_id = rev.as_revision_id(b)
356
self.print_revision(revisions, rev_id)
358
b.repository.unlock()
361
class cmd_dump_btree(Command):
362
__doc__ = """Dump the contents of a btree index file to stdout.
364
PATH is a btree index file, it can be any URL. This includes things like
365
.bzr/repository/pack-names, or .bzr/repository/indices/a34b3a...ca4a4.iix
367
By default, the tuples stored in the index file will be displayed. With
368
--raw, we will uncompress the pages, but otherwise display the raw bytes
372
# TODO: Do we want to dump the internal nodes as well?
373
# TODO: It would be nice to be able to dump the un-parsed information,
374
# rather than only going through iter_all_entries. However, this is
375
# good enough for a start
377
encoding_type = 'exact'
378
takes_args = ['path']
379
takes_options = [Option('raw', help='Write the uncompressed bytes out,'
380
' rather than the parsed tuples.'),
383
def run(self, path, raw=False):
384
dirname, basename = osutils.split(path)
385
t = transport.get_transport(dirname)
387
self._dump_raw_bytes(t, basename)
389
self._dump_entries(t, basename)
391
def _get_index_and_bytes(self, trans, basename):
392
"""Create a BTreeGraphIndex and raw bytes."""
393
bt = btree_index.BTreeGraphIndex(trans, basename, None)
394
bytes = trans.get_bytes(basename)
395
bt._file = cStringIO.StringIO(bytes)
396
bt._size = len(bytes)
399
def _dump_raw_bytes(self, trans, basename):
402
# We need to parse at least the root node.
403
# This is because the first page of every row starts with an
404
# uncompressed header.
405
bt, bytes = self._get_index_and_bytes(trans, basename)
406
for page_idx, page_start in enumerate(xrange(0, len(bytes),
407
btree_index._PAGE_SIZE)):
408
page_end = min(page_start + btree_index._PAGE_SIZE, len(bytes))
409
page_bytes = bytes[page_start:page_end]
411
self.outf.write('Root node:\n')
412
header_end, data = bt._parse_header_from_bytes(page_bytes)
413
self.outf.write(page_bytes[:header_end])
415
self.outf.write('\nPage %d\n' % (page_idx,))
416
if len(page_bytes) == 0:
417
self.outf.write('(empty)\n');
419
decomp_bytes = zlib.decompress(page_bytes)
420
self.outf.write(decomp_bytes)
421
self.outf.write('\n')
423
def _dump_entries(self, trans, basename):
425
st = trans.stat(basename)
426
except errors.TransportNotPossible:
427
# We can't stat, so we'll fake it because we have to do the 'get()'
429
bt, _ = self._get_index_and_bytes(trans, basename)
431
bt = btree_index.BTreeGraphIndex(trans, basename, st.st_size)
432
for node in bt.iter_all_entries():
433
# Node is made up of:
434
# (index, key, value, [references])
438
refs_as_tuples = None
440
refs_as_tuples = static_tuple.as_tuples(refs)
441
as_tuple = (tuple(node[1]), node[2], refs_as_tuples)
442
self.outf.write('%s\n' % (as_tuple,))
220
445
class cmd_remove_tree(Command):
221
"""Remove the working tree from a given branch/checkout.
446
__doc__ = """Remove the working tree from a given branch/checkout.
223
448
Since a lightweight checkout is little more than a working tree
224
449
this will refuse to run against one.
451
To re-create the working tree, use "bzr checkout".
453
_see_also = ['checkout', 'working-trees']
454
takes_args = ['location*']
457
help='Remove the working tree even if it has '
458
'uncommitted or shelved changes.'),
461
def run(self, location_list, force=False):
462
if not location_list:
465
for location in location_list:
466
d = bzrdir.BzrDir.open(location)
469
working = d.open_workingtree()
470
except errors.NoWorkingTree:
471
raise errors.BzrCommandError("No working tree to remove")
472
except errors.NotLocalUrl:
473
raise errors.BzrCommandError("You cannot remove the working tree"
476
if (working.has_changes()):
477
raise errors.UncommittedChanges(working)
478
if working.get_shelf_manager().last_shelf() is not None:
479
raise errors.ShelvedChanges(working)
481
if working.user_url != working.branch.user_url:
482
raise errors.BzrCommandError("You cannot remove the working tree"
483
" from a lightweight checkout")
485
d.destroy_workingtree()
488
class cmd_repair_workingtree(Command):
489
__doc__ = """Reset the working tree state file.
491
This is not meant to be used normally, but more as a way to recover from
492
filesystem corruption, etc. This rebuilds the working inventory back to a
493
'known good' state. Any new modifications (adding a file, renaming, etc)
494
will be lost, though modified files will still be detected as such.
496
Most users will want something more like "bzr revert" or "bzr update"
497
unless the state file has become corrupted.
499
By default this attempts to recover the current state by looking at the
500
headers of the state file. If the state file is too corrupted to even do
501
that, you can supply --revision to force the state of the tree.
504
takes_options = ['revision', 'directory',
506
help='Reset the tree even if it doesn\'t appear to be'
229
takes_args = ['location?']
231
def run(self, location='.'):
232
d = bzrdir.BzrDir.open(location)
511
def run(self, revision=None, directory='.', force=False):
512
tree, _ = WorkingTree.open_containing(directory)
513
self.add_cleanup(tree.lock_tree_write().unlock)
517
except errors.BzrError:
518
pass # There seems to be a real error here, so we'll reset
521
raise errors.BzrCommandError(
522
'The tree does not appear to be corrupt. You probably'
523
' want "bzr revert" instead. Use "--force" if you are'
524
' sure you want to reset the working tree.')
528
revision_ids = [r.as_revision_id(tree.branch) for r in revision]
235
working = d.open_workingtree()
236
except errors.NoWorkingTree:
237
raise errors.BzrCommandError("No working tree to remove")
238
except errors.NotLocalUrl:
239
raise errors.BzrCommandError("You cannot remove the working tree of a "
242
working_path = working.bzrdir.root_transport.base
243
branch_path = working.branch.bzrdir.root_transport.base
244
if working_path != branch_path:
245
raise errors.BzrCommandError("You cannot remove the working tree from "
246
"a lightweight checkout")
248
d.destroy_workingtree()
530
tree.reset_state(revision_ids)
531
except errors.BzrError, e:
532
if revision_ids is None:
533
extra = (', the header appears corrupt, try passing -r -1'
534
' to set the state to the last commit')
537
raise errors.BzrCommandError('failed to reset the tree state'
251
541
class cmd_revno(Command):
252
"""Show current revision number.
542
__doc__ = """Show current revision number.
254
544
This is equal to the number of revisions on this branch.
257
548
takes_args = ['location?']
550
Option('tree', help='Show revno of working tree'),
260
def run(self, location=u'.'):
261
self.outf.write(str(Branch.open_containing(location)[0].revno()))
262
self.outf.write('\n')
554
def run(self, tree=False, location=u'.'):
557
wt = WorkingTree.open_containing(location)[0]
558
self.add_cleanup(wt.lock_read().unlock)
559
except (errors.NoWorkingTree, errors.NotLocalUrl):
560
raise errors.NoWorkingTree(location)
561
revid = wt.last_revision()
563
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
564
except errors.NoSuchRevision:
566
revno = ".".join(str(n) for n in revno_t)
568
b = Branch.open_containing(location)[0]
569
self.add_cleanup(b.lock_read().unlock)
572
self.outf.write(str(revno) + '\n')
265
575
class cmd_revision_info(Command):
266
"""Show revision number and revision id for a given revision identifier.
576
__doc__ = """Show revision number and revision id for a given revision identifier.
269
579
takes_args = ['revision_info*']
270
takes_options = ['revision']
582
custom_help('directory',
583
help='Branch to examine, '
584
'rather than the one containing the working directory.'),
585
Option('tree', help='Show revno of working tree'),
273
def run(self, revision=None, revision_info_list=[]):
589
def run(self, revision=None, directory=u'.', tree=False,
590
revision_info_list=[]):
593
wt = WorkingTree.open_containing(directory)[0]
595
self.add_cleanup(wt.lock_read().unlock)
596
except (errors.NoWorkingTree, errors.NotLocalUrl):
598
b = Branch.open_containing(directory)[0]
599
self.add_cleanup(b.lock_read().unlock)
276
601
if revision is not None:
277
revs.extend(revision)
602
revision_ids.extend(rev.as_revision_id(b) for rev in revision)
278
603
if revision_info_list is not None:
279
for rev in revision_info_list:
280
revs.append(RevisionSpec.from_string(rev))
282
raise errors.BzrCommandError('You must supply a revision identifier')
284
b = WorkingTree.open_containing(u'.')[0].branch
287
revinfo = rev.in_history(b)
288
if revinfo.revno is None:
289
print ' %s' % revinfo.rev_id
604
for rev_str in revision_info_list:
605
rev_spec = RevisionSpec.from_string(rev_str)
606
revision_ids.append(rev_spec.as_revision_id(b))
607
# No arguments supplied, default to the last revision
608
if len(revision_ids) == 0:
611
raise errors.NoWorkingTree(directory)
612
revision_ids.append(wt.last_revision())
291
print '%4d %s' % (revinfo.revno, revinfo.rev_id)
614
revision_ids.append(b.last_revision())
618
for revision_id in revision_ids:
620
dotted_revno = b.revision_id_to_dotted_revno(revision_id)
621
revno = '.'.join(str(i) for i in dotted_revno)
622
except errors.NoSuchRevision:
624
maxlen = max(maxlen, len(revno))
625
revinfos.append([revno, revision_id])
629
self.outf.write('%*s %s\n' % (maxlen, ri[0], ri[1]))
294
632
class cmd_add(Command):
295
"""Add specified files or directories.
633
__doc__ = """Add specified files or directories.
297
635
In non-recursive mode, all the named items are added, regardless
298
636
of whether they were previously ignored. A warning is given if
454
813
class cmd_mv(Command):
455
"""Move or rename a file.
814
__doc__ = """Move or rename a file.
458
817
bzr mv OLDNAME NEWNAME
459
819
bzr mv SOURCE... DESTINATION
461
821
If the last argument is a versioned directory, all the other names
462
822
are moved into it. Otherwise, there must be exactly two arguments
463
and the file is changed to a new name, which must not already exist.
823
and the file is changed to a new name.
825
If OLDNAME does not exist on the filesystem but is versioned and
826
NEWNAME does exist on the filesystem but is not versioned, mv
827
assumes that the file has been manually moved and only updates
828
its internal inventory to reflect that change.
829
The same is valid when moving many SOURCE files to a DESTINATION.
465
831
Files cannot be moved between branches.
468
834
takes_args = ['names*']
835
takes_options = [Option("after", help="Move only the bzr identifier"
836
" of the file, because the file has already been moved."),
837
Option('auto', help='Automatically guess renames.'),
838
Option('dry-run', help='Avoid making changes when guessing renames.'),
469
840
aliases = ['move', 'rename']
470
841
encoding_type = 'replace'
472
def run(self, names_list):
843
def run(self, names_list, after=False, auto=False, dry_run=False):
845
return self.run_auto(names_list, after, dry_run)
847
raise errors.BzrCommandError('--dry-run requires --auto.')
473
848
if names_list is None:
476
850
if len(names_list) < 2:
477
851
raise errors.BzrCommandError("missing file argument")
478
tree, rel_names = tree_files(names_list)
480
if os.path.isdir(names_list[-1]):
852
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
853
self.add_cleanup(tree.lock_tree_write().unlock)
854
self._run(tree, names_list, rel_names, after)
856
def run_auto(self, names_list, after, dry_run):
857
if names_list is not None and len(names_list) > 1:
858
raise errors.BzrCommandError('Only one path may be specified to'
861
raise errors.BzrCommandError('--after cannot be specified with'
863
work_tree, file_list = WorkingTree.open_containing_paths(
864
names_list, default_directory='.')
865
self.add_cleanup(work_tree.lock_tree_write().unlock)
866
rename_map.RenameMap.guess_renames(work_tree, dry_run)
868
def _run(self, tree, names_list, rel_names, after):
869
into_existing = osutils.isdir(names_list[-1])
870
if into_existing and len(names_list) == 2:
872
# a. case-insensitive filesystem and change case of dir
873
# b. move directory after the fact (if the source used to be
874
# a directory, but now doesn't exist in the working tree
875
# and the target is an existing directory, just rename it)
876
if (not tree.case_sensitive
877
and rel_names[0].lower() == rel_names[1].lower()):
878
into_existing = False
881
# 'fix' the case of a potential 'from'
882
from_id = tree.path2id(
883
tree.get_canonical_inventory_path(rel_names[0]))
884
if (not osutils.lexists(names_list[0]) and
885
from_id and inv.get_file_kind(from_id) == "directory"):
886
into_existing = False
481
889
# move into existing directory
482
for pair in tree.move(rel_names[:-1], rel_names[-1]):
483
self.outf.write("%s => %s\n" % pair)
890
# All entries reference existing inventory items, so fix them up
891
# for cicp file-systems.
892
rel_names = tree.get_canonical_inventory_paths(rel_names)
893
for src, dest in tree.move(rel_names[:-1], rel_names[-1], after=after):
895
self.outf.write("%s => %s\n" % (src, dest))
485
897
if len(names_list) != 2:
486
raise errors.BzrCommandError('to mv multiple files the destination '
487
'must be a versioned directory')
488
tree.rename_one(rel_names[0], rel_names[1])
489
self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1]))
898
raise errors.BzrCommandError('to mv multiple files the'
899
' destination must be a versioned'
902
# for cicp file-systems: the src references an existing inventory
904
src = tree.get_canonical_inventory_path(rel_names[0])
905
# Find the canonical version of the destination: In all cases, the
906
# parent of the target must be in the inventory, so we fetch the
907
# canonical version from there (we do not always *use* the
908
# canonicalized tail portion - we may be attempting to rename the
910
canon_dest = tree.get_canonical_inventory_path(rel_names[1])
911
dest_parent = osutils.dirname(canon_dest)
912
spec_tail = osutils.basename(rel_names[1])
913
# For a CICP file-system, we need to avoid creating 2 inventory
914
# entries that differ only by case. So regardless of the case
915
# we *want* to use (ie, specified by the user or the file-system),
916
# we must always choose to use the case of any existing inventory
917
# items. The only exception to this is when we are attempting a
918
# case-only rename (ie, canonical versions of src and dest are
920
dest_id = tree.path2id(canon_dest)
921
if dest_id is None or tree.path2id(src) == dest_id:
922
# No existing item we care about, so work out what case we
923
# are actually going to use.
925
# If 'after' is specified, the tail must refer to a file on disk.
927
dest_parent_fq = osutils.pathjoin(tree.basedir, dest_parent)
929
# pathjoin with an empty tail adds a slash, which breaks
931
dest_parent_fq = tree.basedir
933
dest_tail = osutils.canonical_relpath(
935
osutils.pathjoin(dest_parent_fq, spec_tail))
937
# not 'after', so case as specified is used
938
dest_tail = spec_tail
940
# Use the existing item so 'mv' fails with AlreadyVersioned.
941
dest_tail = os.path.basename(canon_dest)
942
dest = osutils.pathjoin(dest_parent, dest_tail)
943
mutter("attempting to move %s => %s", src, dest)
944
tree.rename_one(src, dest, after=after)
946
self.outf.write("%s => %s\n" % (src, dest))
492
949
class cmd_pull(Command):
493
"""Turn this branch into a mirror of another branch.
950
__doc__ = """Turn this branch into a mirror of another branch.
495
This command only works on branches that have not diverged. Branches are
496
considered diverged if the destination branch's most recent commit is one
497
that has not been merged (directly or indirectly) into the parent.
952
By default, this command only works on branches that have not diverged.
953
Branches are considered diverged if the destination branch's most recent
954
commit is one that has not been merged (directly or indirectly) into the
499
957
If branches have diverged, you can use 'bzr merge' to integrate the changes
500
958
from one into the other. Once one branch has merged, the other should
501
959
be able to pull it again.
503
If you want to forget your local changes and just update your branch to
504
match the remote one, use pull --overwrite.
961
If you want to replace your local changes and just want your branch to
962
match the remote one, use pull --overwrite. This will work even if the two
963
branches have diverged.
506
965
If there is no default location set, the first pull will set it. After
507
966
that, you can omit the location to use the default. To change the
508
967
default, use --remember. The value will only be saved if the remote
509
968
location can be accessed.
970
Note: The location can be specified either in the form of a branch,
971
or in the form of a path to a file containing a merge directive generated
512
takes_options = ['remember', 'overwrite', 'revision', 'verbose']
975
_see_also = ['push', 'update', 'status-flags', 'send']
976
takes_options = ['remember', 'overwrite', 'revision',
977
custom_help('verbose',
978
help='Show logs of pulled revisions.'),
979
custom_help('directory',
980
help='Branch to pull into, '
981
'rather than the one containing the working directory.'),
983
help="Perform a local pull in a bound "
984
"branch. Local pulls are not applied to "
988
help="Show base revision text in conflicts.")
513
990
takes_args = ['location?']
514
991
encoding_type = 'replace'
516
def run(self, location=None, remember=False, overwrite=False, revision=None, verbose=False):
993
def run(self, location=None, remember=False, overwrite=False,
994
revision=None, verbose=False,
995
directory=None, local=False,
517
997
# FIXME: too much stuff is in the command class
1000
if directory is None:
519
tree_to = WorkingTree.open_containing(u'.')[0]
1003
tree_to = WorkingTree.open_containing(directory)[0]
520
1004
branch_to = tree_to.branch
1005
self.add_cleanup(tree_to.lock_write().unlock)
521
1006
except errors.NoWorkingTree:
523
branch_to = Branch.open_containing(u'.')[0]
1008
branch_to = Branch.open_containing(directory)[0]
1009
self.add_cleanup(branch_to.lock_write().unlock)
1011
if tree_to is None and show_base:
1012
raise errors.BzrCommandError("Need working tree for --show-base.")
1014
if local and not branch_to.get_bound_location():
1015
raise errors.LocalRequiresBoundBranch()
1017
possible_transports = []
526
1018
if location is not None:
528
reader = bundle.read_bundle_from_url(location)
1020
mergeable = bundle.read_mergeable_from_url(location,
1021
possible_transports=possible_transports)
529
1022
except errors.NotABundle:
530
pass # Continue on considering this url a Branch
532
1025
stored_loc = branch_to.get_parent()
533
1026
if location is None:
601
1104
location can be accessed.
604
takes_options = ['remember', 'overwrite', 'verbose',
605
Option('create-prefix',
606
help='Create the path leading up to the branch '
607
'if it does not already exist')]
1107
_see_also = ['pull', 'update', 'working-trees']
1108
takes_options = ['remember', 'overwrite', 'verbose', 'revision',
1109
Option('create-prefix',
1110
help='Create the path leading up to the branch '
1111
'if it does not already exist.'),
1112
custom_help('directory',
1113
help='Branch to push from, '
1114
'rather than the one containing the working directory.'),
1115
Option('use-existing-dir',
1116
help='By default push will fail if the target'
1117
' directory exists, but does not already'
1118
' have a control directory. This flag will'
1119
' allow push to proceed.'),
1121
help='Create a stacked branch that references the public location '
1122
'of the parent branch.'),
1123
Option('stacked-on',
1124
help='Create a stacked branch that refers to another branch '
1125
'for the commit history. Only the work not present in the '
1126
'referenced branch is included in the branch created.',
1129
help='Refuse to push if there are uncommitted changes in'
1130
' the working tree, --no-strict disables the check.'),
1132
help="Don't populate the working tree, even for protocols"
1133
" that support it."),
608
1135
takes_args = ['location?']
609
1136
encoding_type = 'replace'
611
1138
def run(self, location=None, remember=False, overwrite=False,
612
create_prefix=False, verbose=False):
613
# FIXME: Way too big! Put this into a function called from the
616
br_from = Branch.open_containing('.')[0]
617
stored_loc = br_from.get_push_location()
1139
create_prefix=False, verbose=False, revision=None,
1140
use_existing_dir=False, directory=None, stacked_on=None,
1141
stacked=False, strict=None, no_tree=False):
1142
from bzrlib.push import _show_push_branch
1144
if directory is None:
1146
# Get the source branch
1148
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1149
# Get the tip's revision_id
1150
revision = _get_one_revision('push', revision)
1151
if revision is not None:
1152
revision_id = revision.in_history(br_from).rev_id
1155
if tree is not None and revision_id is None:
1156
tree.check_changed_or_out_of_date(
1157
strict, 'push_strict',
1158
more_error='Use --no-strict to force the push.',
1159
more_warning='Uncommitted changes will not be pushed.')
1160
# Get the stacked_on branch, if any
1161
if stacked_on is not None:
1162
stacked_on = urlutils.normalize_url(stacked_on)
1164
parent_url = br_from.get_parent()
1166
parent = Branch.open(parent_url)
1167
stacked_on = parent.get_public_branch()
1169
# I considered excluding non-http url's here, thus forcing
1170
# 'public' branches only, but that only works for some
1171
# users, so it's best to just depend on the user spotting an
1172
# error by the feedback given to them. RBC 20080227.
1173
stacked_on = parent_url
1175
raise errors.BzrCommandError(
1176
"Could not determine branch to refer to.")
1178
# Get the destination location
618
1179
if location is None:
1180
stored_loc = br_from.get_push_location()
619
1181
if stored_loc is None:
620
raise errors.BzrCommandError("No push location known or specified.")
1182
raise errors.BzrCommandError(
1183
"No push location known or specified.")
622
1185
display_url = urlutils.unescape_for_display(stored_loc,
623
1186
self.outf.encoding)
624
self.outf.write("Using saved location: %s\n" % display_url)
1187
self.outf.write("Using saved push location: %s\n" % display_url)
625
1188
location = stored_loc
627
to_transport = transport.get_transport(location)
628
location_url = to_transport.base
632
dir_to = bzrdir.BzrDir.open(location_url)
633
br_to = dir_to.open_branch()
634
except errors.NotBranchError:
636
to_transport = to_transport.clone('..')
637
if not create_prefix:
639
relurl = to_transport.relpath(location_url)
640
mutter('creating directory %s => %s', location_url, relurl)
641
to_transport.mkdir(relurl)
642
except errors.NoSuchFile:
643
raise errors.BzrCommandError("Parent directory of %s "
644
"does not exist." % location)
646
current = to_transport.base
647
needed = [(to_transport, to_transport.relpath(location_url))]
650
to_transport, relpath = needed[-1]
651
to_transport.mkdir(relpath)
653
except errors.NoSuchFile:
654
new_transport = to_transport.clone('..')
655
needed.append((new_transport,
656
new_transport.relpath(to_transport.base)))
657
if new_transport.base == to_transport.base:
658
raise errors.BzrCommandError("Could not create "
660
dir_to = br_from.bzrdir.clone(location_url,
661
revision_id=br_from.last_revision())
662
br_to = dir_to.open_branch()
663
count = len(br_to.revision_history())
664
# We successfully created the target, remember it
665
if br_from.get_push_location() is None or remember:
666
br_from.set_push_location(br_to.base)
668
# We were able to connect to the remote location, so remember it
669
# we don't need to successfully push because of possible divergence.
670
if br_from.get_push_location() is None or remember:
671
br_from.set_push_location(br_to.base)
672
old_rh = br_to.revision_history()
675
tree_to = dir_to.open_workingtree()
676
except errors.NotLocalUrl:
677
warning('This transport does not update the working '
678
'tree of: %s' % (br_to.base,))
679
count = br_to.pull(br_from, overwrite)
680
except errors.NoWorkingTree:
681
count = br_to.pull(br_from, overwrite)
683
count = tree_to.pull(br_from, overwrite)
684
except errors.DivergedBranches:
685
raise errors.BzrCommandError('These branches have diverged.'
686
' Try using "merge" and then "push".')
687
note('%d revision(s) pushed.' % (count,))
690
new_rh = br_to.revision_history()
693
from bzrlib.log import show_changed_revisions
694
show_changed_revisions(br_to, old_rh, new_rh,
1190
_show_push_branch(br_from, revision_id, location, self.outf,
1191
verbose=verbose, overwrite=overwrite, remember=remember,
1192
stacked_on=stacked_on, create_prefix=create_prefix,
1193
use_existing_dir=use_existing_dir, no_tree=no_tree)
698
1196
class cmd_branch(Command):
699
"""Create a new copy of a branch.
1197
__doc__ = """Create a new branch that is a copy of an existing branch.
701
1199
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
702
1200
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1201
If the FROM_LOCATION has no / or path separator embedded, the TO_LOCATION
1202
is derived from the FROM_LOCATION by stripping a leading scheme or drive
1203
identifier, if any. For example, "branch lp:foo-bar" will attempt to
704
1206
To retrieve the branch as of a particular revision, supply the --revision
705
1207
parameter, as in "branch foo/bar -r 5".
707
--basis is to speed up branching from remote branches. When specified, it
708
copies all the file-contents, inventory and revision data from the basis
709
branch before copying anything from the remote branch.
1209
The synonyms 'clone' and 'get' for this command are deprecated.
1212
_see_also = ['checkout']
711
1213
takes_args = ['from_location', 'to_location?']
712
takes_options = ['revision', 'basis']
1214
takes_options = ['revision',
1215
Option('hardlink', help='Hard-link working tree files where possible.'),
1216
Option('files-from', type=str,
1217
help="Get file contents from this tree."),
1219
help="Create a branch without a working-tree."),
1221
help="Switch the checkout in the current directory "
1222
"to the new branch."),
1224
help='Create a stacked branch referring to the source branch. '
1225
'The new branch will depend on the availability of the source '
1226
'branch for all operations.'),
1227
Option('standalone',
1228
help='Do not use a shared repository, even if available.'),
1229
Option('use-existing-dir',
1230
help='By default branch will fail if the target'
1231
' directory exists, but does not already'
1232
' have a control directory. This flag will'
1233
' allow branch to proceed.'),
1235
help="Bind new branch to from location."),
713
1237
aliases = ['get', 'clone']
715
def run(self, from_location, to_location=None, revision=None, basis=None):
718
elif len(revision) > 1:
719
raise errors.BzrCommandError(
720
'bzr branch --revision takes exactly 1 revision value')
722
br_from = Branch.open(from_location)
724
if e.errno == errno.ENOENT:
725
raise errors.BzrCommandError('Source location "%s" does not'
726
' exist.' % to_location)
731
if basis is not None:
732
basis_dir = bzrdir.BzrDir.open_containing(basis)[0]
735
if len(revision) == 1 and revision[0] is not None:
736
revision_id = revision[0].in_history(br_from)[1]
738
# FIXME - wt.last_revision, fallback to branch, fall back to
739
# None or perhaps NULL_REVISION to mean copy nothing
741
revision_id = br_from.last_revision()
742
if to_location is None:
743
to_location = os.path.basename(from_location.rstrip("/\\"))
746
name = os.path.basename(to_location) + '\n'
748
to_transport = transport.get_transport(to_location)
750
to_transport.mkdir('.')
751
except errors.FileExists:
752
raise errors.BzrCommandError('Target directory "%s" already'
753
' exists.' % to_location)
754
except errors.NoSuchFile:
755
raise errors.BzrCommandError('Parent of "%s" does not exist.'
758
# preserve whatever source format we have.
759
dir = br_from.bzrdir.sprout(to_transport.base,
760
revision_id, basis_dir)
761
branch = dir.open_branch()
762
except errors.NoSuchRevision:
763
to_transport.delete_tree('.')
764
msg = "The branch %s has no revision %s." % (from_location, revision[0])
765
raise errors.BzrCommandError(msg)
766
except errors.UnlistableBranch:
767
osutils.rmtree(to_location)
768
msg = "The branch %s cannot be used as a --basis" % (basis,)
769
raise errors.BzrCommandError(msg)
771
branch.control_files.put_utf8('branch-name', name)
1239
def run(self, from_location, to_location=None, revision=None,
1240
hardlink=False, stacked=False, standalone=False, no_tree=False,
1241
use_existing_dir=False, switch=False, bind=False,
1243
from bzrlib import switch as _mod_switch
1244
from bzrlib.tag import _merge_tags_if_possible
1245
if self.invoked_as in ['get', 'clone']:
1246
ui.ui_factory.show_user_warning(
1247
'deprecated_command',
1248
deprecated_name=self.invoked_as,
1249
recommended_name='branch',
1250
deprecated_in_version='2.4')
1251
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1253
if not (hardlink or files_from):
1254
# accelerator_tree is usually slower because you have to read N
1255
# files (no readahead, lots of seeks, etc), but allow the user to
1256
# explicitly request it
1257
accelerator_tree = None
1258
if files_from is not None and files_from != from_location:
1259
accelerator_tree = WorkingTree.open(files_from)
1260
revision = _get_one_revision('branch', revision)
1261
self.add_cleanup(br_from.lock_read().unlock)
1262
if revision is not None:
1263
revision_id = revision.as_revision_id(br_from)
1265
# FIXME - wt.last_revision, fallback to branch, fall back to
1266
# None or perhaps NULL_REVISION to mean copy nothing
1268
revision_id = br_from.last_revision()
1269
if to_location is None:
1270
to_location = urlutils.derive_to_location(from_location)
1271
to_transport = transport.get_transport(to_location)
1273
to_transport.mkdir('.')
1274
except errors.FileExists:
1275
if not use_existing_dir:
1276
raise errors.BzrCommandError('Target directory "%s" '
1277
'already exists.' % to_location)
1280
bzrdir.BzrDir.open_from_transport(to_transport)
1281
except errors.NotBranchError:
1284
raise errors.AlreadyBranchError(to_location)
1285
except errors.NoSuchFile:
1286
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1289
# preserve whatever source format we have.
1290
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1291
possible_transports=[to_transport],
1292
accelerator_tree=accelerator_tree,
1293
hardlink=hardlink, stacked=stacked,
1294
force_new_repo=standalone,
1295
create_tree_if_local=not no_tree,
1296
source_branch=br_from)
1297
branch = dir.open_branch()
1298
except errors.NoSuchRevision:
1299
to_transport.delete_tree('.')
1300
msg = "The branch %s has no revision %s." % (from_location,
1302
raise errors.BzrCommandError(msg)
1303
_merge_tags_if_possible(br_from, branch)
1304
# If the source branch is stacked, the new branch may
1305
# be stacked whether we asked for that explicitly or not.
1306
# We therefore need a try/except here and not just 'if stacked:'
1308
note('Created new stacked branch referring to %s.' %
1309
branch.get_stacked_on_url())
1310
except (errors.NotStacked, errors.UnstackableBranchFormat,
1311
errors.UnstackableRepositoryFormat), e:
772
1312
note('Branched %d revision(s).' % branch.revno())
1314
# Bind to the parent
1315
parent_branch = Branch.open(from_location)
1316
branch.bind(parent_branch)
1317
note('New branch bound to %s' % from_location)
1319
# Switch to the new branch
1320
wt, _ = WorkingTree.open_containing('.')
1321
_mod_switch.switch(wt.bzrdir, branch)
1322
note('Switched to branch: %s',
1323
urlutils.unescape_for_display(branch.base, 'utf-8'))
777
1326
class cmd_checkout(Command):
778
"""Create a new checkout of an existing branch.
1327
__doc__ = """Create a new checkout of an existing branch.
780
1329
If BRANCH_LOCATION is omitted, checkout will reconstitute a working tree for
781
1330
the branch found in '.'. This is useful if you have removed the working tree
782
1331
or if it was never created - i.e. if you pushed the branch to its current
783
1332
location using SFTP.
785
1334
If the TO_LOCATION is omitted, the last component of the BRANCH_LOCATION will
786
1335
be used. In other words, "checkout ../foo/bar" will attempt to create ./bar.
1336
If the BRANCH_LOCATION has no / or path separator embedded, the TO_LOCATION
1337
is derived from the BRANCH_LOCATION by stripping a leading scheme or drive
1338
identifier, if any. For example, "checkout lp:foo-bar" will attempt to
788
1341
To retrieve the branch as of a particular revision, supply the --revision
789
1342
parameter, as in "checkout foo/bar -r 5". Note that this will be immediately
790
1343
out of date [so you cannot commit] but it may be useful (i.e. to examine old
793
--basis is to speed up checking out from remote branches. When specified, it
794
uses the inventory and file contents from the basis branch in preference to the
795
branch being checked out.
1347
_see_also = ['checkouts', 'branch']
797
1348
takes_args = ['branch_location?', 'to_location?']
798
takes_options = ['revision', # , 'basis']
1349
takes_options = ['revision',
799
1350
Option('lightweight',
800
help="perform a lightweight checkout. Lightweight "
1351
help="Perform a lightweight checkout. Lightweight "
801
1352
"checkouts depend on access to the branch for "
802
"every operation. Normal checkouts can perform "
1353
"every operation. Normal checkouts can perform "
803
1354
"common operations like diff and status without "
804
1355
"such access, and also support local commits."
1357
Option('files-from', type=str,
1358
help="Get file contents from this tree."),
1360
help='Hard-link working tree files where possible.'
807
1363
aliases = ['co']
809
def run(self, branch_location=None, to_location=None, revision=None, basis=None,
813
elif len(revision) > 1:
814
raise errors.BzrCommandError(
815
'bzr checkout --revision takes exactly 1 revision value')
1365
def run(self, branch_location=None, to_location=None, revision=None,
1366
lightweight=False, files_from=None, hardlink=False):
816
1367
if branch_location is None:
817
1368
branch_location = osutils.getcwd()
818
1369
to_location = branch_location
819
source = Branch.open(branch_location)
820
if len(revision) == 1 and revision[0] is not None:
821
revision_id = revision[0].in_history(source)[1]
1370
accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch(
1372
if not (hardlink or files_from):
1373
# accelerator_tree is usually slower because you have to read N
1374
# files (no readahead, lots of seeks, etc), but allow the user to
1375
# explicitly request it
1376
accelerator_tree = None
1377
revision = _get_one_revision('checkout', revision)
1378
if files_from is not None and files_from != branch_location:
1379
accelerator_tree = WorkingTree.open(files_from)
1380
if revision is not None:
1381
revision_id = revision.as_revision_id(source)
823
1383
revision_id = None
824
1384
if to_location is None:
825
to_location = os.path.basename(branch_location.rstrip("/\\"))
826
# if the source and to_location are the same,
1385
to_location = urlutils.derive_to_location(branch_location)
1386
# if the source and to_location are the same,
827
1387
# and there is no working tree,
828
1388
# then reconstitute a branch
829
1389
if (osutils.abspath(to_location) ==
832
1392
source.bzrdir.open_workingtree()
833
1393
except errors.NoWorkingTree:
834
source.bzrdir.create_workingtree()
1394
source.bzrdir.create_workingtree(revision_id)
837
os.mkdir(to_location)
839
if e.errno == errno.EEXIST:
840
raise errors.BzrCommandError('Target directory "%s" already'
841
' exists.' % to_location)
842
if e.errno == errno.ENOENT:
843
raise errors.BzrCommandError('Parent of "%s" does not exist.'
847
old_format = bzrdir.BzrDirFormat.get_default_format()
848
bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
850
source.create_checkout(to_location, revision_id, lightweight)
852
bzrdir.BzrDirFormat.set_default_format(old_format)
1396
source.create_checkout(to_location, revision_id, lightweight,
1397
accelerator_tree, hardlink)
855
1400
class cmd_renames(Command):
856
"""Show list of renamed files.
1401
__doc__ = """Show list of renamed files.
858
1403
# TODO: Option to show renames between two historical versions.
860
1405
# TODO: Only show renames under dir, rather than in the whole branch.
1406
_see_also = ['status']
861
1407
takes_args = ['dir?']
863
1409
@display_command
864
1410
def run(self, dir=u'.'):
865
1411
tree = WorkingTree.open_containing(dir)[0]
866
old_inv = tree.basis_tree().inventory
867
new_inv = tree.read_working_inventory()
868
renames = list(_mod_tree.find_renames(old_inv, new_inv))
1412
self.add_cleanup(tree.lock_read().unlock)
1413
new_inv = tree.inventory
1414
old_tree = tree.basis_tree()
1415
self.add_cleanup(old_tree.lock_read().unlock)
1416
old_inv = old_tree.inventory
1418
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1419
for f, paths, c, v, p, n, k, e in iterator:
1420
if paths[0] == paths[1]:
1424
renames.append(paths)
870
1426
for old_name, new_name in renames:
871
1427
self.outf.write("%s => %s\n" % (old_name, new_name))
874
1430
class cmd_update(Command):
875
"""Update a tree to have the latest code committed to its branch.
1431
__doc__ = """Update a tree to have the latest code committed to its branch.
877
1433
This will perform a merge into the working tree, and may generate
878
conflicts. If you have any local changes, you will still
1434
conflicts. If you have any local changes, you will still
879
1435
need to commit them after the update for the update to be complete.
881
If you want to discard your local changes, you can just do a
1437
If you want to discard your local changes, you can just do a
882
1438
'bzr revert' instead of 'bzr commit' after the update.
1440
If you want to restore a file that has been removed locally, use
1441
'bzr revert' instead of 'bzr update'.
1443
If the tree's branch is bound to a master branch, it will also update
1444
the branch from the master.
1447
_see_also = ['pull', 'working-trees', 'status-flags']
884
1448
takes_args = ['dir?']
1449
takes_options = ['revision',
1451
help="Show base revision text in conflicts."),
885
1453
aliases = ['up']
887
def run(self, dir='.'):
1455
def run(self, dir='.', revision=None, show_base=None):
1456
if revision is not None and len(revision) != 1:
1457
raise errors.BzrCommandError(
1458
"bzr update --revision takes exactly one revision")
888
1459
tree = WorkingTree.open_containing(dir)[0]
889
master = tree.branch.get_master_branch()
1460
branch = tree.branch
1461
possible_transports = []
1462
master = branch.get_master_branch(
1463
possible_transports=possible_transports)
890
1464
if master is not None:
1465
branch_location = master.base
891
1466
tree.lock_write()
1468
branch_location = tree.branch.base
893
1469
tree.lock_tree_write()
1470
self.add_cleanup(tree.unlock)
1471
# get rid of the final '/' and be ready for display
1472
branch_location = urlutils.unescape_for_display(
1473
branch_location.rstrip('/'),
1475
existing_pending_merges = tree.get_parent_ids()[1:]
1479
# may need to fetch data into a heavyweight checkout
1480
# XXX: this may take some time, maybe we should display a
1482
old_tip = branch.update(possible_transports)
1483
if revision is not None:
1484
revision_id = revision[0].as_revision_id(branch)
1486
revision_id = branch.last_revision()
1487
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1488
revno = branch.revision_id_to_dotted_revno(revision_id)
1489
note("Tree is up to date at revision %s of branch %s" %
1490
('.'.join(map(str, revno)), branch_location))
1492
view_info = _get_view_info_for_change_reporter(tree)
1493
change_reporter = delta._ChangeReporter(
1494
unversioned_filter=tree.is_ignored,
1495
view_info=view_info)
895
existing_pending_merges = tree.get_parent_ids()[1:]
896
last_rev = tree.last_revision()
897
if last_rev == tree.branch.last_revision():
898
# may be up to date, check master too.
899
master = tree.branch.get_master_branch()
900
if master is None or last_rev == master.last_revision():
901
revno = tree.branch.revision_id_to_revno(last_rev)
902
note("Tree is up to date at revision %d." % (revno,))
904
conflicts = tree.update()
905
revno = tree.branch.revision_id_to_revno(tree.last_revision())
906
note('Updated to revision %d.' % (revno,))
907
if tree.get_parent_ids()[1:] != existing_pending_merges:
908
note('Your local commits will now show as pending merges with '
909
"'bzr status', and can be committed with 'bzr commit'.")
1497
conflicts = tree.update(
1499
possible_transports=possible_transports,
1500
revision=revision_id,
1502
show_base=show_base)
1503
except errors.NoSuchRevision, e:
1504
raise errors.BzrCommandError(
1505
"branch has no revision %s\n"
1506
"bzr update --revision only works"
1507
" for a revision in the branch history"
1509
revno = tree.branch.revision_id_to_dotted_revno(
1510
_mod_revision.ensure_null(tree.last_revision()))
1511
note('Updated to revision %s of branch %s' %
1512
('.'.join(map(str, revno)), branch_location))
1513
parent_ids = tree.get_parent_ids()
1514
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1515
note('Your local commits will now show as pending merges with '
1516
"'bzr status', and can be committed with 'bzr commit'.")
918
1523
class cmd_info(Command):
919
"""Show information about a working tree, branch or repository.
1524
__doc__ = """Show information about a working tree, branch or repository.
921
1526
This command will show all known locations and formats associated to the
922
tree, branch or repository. Statistical information is included with
1527
tree, branch or repository.
1529
In verbose mode, statistical information is included with each report.
1530
To see extended statistic information, use a verbosity level of 2 or
1531
higher by specifying the verbose option multiple times, e.g. -vv.
925
1533
Branches and working trees will also report any missing revisions.
1537
Display information on the format and related locations:
1541
Display the above together with extended format information and
1542
basic statistics (like the number of files in the working tree and
1543
number of revisions in the branch and repository):
1547
Display the above together with number of committers to the branch:
1551
_see_also = ['revno', 'working-trees', 'repositories']
927
1552
takes_args = ['location?']
928
1553
takes_options = ['verbose']
1554
encoding_type = 'replace'
930
1556
@display_command
931
1557
def run(self, location=None, verbose=False):
1559
noise_level = get_verbosity_level()
932
1562
from bzrlib.info import show_bzrdir_info
933
1563
show_bzrdir_info(bzrdir.BzrDir.open_containing(location)[0],
1564
verbose=noise_level, outfile=self.outf)
937
1567
class cmd_remove(Command):
938
"""Make a file unversioned.
940
This makes bzr stop tracking changes to a versioned file. It does
941
not delete the working copy.
943
You can specify one or more files, and/or --new. If you specify --new,
944
only 'added' files will be removed. If you specify both, then new files
945
in the specified directories will be removed. If the directories are
946
also new, they will also be removed.
1568
__doc__ = """Remove files or directories.
1570
This makes Bazaar stop tracking changes to the specified files. Bazaar will
1571
delete them if they can easily be recovered using revert otherwise they
1572
will be backed up (adding an extention of the form .~#~). If no options or
1573
parameters are given Bazaar will scan for files that are being tracked by
1574
Bazaar but missing in your tree and stop tracking them for you.
948
1576
takes_args = ['file*']
949
takes_options = ['verbose', Option('new', help='remove newly-added files')]
1577
takes_options = ['verbose',
1578
Option('new', help='Only remove files that have never been committed.'),
1579
RegistryOption.from_kwargs('file-deletion-strategy',
1580
'The file deletion mode to be used.',
1581
title='Deletion Strategy', value_switches=True, enum_switch=False,
1582
safe='Backup changed files (default).',
1583
keep='Delete from bzr but leave the working copy.',
1584
no_backup='Don\'t backup changed files.',
1585
force='Delete all the specified files, even if they can not be '
1586
'recovered and even if they are non-empty directories. '
1587
'(deprecated, use no-backup)')]
1588
aliases = ['rm', 'del']
951
1589
encoding_type = 'replace'
953
def run(self, file_list, verbose=False, new=False):
954
tree, file_list = tree_files(file_list)
956
if file_list is None:
957
raise errors.BzrCommandError('Specify one or more files to'
958
' remove, or use --new.')
1591
def run(self, file_list, verbose=False, new=False,
1592
file_deletion_strategy='safe'):
1593
if file_deletion_strategy == 'force':
1594
note("(The --force option is deprecated, rather use --no-backup "
1596
file_deletion_strategy = 'no-backup'
1598
tree, file_list = WorkingTree.open_containing_paths(file_list)
1600
if file_list is not None:
1601
file_list = [f for f in file_list]
1603
self.add_cleanup(tree.lock_write().unlock)
1604
# Heuristics should probably all move into tree.remove_smart or
960
1607
added = tree.changes_from(tree.basis_tree(),
961
1608
specific_files=file_list).added
962
1609
file_list = sorted([f[0] for f in added], reverse=True)
963
1610
if len(file_list) == 0:
964
1611
raise errors.BzrCommandError('No matching files.')
965
tree.remove(file_list, verbose=verbose, to_file=self.outf)
1612
elif file_list is None:
1613
# missing files show up in iter_changes(basis) as
1614
# versioned-with-no-kind.
1616
for change in tree.iter_changes(tree.basis_tree()):
1617
# Find paths in the working tree that have no kind:
1618
if change[1][1] is not None and change[6][1] is None:
1619
missing.append(change[1][1])
1620
file_list = sorted(missing, reverse=True)
1621
file_deletion_strategy = 'keep'
1622
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1623
keep_files=file_deletion_strategy=='keep',
1624
force=(file_deletion_strategy=='no-backup'))
968
1627
class cmd_file_id(Command):
969
"""Print file_id of a particular file or directory.
1628
__doc__ = """Print file_id of a particular file or directory.
971
1630
The file_id is assigned when the file is first added and remains the
972
1631
same through all revisions where the file exists, even when it is
1114
1800
# Just using os.mkdir, since I don't
1115
1801
# believe that we want to create a bunch of
1116
1802
# locations if the user supplies an extended path
1117
# TODO: create-prefix
1119
to_transport.mkdir('.')
1120
except errors.FileExists:
1124
existing_bzrdir = bzrdir.BzrDir.open(location)
1804
to_transport.ensure_base()
1805
except errors.NoSuchFile:
1806
if not create_prefix:
1807
raise errors.BzrCommandError("Parent directory of %s"
1809
"\nYou may supply --create-prefix to create all"
1810
" leading parent directories."
1812
to_transport.create_prefix()
1815
a_bzrdir = bzrdir.BzrDir.open_from_transport(to_transport)
1125
1816
except errors.NotBranchError:
1126
1817
# really a NotBzrDir error...
1127
bzrdir.BzrDir.create_branch_convenience(location, format=format)
1818
create_branch = bzrdir.BzrDir.create_branch_convenience
1820
force_new_tree = False
1822
force_new_tree = None
1823
branch = create_branch(to_transport.base, format=format,
1824
possible_transports=[to_transport],
1825
force_new_tree=force_new_tree)
1826
a_bzrdir = branch.bzrdir
1129
1828
from bzrlib.transport.local import LocalTransport
1130
if existing_bzrdir.has_branch():
1829
if a_bzrdir.has_branch():
1131
1830
if (isinstance(to_transport, LocalTransport)
1132
and not existing_bzrdir.has_workingtree()):
1831
and not a_bzrdir.has_workingtree()):
1133
1832
raise errors.BranchExistsWithoutWorkingTree(location)
1134
1833
raise errors.AlreadyBranchError(location)
1136
existing_bzrdir.create_branch()
1137
existing_bzrdir.create_workingtree()
1834
branch = a_bzrdir.create_branch()
1836
a_bzrdir.create_workingtree()
1837
if append_revisions_only:
1839
branch.set_append_revisions_only(True)
1840
except errors.UpgradeRequired:
1841
raise errors.BzrCommandError('This branch format cannot be set'
1842
' to append-revisions-only. Try --default.')
1844
from bzrlib.info import describe_layout, describe_format
1846
tree = a_bzrdir.open_workingtree(recommend_upgrade=False)
1847
except (errors.NoWorkingTree, errors.NotLocalUrl):
1849
repository = branch.repository
1850
layout = describe_layout(repository, branch, tree).lower()
1851
format = describe_format(a_bzrdir, repository, branch, tree)
1852
self.outf.write("Created a %s (format: %s)\n" % (layout, format))
1853
if repository.is_shared():
1854
#XXX: maybe this can be refactored into transport.path_or_url()
1855
url = repository.bzrdir.root_transport.external_url()
1857
url = urlutils.local_path_from_url(url)
1858
except errors.InvalidURL:
1860
self.outf.write("Using shared repository: %s\n" % url)
1140
1863
class cmd_init_repository(Command):
1141
"""Create a shared repository to hold branches.
1143
New branches created under the repository directory will store their revisions
1144
in the repository, not in the branch directory, if the branch format supports
1150
bzr checkout --lightweight repo/trunk trunk-checkout
1864
__doc__ = """Create a shared repository for branches to share storage space.
1866
New branches created under the repository directory will store their
1867
revisions in the repository, not in the branch directory. For branches
1868
with shared history, this reduces the amount of storage needed and
1869
speeds up the creation of new branches.
1871
If the --no-trees option is given then the branches in the repository
1872
will not have working trees by default. They will still exist as
1873
directories on disk, but they will not have separate copies of the
1874
files at a certain revision. This can be useful for repositories that
1875
store branches which are interacted with through checkouts or remote
1876
branches, such as on a server.
1879
Create a shared repository holding just branches::
1881
bzr init-repo --no-trees repo
1884
Make a lightweight checkout elsewhere::
1886
bzr checkout --lightweight repo/trunk trunk-checkout
1154
takes_args = ["location"]
1155
takes_options = [Option('format',
1156
help='Specify a format for this repository.'
1157
' Current formats are: default, knit,'
1158
' metaweave and weave. Default is knit;'
1159
' metaweave and weave are deprecated',
1160
type=get_format_type),
1162
help='Allows branches in repository to have'
1891
_see_also = ['init', 'branch', 'checkout', 'repositories']
1892
takes_args = ["location"]
1893
takes_options = [RegistryOption('format',
1894
help='Specify a format for this repository. See'
1895
' "bzr help formats" for details.',
1896
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
1897
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
1898
value_switches=True, title='Repository format'),
1900
help='Branches in the repository will default to'
1901
' not having a working tree.'),
1164
1903
aliases = ["init-repo"]
1165
def run(self, location, format=None, trees=False):
1905
def run(self, location, format=None, no_trees=False):
1166
1906
if format is None:
1167
format = get_format_type('default')
1907
format = bzrdir.format_registry.make_bzrdir('default')
1169
1909
if location is None:
1172
1912
to_transport = transport.get_transport(location)
1174
to_transport.mkdir('.')
1175
except errors.FileExists:
1913
to_transport.ensure_base()
1178
1915
newdir = format.initialize_on_transport(to_transport)
1179
1916
repo = newdir.create_repository(shared=True)
1180
repo.set_make_working_trees(trees)
1917
repo.set_make_working_trees(not no_trees)
1919
from bzrlib.info import show_bzrdir_info
1920
show_bzrdir_info(repo.bzrdir, verbose=0, outfile=self.outf)
1183
1923
class cmd_diff(Command):
1184
"""Show differences in the working tree or between revisions.
1186
If files are listed, only the changes in those files are listed.
1187
Otherwise, all changes for the tree are listed.
1924
__doc__ = """Show differences in the working tree, between revisions or branches.
1926
If no arguments are given, all changes for the current tree are listed.
1927
If files are given, only the changes in those files are listed.
1928
Remote and multiple branches can be compared by using the --old and
1929
--new options. If not provided, the default for both is derived from
1930
the first argument, if any, or the current tree if no arguments are
1189
1933
"bzr diff -p1" is equivalent to "bzr diff --prefix old/:new/", and
1190
1934
produces patches suitable for "patch -p1".
1194
Shows the difference in the working tree versus the last commit
1196
Difference between the working tree and revision 1
1198
Difference between revision 2 and revision 1
1199
bzr diff --diff-prefix old/:new/
1200
Same as 'bzr diff' but prefix paths with old/ and new/
1201
bzr diff bzr.mine bzr.dev
1202
Show the differences between the two working trees
1204
Show just the differences for 'foo.c'
1936
Note that when using the -r argument with a range of revisions, the
1937
differences are computed between the two specified revisions. That
1938
is, the command does not show the changes introduced by the first
1939
revision in the range. This differs from the interpretation of
1940
revision ranges used by "bzr log" which includes the first revision
1945
2 - unrepresentable changes
1950
Shows the difference in the working tree versus the last commit::
1954
Difference between the working tree and revision 1::
1958
Difference between revision 3 and revision 1::
1962
Difference between revision 3 and revision 1 for branch xxx::
1966
The changes introduced by revision 2 (equivalent to -r1..2)::
1970
To see the changes introduced by revision X::
1974
Note that in the case of a merge, the -c option shows the changes
1975
compared to the left hand parent. To see the changes against
1976
another parent, use::
1978
bzr diff -r<chosen_parent>..X
1980
The changes between the current revision and the previous revision
1981
(equivalent to -c-1 and -r-2..-1)
1985
Show just the differences for file NEWS::
1989
Show the differences in working tree xxx for file NEWS::
1993
Show the differences from branch xxx to this working tree:
1997
Show the differences between two branches for file NEWS::
1999
bzr diff --old xxx --new yyy NEWS
2001
Same as 'bzr diff' but prefix paths with old/ and new/::
2003
bzr diff --prefix old/:new/
2005
Show the differences using a custom diff program with options::
2007
bzr diff --using /usr/bin/diff --diff-options -wu
1206
# TODO: Option to use external diff command; could be GNU diff, wdiff,
1207
# or a graphical diff.
1209
# TODO: Python difflib is not exactly the same as unidiff; should
1210
# either fix it up or prefer to use an external diff.
1212
# TODO: Selected-file diff is inefficient and doesn't show you
1215
# TODO: This probably handles non-Unix newlines poorly.
2009
_see_also = ['status']
1217
2010
takes_args = ['file*']
1218
takes_options = ['revision', 'diff-options', 'prefix']
2012
Option('diff-options', type=str,
2013
help='Pass these options to the external diff program.'),
2014
Option('prefix', type=str,
2016
help='Set prefixes added to old and new filenames, as '
2017
'two values separated by a colon. (eg "old/:new/").'),
2019
help='Branch/tree to compare from.',
2023
help='Branch/tree to compare to.',
2029
help='Use this command to compare files.',
2032
RegistryOption('format',
2034
help='Diff format to use.',
2035
lazy_registry=('bzrlib.diff', 'format_registry'),
2036
title='Diff format'),
1219
2038
aliases = ['di', 'dif']
1220
2039
encoding_type = 'exact'
1222
2041
@display_command
1223
2042
def run(self, revision=None, file_list=None, diff_options=None,
1225
from bzrlib.diff import diff_cmd_helper, show_diff_trees
2043
prefix=None, old=None, new=None, using=None, format=None):
2044
from bzrlib.diff import (get_trees_and_branches_to_diff_locked,
1227
2047
if (prefix is None) or (prefix == '0'):
1228
2048
# diff -p0 format
1353
2174
self.outf.write(tree.basedir + '\n')
2177
def _parse_limit(limitstring):
2179
return int(limitstring)
2181
msg = "The limit argument must be an integer."
2182
raise errors.BzrCommandError(msg)
2185
def _parse_levels(s):
2189
msg = "The levels argument must be an integer."
2190
raise errors.BzrCommandError(msg)
1356
2193
class cmd_log(Command):
1357
"""Show log of a branch, file, or directory.
1359
By default show the log of the branch containing the working directory.
1361
To request a range of logs, you can use the command -r begin..end
1362
-r revision requests a specific revision, -r ..end or -r begin.. are
1368
bzr log -r -10.. http://server/branch
2194
__doc__ = """Show historical log for a branch or subset of a branch.
2196
log is bzr's default tool for exploring the history of a branch.
2197
The branch to use is taken from the first parameter. If no parameters
2198
are given, the branch containing the working directory is logged.
2199
Here are some simple examples::
2201
bzr log log the current branch
2202
bzr log foo.py log a file in its branch
2203
bzr log http://server/branch log a branch on a server
2205
The filtering, ordering and information shown for each revision can
2206
be controlled as explained below. By default, all revisions are
2207
shown sorted (topologically) so that newer revisions appear before
2208
older ones and descendants always appear before ancestors. If displayed,
2209
merged revisions are shown indented under the revision in which they
2214
The log format controls how information about each revision is
2215
displayed. The standard log formats are called ``long``, ``short``
2216
and ``line``. The default is long. See ``bzr help log-formats``
2217
for more details on log formats.
2219
The following options can be used to control what information is
2222
-l N display a maximum of N revisions
2223
-n N display N levels of revisions (0 for all, 1 for collapsed)
2224
-v display a status summary (delta) for each revision
2225
-p display a diff (patch) for each revision
2226
--show-ids display revision-ids (and file-ids), not just revnos
2228
Note that the default number of levels to display is a function of the
2229
log format. If the -n option is not used, the standard log formats show
2230
just the top level (mainline).
2232
Status summaries are shown using status flags like A, M, etc. To see
2233
the changes explained using words like ``added`` and ``modified``
2234
instead, use the -vv option.
2238
To display revisions from oldest to newest, use the --forward option.
2239
In most cases, using this option will have little impact on the total
2240
time taken to produce a log, though --forward does not incrementally
2241
display revisions like --reverse does when it can.
2243
:Revision filtering:
2245
The -r option can be used to specify what revision or range of revisions
2246
to filter against. The various forms are shown below::
2248
-rX display revision X
2249
-rX.. display revision X and later
2250
-r..Y display up to and including revision Y
2251
-rX..Y display from X to Y inclusive
2253
See ``bzr help revisionspec`` for details on how to specify X and Y.
2254
Some common examples are given below::
2256
-r-1 show just the tip
2257
-r-10.. show the last 10 mainline revisions
2258
-rsubmit:.. show what's new on this branch
2259
-rancestor:path.. show changes since the common ancestor of this
2260
branch and the one at location path
2261
-rdate:yesterday.. show changes since yesterday
2263
When logging a range of revisions using -rX..Y, log starts at
2264
revision Y and searches back in history through the primary
2265
("left-hand") parents until it finds X. When logging just the
2266
top level (using -n1), an error is reported if X is not found
2267
along the way. If multi-level logging is used (-n0), X may be
2268
a nested merge revision and the log will be truncated accordingly.
2272
If parameters are given and the first one is not a branch, the log
2273
will be filtered to show only those revisions that changed the
2274
nominated files or directories.
2276
Filenames are interpreted within their historical context. To log a
2277
deleted file, specify a revision range so that the file existed at
2278
the end or start of the range.
2280
Historical context is also important when interpreting pathnames of
2281
renamed files/directories. Consider the following example:
2283
* revision 1: add tutorial.txt
2284
* revision 2: modify tutorial.txt
2285
* revision 3: rename tutorial.txt to guide.txt; add tutorial.txt
2289
* ``bzr log guide.txt`` will log the file added in revision 1
2291
* ``bzr log tutorial.txt`` will log the new file added in revision 3
2293
* ``bzr log -r2 -p tutorial.txt`` will show the changes made to
2294
the original file in revision 2.
2296
* ``bzr log -r2 -p guide.txt`` will display an error message as there
2297
was no file called guide.txt in revision 2.
2299
Renames are always followed by log. By design, there is no need to
2300
explicitly ask for this (and no way to stop logging a file back
2301
until it was last renamed).
2305
The --message option can be used for finding revisions that match a
2306
regular expression in a commit message.
2310
GUI tools and IDEs are often better at exploring history than command
2311
line tools: you may prefer qlog or viz from qbzr or bzr-gtk, the
2312
bzr-explorer shell, or the Loggerhead web interface. See the Plugin
2313
Guide <http://doc.bazaar.canonical.com/plugins/en/> and
2314
<http://wiki.bazaar.canonical.com/IDEIntegration>.
2316
You may find it useful to add the aliases below to ``bazaar.conf``::
2320
top = log -l10 --line
2323
``bzr tip`` will then show the latest revision while ``bzr top``
2324
will show the last 10 mainline revisions. To see the details of a
2325
particular revision X, ``bzr show -rX``.
2327
If you are interested in looking deeper into a particular merge X,
2328
use ``bzr log -n0 -rX``.
2330
``bzr log -v`` on a branch with lots of history is currently
2331
very slow. A fix for this issue is currently under development.
2332
With or without that fix, it is recommended that a revision range
2333
be given when using the -v option.
2335
bzr has a generic full-text matching plugin, bzr-search, that can be
2336
used to find revisions matching user names, commit messages, etc.
2337
Among other features, this plugin can find all revisions containing
2338
a list of words but not others.
2340
When exploring non-mainline history on large projects with deep
2341
history, the performance of log can be greatly improved by installing
2342
the historycache plugin. This plugin buffers historical information
2343
trading disk space for faster speed.
1371
# TODO: Make --revision support uuid: and hash: [future tag:] notation.
1373
takes_args = ['location?']
1374
takes_options = [Option('forward',
1375
help='show from oldest to newest'),
1378
help='show files changed in each revision'),
1379
'show-ids', 'revision',
1383
help='show revisions whose message matches this regexp',
2345
takes_args = ['file*']
2346
_see_also = ['log-formats', 'revisionspec']
2349
help='Show from oldest to newest.'),
2351
custom_help('verbose',
2352
help='Show files changed in each revision.'),
2356
type=bzrlib.option._parse_revision_str,
2358
help='Show just the specified revision.'
2359
' See also "help revisionspec".'),
2361
RegistryOption('authors',
2362
'What names to list as authors - first, all or committer.',
2364
lazy_registry=('bzrlib.log', 'author_list_registry'),
2368
help='Number of levels to display - 0 for all, 1 for flat.',
2370
type=_parse_levels),
2373
help='Show revisions whose message matches this '
2374
'regular expression.',
2378
help='Limit the output to the first N revisions.',
2383
help='Show changes made in each revision as a patch.'),
2384
Option('include-merges',
2385
help='Show merged revisions like --levels 0 does.'),
2386
Option('exclude-common-ancestry',
2387
help='Display only the revisions that are not part'
2388
' of both ancestries (require -rX..Y)'
1387
2391
encoding_type = 'replace'
1389
2393
@display_command
1390
def run(self, location=None, timezone='original',
2394
def run(self, file_list=None, timezone='original',
1392
2396
show_ids=False,
1395
2400
log_format=None,
1400
from bzrlib.log import log_formatter, show_log
1401
assert message is None or isinstance(message, basestring), \
1402
"invalid message argument %r" % message
2405
include_merges=False,
2407
exclude_common_ancestry=False,
2409
from bzrlib.log import (
2411
make_log_request_dict,
2412
_get_info_for_log_files,
1403
2414
direction = (forward and 'forward') or 'reverse'
1408
# find the file id to log:
1410
dir, fp = bzrdir.BzrDir.open_containing(location)
1411
b = dir.open_branch()
1415
inv = dir.open_workingtree().inventory
1416
except (errors.NotBranchError, errors.NotLocalUrl):
1417
# either no tree, or is remote.
1418
inv = b.basis_tree().inventory
1419
file_id = inv.path2id(fp)
2415
if (exclude_common_ancestry
2416
and (revision is None or len(revision) != 2)):
2417
raise errors.BzrCommandError(
2418
'--exclude-common-ancestry requires -r with two revisions')
2423
raise errors.BzrCommandError(
2424
'--levels and --include-merges are mutually exclusive')
2426
if change is not None:
2428
raise errors.RangeInChangeOption()
2429
if revision is not None:
2430
raise errors.BzrCommandError(
2431
'--revision and --change are mutually exclusive')
2436
filter_by_dir = False
2438
# find the file ids to log and check for directory filtering
2439
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2440
revision, file_list, self.add_cleanup)
2441
for relpath, file_id, kind in file_info_list:
1420
2442
if file_id is None:
1421
2443
raise errors.BzrCommandError(
1422
"Path does not have any revision history: %s" %
2444
"Path unknown at end or start of revision range: %s" %
2446
# If the relpath is the top of the tree, we log everything
2451
file_ids.append(file_id)
2452
filter_by_dir = filter_by_dir or (
2453
kind in ['directory', 'tree-reference'])
1426
# FIXME ? log the current subdir only RBC 20060203
2456
# FIXME ? log the current subdir only RBC 20060203
1427
2457
if revision is not None \
1428
2458
and len(revision) > 0 and revision[0].get_branch():
1429
2459
location = revision[0].get_branch()
1542
2640
selection = {'I':ignored, '?':unknown, 'V':versioned}
1544
tree, relpath = WorkingTree.open_containing(u'.')
2646
raise errors.BzrCommandError('cannot specify both --from-root'
2649
tree, branch, relpath = \
2650
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2652
# Calculate the prefix to use
1549
if revision is not None:
1550
tree = tree.branch.repository.revision_tree(
1551
revision[0].in_history(tree.branch).rev_id)
1553
for fp, fc, kind, fid, entry in tree.list_files(include_root=False):
1554
if fp.startswith(relpath):
1555
fp = fp[len(relpath):]
1556
if non_recursive and '/' in fp:
1558
if not all and not selection[fc]:
1561
kindch = entry.kind_character()
1562
self.outf.write('%-8s %s%s\n' % (fc, fp, kindch))
1564
self.outf.write(fp + '\0')
2656
prefix = relpath + '/'
2657
elif fs_path != '.' and not fs_path.endswith('/'):
2658
prefix = fs_path + '/'
2660
if revision is not None or tree is None:
2661
tree = _get_one_revision_tree('ls', revision, branch=branch)
2664
if isinstance(tree, WorkingTree) and tree.supports_views():
2665
view_files = tree.views.lookup_view()
2668
view_str = views.view_display_str(view_files)
2669
note("Ignoring files outside view. View is %s" % view_str)
2671
self.add_cleanup(tree.lock_read().unlock)
2672
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2673
from_dir=relpath, recursive=recursive):
2674
# Apply additional masking
2675
if not all and not selection[fc]:
2677
if kind is not None and fkind != kind:
2682
fullpath = osutils.pathjoin(relpath, fp)
2685
views.check_path_in_view(tree, fullpath)
2686
except errors.FileOutsideView:
2691
fp = osutils.pathjoin(prefix, fp)
2692
kindch = entry.kind_character()
2693
outstring = fp + kindch
2694
ui.ui_factory.clear_term()
2696
outstring = '%-8s %s' % (fc, outstring)
2697
if show_ids and fid is not None:
2698
outstring = "%-50s %s" % (outstring, fid)
2699
self.outf.write(outstring + '\n')
2701
self.outf.write(fp + '\0')
2704
self.outf.write(fid)
2705
self.outf.write('\0')
2713
self.outf.write('%-50s %s\n' % (outstring, my_id))
1567
self.outf.write(fp + '\n')
2715
self.outf.write(outstring + '\n')
1570
2718
class cmd_unknowns(Command):
1571
"""List unknown files."""
2719
__doc__ = """List unknown files.
2724
takes_options = ['directory']
1572
2726
@display_command
1574
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2727
def run(self, directory=u'.'):
2728
for f in WorkingTree.open_containing(directory)[0].unknowns():
1575
2729
self.outf.write(osutils.quotefn(f) + '\n')
1578
2732
class cmd_ignore(Command):
1579
"""Ignore specified files or patterns.
2733
__doc__ = """Ignore specified files or patterns.
2735
See ``bzr help patterns`` for details on the syntax of patterns.
2737
If a .bzrignore file does not exist, the ignore command
2738
will create one and add the specified files or patterns to the newly
2739
created file. The ignore command will also automatically add the
2740
.bzrignore file to be versioned. Creating a .bzrignore file without
2741
the use of the ignore command will require an explicit add command.
1581
2743
To remove patterns from the ignore list, edit the .bzrignore file.
1583
Trailing slashes on patterns are ignored.
1584
If the pattern contains a slash, it is compared to the whole path
1585
from the branch root. Otherwise, it is compared to only the last
1586
component of the path. To match a file only in the root directory,
1589
Ignore patterns specifying absolute paths are not allowed.
1591
Ignore patterns are case-insensitive on case-insensitive systems.
1593
Note: wildcards must be quoted from the shell on Unix.
1596
bzr ignore ./Makefile
1597
bzr ignore '*.class'
2744
After adding, editing or deleting that file either indirectly by
2745
using this command or directly by using an editor, be sure to commit
2748
Bazaar also supports a global ignore file ~/.bazaar/ignore. On Windows
2749
the global ignore file can be found in the application data directory as
2750
C:\\Documents and Settings\\<user>\\Application Data\\Bazaar\\2.0\\ignore.
2751
Global ignores are not touched by this command. The global ignore file
2752
can be edited directly using an editor.
2754
Patterns prefixed with '!' are exceptions to ignore patterns and take
2755
precedence over regular ignores. Such exceptions are used to specify
2756
files that should be versioned which would otherwise be ignored.
2758
Patterns prefixed with '!!' act as regular ignore patterns, but have
2759
precedence over the '!' exception patterns.
2763
* Ignore patterns containing shell wildcards must be quoted from
2766
* Ignore patterns starting with "#" act as comments in the ignore file.
2767
To ignore patterns that begin with that character, use the "RE:" prefix.
2770
Ignore the top level Makefile::
2772
bzr ignore ./Makefile
2774
Ignore .class files in all directories...::
2776
bzr ignore "*.class"
2778
...but do not ignore "special.class"::
2780
bzr ignore "!special.class"
2782
Ignore files whose name begins with the "#" character::
2786
Ignore .o files under the lib directory::
2788
bzr ignore "lib/**/*.o"
2790
Ignore .o files under the lib directory::
2792
bzr ignore "RE:lib/.*\.o"
2794
Ignore everything but the "debian" toplevel directory::
2796
bzr ignore "RE:(?!debian/).*"
2798
Ignore everything except the "local" toplevel directory,
2799
but always ignore autosave files ending in ~, even under local/::
2802
bzr ignore "!./local"
2806
_see_also = ['status', 'ignored', 'patterns']
1599
2807
takes_args = ['name_pattern*']
1601
Option('old-default-rules',
1602
help='Out the ignore rules bzr < 0.9 always used.')
1605
def run(self, name_pattern_list=None, old_default_rules=None):
1606
from bzrlib.atomicfile import AtomicFile
1607
if old_default_rules is not None:
1608
# dump the rules and exit
1609
for pattern in ignores.OLD_DEFAULTS:
2808
takes_options = ['directory',
2809
Option('default-rules',
2810
help='Display the default ignore rules that bzr uses.')
2813
def run(self, name_pattern_list=None, default_rules=None,
2815
from bzrlib import ignores
2816
if default_rules is not None:
2817
# dump the default rules and exit
2818
for pattern in ignores.USER_DEFAULTS:
2819
self.outf.write("%s\n" % pattern)
1612
2821
if not name_pattern_list:
1613
2822
raise errors.BzrCommandError("ignore requires at least one "
1614
"NAME_PATTERN or --old-default-rules")
2823
"NAME_PATTERN or --default-rules.")
2824
name_pattern_list = [globbing.normalize_pattern(p)
2825
for p in name_pattern_list]
2827
for p in name_pattern_list:
2828
if not globbing.Globster.is_pattern_valid(p):
2829
bad_patterns += ('\n %s' % p)
2831
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2832
ui.ui_factory.show_error(msg)
2833
raise errors.InvalidPattern('')
1615
2834
for name_pattern in name_pattern_list:
1616
if name_pattern[0] == '/':
2835
if (name_pattern[0] == '/' or
2836
(len(name_pattern) > 1 and name_pattern[1] == ':')):
1617
2837
raise errors.BzrCommandError(
1618
2838
"NAME_PATTERN should not be an absolute path")
1619
tree, relpath = WorkingTree.open_containing(u'.')
1620
ifn = tree.abspath('.bzrignore')
1621
if os.path.exists(ifn):
1624
igns = f.read().decode('utf-8')
1630
# TODO: If the file already uses crlf-style termination, maybe
1631
# we should use that for the newly added lines?
1633
if igns and igns[-1] != '\n':
1635
for name_pattern in name_pattern_list:
1636
igns += name_pattern.rstrip('/') + '\n'
1638
f = AtomicFile(ifn, 'wb')
1640
f.write(igns.encode('utf-8'))
1645
inv = tree.inventory
1646
if inv.path2id('.bzrignore'):
1647
mutter('.bzrignore is already versioned')
1649
mutter('need to make new .bzrignore file versioned')
1650
tree.add(['.bzrignore'])
2839
tree, relpath = WorkingTree.open_containing(directory)
2840
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2841
ignored = globbing.Globster(name_pattern_list)
2843
self.add_cleanup(tree.lock_read().unlock)
2844
for entry in tree.list_files():
2848
if ignored.match(filename):
2849
matches.append(filename)
2850
if len(matches) > 0:
2851
self.outf.write("Warning: the following files are version controlled and"
2852
" match your ignore pattern:\n%s"
2853
"\nThese files will continue to be version controlled"
2854
" unless you 'bzr remove' them.\n" % ("\n".join(matches),))
1653
2857
class cmd_ignored(Command):
1654
"""List ignored files and the patterns that matched them.
1656
See also: bzr ignore"""
2858
__doc__ = """List ignored files and the patterns that matched them.
2860
List all the ignored files and the ignore pattern that caused the file to
2863
Alternatively, to list just the files::
2868
encoding_type = 'replace'
2869
_see_also = ['ignore', 'ls']
2870
takes_options = ['directory']
1657
2872
@display_command
1659
tree = WorkingTree.open_containing(u'.')[0]
2873
def run(self, directory=u'.'):
2874
tree = WorkingTree.open_containing(directory)[0]
2875
self.add_cleanup(tree.lock_read().unlock)
1660
2876
for path, file_class, kind, file_id, entry in tree.list_files():
1661
2877
if file_class != 'I':
1663
2879
## XXX: Slightly inefficient since this was already calculated
1664
2880
pat = tree.is_ignored(path)
1665
print '%-50s %s' % (path, pat)
2881
self.outf.write('%-50s %s\n' % (path, pat))
1668
2884
class cmd_lookup_revision(Command):
1669
"""Lookup the revision-id from a revision-number
2885
__doc__ = """Lookup the revision-id from a revision-number
1672
2888
bzr lookup-revision 33
1675
2891
takes_args = ['revno']
2892
takes_options = ['directory']
1677
2894
@display_command
1678
def run(self, revno):
2895
def run(self, revno, directory=u'.'):
1680
2897
revno = int(revno)
1681
2898
except ValueError:
1682
raise errors.BzrCommandError("not a valid revision-number: %r" % revno)
1684
print WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2899
raise errors.BzrCommandError("not a valid revision-number: %r"
2901
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2902
self.outf.write("%s\n" % revid)
1687
2905
class cmd_export(Command):
1688
"""Export past revision to destination directory.
2906
__doc__ = """Export current or past revision to a destination directory or archive.
1690
2908
If no revision is specified this exports the last committed revision.
1693
2911
given, try to find the format with the extension. If no extension
1694
2912
is found exports to a directory (equivalent to --format=dir).
1696
Root may be the top directory for tar, tgz and tbz2 formats. If none
1697
is given, the top directory will be the root name of the file.
1699
If branch is omitted then the branch containing the CWD will be used.
1701
Note: export of tree with non-ascii filenames to zip is not supported.
1703
Supported formats Autodetected by extension
1704
----------------- -------------------------
2914
If root is supplied, it will be used as the root directory inside
2915
container formats (tar, zip, etc). If it is not supplied it will default
2916
to the exported filename. The root option has no effect for 'dir' format.
2918
If branch is omitted then the branch containing the current working
2919
directory will be used.
2921
Note: Export of tree with non-ASCII filenames to zip is not supported.
2923
================= =========================
2924
Supported formats Autodetected by extension
2925
================= =========================
1707
2928
tbz2 .tar.bz2, .tbz2
1708
2929
tgz .tar.gz, .tgz
2931
================= =========================
1711
takes_args = ['dest', 'branch?']
1712
takes_options = ['revision', 'format', 'root']
1713
def run(self, dest, branch=None, revision=None, format=None, root=None):
2934
takes_args = ['dest', 'branch_or_subdir?']
2935
takes_options = ['directory',
2937
help="Type of file to export to.",
2940
Option('filters', help='Apply content filters to export the '
2941
'convenient form.'),
2944
help="Name of the root directory inside the exported file."),
2945
Option('per-file-timestamps',
2946
help='Set modification time of files to that of the last '
2947
'revision in which it was changed.'),
2949
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
2950
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
1714
2951
from bzrlib.export import export
1717
tree = WorkingTree.open_containing(u'.')[0]
2953
if branch_or_subdir is None:
2954
tree = WorkingTree.open_containing(directory)[0]
1718
2955
b = tree.branch
1720
b = Branch.open(branch)
1722
if revision is None:
1723
# should be tree.last_revision FIXME
1724
rev_id = b.last_revision()
1726
if len(revision) != 1:
1727
raise errors.BzrCommandError('bzr export --revision takes exactly 1 argument')
1728
rev_id = revision[0].in_history(b).rev_id
1729
t = b.repository.revision_tree(rev_id)
2958
b, subdir = Branch.open_containing(branch_or_subdir)
2961
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
1731
export(t, dest, format, root)
2963
export(rev_tree, dest, format, root, subdir, filtered=filters,
2964
per_file_timestamps=per_file_timestamps)
1732
2965
except errors.NoSuchExportFormat, e:
1733
2966
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
1736
2969
class cmd_cat(Command):
1737
"""Write a file's text from a previous revision."""
1739
takes_options = ['revision', 'name-from-revision']
2970
__doc__ = """Write the contents of a file as of a given revision to standard output.
2972
If no revision is nominated, the last revision is used.
2974
Note: Take care to redirect standard output when using this command on a
2979
takes_options = ['directory',
2980
Option('name-from-revision', help='The path name in the old tree.'),
2981
Option('filters', help='Apply content filters to display the '
2982
'convenience form.'),
1740
2985
takes_args = ['filename']
2986
encoding_type = 'exact'
1742
2988
@display_command
1743
def run(self, filename, revision=None, name_from_revision=False):
2989
def run(self, filename, revision=None, name_from_revision=False,
2990
filters=False, directory=None):
1744
2991
if revision is not None and len(revision) != 1:
1745
2992
raise errors.BzrCommandError("bzr cat --revision takes exactly"
1750
tree, relpath = WorkingTree.open_containing(filename)
1752
except errors.NotBranchError:
2993
" one revision specifier")
2994
tree, branch, relpath = \
2995
_open_directory_or_containing_tree_or_branch(filename, directory)
2996
self.add_cleanup(branch.lock_read().unlock)
2997
return self._run(tree, branch, relpath, filename, revision,
2998
name_from_revision, filters)
3000
def _run(self, tree, b, relpath, filename, revision, name_from_revision,
1755
3002
if tree is None:
1756
b, relpath = Branch.open_containing(filename)
1757
if revision is not None and revision[0].get_branch() is not None:
1758
b = Branch.open(revision[0].get_branch())
1759
if revision is None:
1760
revision_id = b.last_revision()
1762
revision_id = revision[0].in_history(b).rev_id
3003
tree = b.basis_tree()
3004
rev_tree = _get_one_revision_tree('cat', revision, branch=b)
3005
self.add_cleanup(rev_tree.lock_read().unlock)
1764
cur_file_id = tree.path2id(relpath)
1765
rev_tree = b.repository.revision_tree(revision_id)
1766
3007
old_file_id = rev_tree.path2id(relpath)
1768
3009
if name_from_revision:
3010
# Try in revision if requested
1769
3011
if old_file_id is None:
1770
raise errors.BzrCommandError("%r is not present in revision %s"
1771
% (filename, revision_id))
3012
raise errors.BzrCommandError(
3013
"%r is not present in revision %s" % (
3014
filename, rev_tree.get_revision_id()))
1773
rev_tree.print_file(old_file_id)
1774
elif cur_file_id is not None:
1775
rev_tree.print_file(cur_file_id)
1776
elif old_file_id is not None:
1777
rev_tree.print_file(old_file_id)
1779
raise errors.BzrCommandError("%r is not present in revision %s" %
1780
(filename, revision_id))
3016
content = rev_tree.get_file_text(old_file_id)
3018
cur_file_id = tree.path2id(relpath)
3020
if cur_file_id is not None:
3021
# Then try with the actual file id
3023
content = rev_tree.get_file_text(cur_file_id)
3025
except errors.NoSuchId:
3026
# The actual file id didn't exist at that time
3028
if not found and old_file_id is not None:
3029
# Finally try with the old file id
3030
content = rev_tree.get_file_text(old_file_id)
3033
# Can't be found anywhere
3034
raise errors.BzrCommandError(
3035
"%r is not present in revision %s" % (
3036
filename, rev_tree.get_revision_id()))
3038
from bzrlib.filters import (
3039
ContentFilterContext,
3040
filtered_output_bytes,
3042
filters = rev_tree._content_filter_stack(relpath)
3043
chunks = content.splitlines(True)
3044
content = filtered_output_bytes(chunks, filters,
3045
ContentFilterContext(relpath, rev_tree))
3047
self.outf.writelines(content)
3050
self.outf.write(content)
1783
3053
class cmd_local_time_offset(Command):
1784
"""Show the offset in seconds from GMT to local time."""
3054
__doc__ = """Show the offset in seconds from GMT to local time."""
1786
3056
@display_command
1788
print osutils.local_time_offset()
3058
self.outf.write("%s\n" % osutils.local_time_offset())
1792
3062
class cmd_commit(Command):
1793
"""Commit changes into a new revision.
1795
If no arguments are given, the entire tree is committed.
1797
If selected files are specified, only changes to those files are
1798
committed. If a directory is specified then the directory and everything
1799
within it is committed.
1801
A selected-file commit may fail in some cases where the committed
1802
tree would be invalid, such as trying to commit a file in a
1803
newly-added directory that is not itself committed.
3063
__doc__ = """Commit changes into a new revision.
3065
An explanatory message needs to be given for each commit. This is
3066
often done by using the --message option (getting the message from the
3067
command line) or by using the --file option (getting the message from
3068
a file). If neither of these options is given, an editor is opened for
3069
the user to enter the message. To see the changed files in the
3070
boilerplate text loaded into the editor, use the --show-diff option.
3072
By default, the entire tree is committed and the person doing the
3073
commit is assumed to be the author. These defaults can be overridden
3078
If selected files are specified, only changes to those files are
3079
committed. If a directory is specified then the directory and
3080
everything within it is committed.
3082
When excludes are given, they take precedence over selected files.
3083
For example, to commit only changes within foo, but not changes
3086
bzr commit foo -x foo/bar
3088
A selective commit after a merge is not yet supported.
3092
If the author of the change is not the same person as the committer,
3093
you can specify the author's name using the --author option. The
3094
name should be in the same format as a committer-id, e.g.
3095
"John Doe <jdoe@example.com>". If there is more than one author of
3096
the change you can specify the option multiple times, once for each
3101
A common mistake is to forget to add a new file or directory before
3102
running the commit command. The --strict option checks for unknown
3103
files and aborts the commit if any are found. More advanced pre-commit
3104
checks can be implemented by defining hooks. See ``bzr help hooks``
3109
If you accidentially commit the wrong changes or make a spelling
3110
mistake in the commit message say, you can use the uncommit command
3111
to undo it. See ``bzr help uncommit`` for details.
3113
Hooks can also be configured to run after a commit. This allows you
3114
to trigger updates to external systems like bug trackers. The --fixes
3115
option can be used to record the association between a revision and
3116
one or more bugs. See ``bzr help bugs`` for details.
1805
# TODO: Run hooks on tree to-be-committed, and after commit.
1807
# TODO: Strict commit that fails if there are deleted files.
1808
# (what does "deleted files" mean ??)
1810
# TODO: Give better message for -s, --summary, used by tla people
1812
# XXX: verbose currently does nothing
3119
_see_also = ['add', 'bugs', 'hooks', 'uncommit']
1814
3120
takes_args = ['selected*']
1815
takes_options = ['message', 'verbose',
1817
help='commit even if nothing has changed'),
1818
Option('file', type=str,
1820
help='file containing commit message'),
1822
help="refuse to commit if there are unknown "
1823
"files in the working tree."),
1825
help="perform a local only commit in a bound "
1826
"branch. Such commits are not pushed to "
1827
"the master branch until a normal commit "
3122
ListOption('exclude', type=str, short_name='x',
3123
help="Do not consider changes made to a given path."),
3124
Option('message', type=unicode,
3126
help="Description of the new revision."),
3129
help='Commit even if nothing has changed.'),
3130
Option('file', type=str,
3133
help='Take commit message from this file.'),
3135
help="Refuse to commit if there are unknown "
3136
"files in the working tree."),
3137
Option('commit-time', type=str,
3138
help="Manually set a commit time using commit date "
3139
"format, e.g. '2009-10-10 08:00:00 +0100'."),
3140
ListOption('fixes', type=str,
3141
help="Mark a bug as being fixed by this revision "
3142
"(see \"bzr help bugs\")."),
3143
ListOption('author', type=unicode,
3144
help="Set the author's name, if it's different "
3145
"from the committer."),
3147
help="Perform a local commit in a bound "
3148
"branch. Local commits are not pushed to "
3149
"the master branch until a normal commit "
3152
Option('show-diff', short_name='p',
3153
help='When no message is supplied, show the diff along'
3154
' with the status summary in the message editor.'),
3156
help='When committing to a foreign version control '
3157
'system do not push data that can not be natively '
1831
3160
aliases = ['ci', 'checkin']
1833
def run(self, message=None, file=None, verbose=True, selected_list=None,
1834
unchanged=False, strict=False, local=False):
1835
from bzrlib.commit import (NullCommitReporter, ReportCommitToLog)
1836
from bzrlib.errors import (PointlessCommit, ConflictsInTree,
1838
from bzrlib.msgeditor import edit_commit_message, \
1839
make_commit_message_template
1841
# TODO: Need a blackbox test for invoking the external editor; may be
1842
# slightly problematic to run this cross-platform.
1844
# TODO: do more checks that the commit will succeed before
1845
# spending the user's valuable time typing a commit message.
1846
tree, selected_list = tree_files(selected_list)
3162
def _iter_bug_fix_urls(self, fixes, branch):
3163
# Configure the properties for bug fixing attributes.
3164
for fixed_bug in fixes:
3165
tokens = fixed_bug.split(':')
3166
if len(tokens) != 2:
3167
raise errors.BzrCommandError(
3168
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3169
"See \"bzr help bugs\" for more information on this "
3170
"feature.\nCommit refused." % fixed_bug)
3171
tag, bug_id = tokens
3173
yield bugtracker.get_bug_url(tag, branch, bug_id)
3174
except errors.UnknownBugTrackerAbbreviation:
3175
raise errors.BzrCommandError(
3176
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3177
except errors.MalformedBugIdentifier, e:
3178
raise errors.BzrCommandError(
3179
"%s\nCommit refused." % (str(e),))
3181
def run(self, message=None, file=None, verbose=False, selected_list=None,
3182
unchanged=False, strict=False, local=False, fixes=None,
3183
author=None, show_diff=False, exclude=None, commit_time=None,
3185
from bzrlib.errors import (
3190
from bzrlib.msgeditor import (
3191
edit_commit_message_encoded,
3192
generate_commit_message_template,
3193
make_commit_message_template_encoded
3196
commit_stamp = offset = None
3197
if commit_time is not None:
3199
commit_stamp, offset = timestamp.parse_patch_date(commit_time)
3200
except ValueError, e:
3201
raise errors.BzrCommandError(
3202
"Could not parse --commit-time: " + str(e))
3206
tree, selected_list = WorkingTree.open_containing_paths(selected_list)
1847
3207
if selected_list == ['']:
1848
3208
# workaround - commit of root of tree should be exactly the same
1849
3209
# as just default commit in that tree, and succeed even though
1850
3210
# selected-file merge commit is not done yet
1851
3211
selected_list = []
3215
bug_property = bugtracker.encode_fixes_bug_urls(
3216
self._iter_bug_fix_urls(fixes, tree.branch))
3218
properties['bugs'] = bug_property
1853
3220
if local and not tree.branch.get_bound_location():
1854
3221
raise errors.LocalRequiresBoundBranch()
3223
if message is not None:
3225
file_exists = osutils.lexists(message)
3226
except UnicodeError:
3227
# The commit message contains unicode characters that can't be
3228
# represented in the filesystem encoding, so that can't be a
3233
'The commit message is a file name: "%(f)s".\n'
3234
'(use --file "%(f)s" to take commit message from that file)'
3236
ui.ui_factory.show_warning(warning_msg)
3238
message = message.replace('\r\n', '\n')
3239
message = message.replace('\r', '\n')
3241
raise errors.BzrCommandError(
3242
"please specify either --message or --file")
1856
3244
def get_message(commit_obj):
1857
3245
"""Callback to get commit message"""
1858
my_message = message
1859
if my_message is None and not file:
1860
template = make_commit_message_template(tree, selected_list)
1861
my_message = edit_commit_message(template)
3249
my_message = f.read().decode(osutils.get_user_encoding())
3252
elif message is not None:
3253
my_message = message
3255
# No message supplied: make one up.
3256
# text is the status of the tree
3257
text = make_commit_message_template_encoded(tree,
3258
selected_list, diff=show_diff,
3259
output_encoding=osutils.get_user_encoding())
3260
# start_message is the template generated from hooks
3261
# XXX: Warning - looks like hooks return unicode,
3262
# make_commit_message_template_encoded returns user encoding.
3263
# We probably want to be using edit_commit_message instead to
3265
start_message = generate_commit_message_template(commit_obj)
3266
my_message = edit_commit_message_encoded(text,
3267
start_message=start_message)
1862
3268
if my_message is None:
1863
3269
raise errors.BzrCommandError("please specify a commit"
1864
3270
" message with either --message or --file")
1865
elif my_message and file:
1866
raise errors.BzrCommandError(
1867
"please specify either --message or --file")
1869
my_message = codecs.open(file, 'rt',
1870
bzrlib.user_encoding).read()
1871
3271
if my_message == "":
1872
3272
raise errors.BzrCommandError("empty commit message specified")
1873
3273
return my_message
1876
reporter = ReportCommitToLog()
1878
reporter = NullCommitReporter()
3275
# The API permits a commit with a filter of [] to mean 'select nothing'
3276
# but the command line should not do that.
3277
if not selected_list:
3278
selected_list = None
1881
3280
tree.commit(message_callback=get_message,
1882
3281
specific_files=selected_list,
1883
3282
allow_pointless=unchanged, strict=strict, local=local,
3283
reporter=None, verbose=verbose, revprops=properties,
3284
authors=author, timestamp=commit_stamp,
3286
exclude=tree.safe_relpath_files(exclude),
1885
3288
except PointlessCommit:
1886
# FIXME: This should really happen before the file is read in;
1887
# perhaps prepare the commit; get the message; then actually commit
1888
raise errors.BzrCommandError("no changes to commit."
1889
" use --unchanged to commit anyhow")
3289
raise errors.BzrCommandError("No changes to commit."
3290
" Please 'bzr add' the files you want to commit, or use"
3291
" --unchanged to force an empty commit.")
1890
3292
except ConflictsInTree:
1891
3293
raise errors.BzrCommandError('Conflicts detected in working '
1892
3294
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
1895
3297
raise errors.BzrCommandError("Commit refused because there are"
1896
3298
" unknown files in the working tree.")
1897
3299
except errors.BoundBranchOutOfDate, e:
1898
raise errors.BzrCommandError(str(e) + "\n"
1899
'To commit to master branch, run update and then commit.\n'
1900
'You can also pass --local to commit to continue working '
3300
e.extra_help = ("\n"
3301
'To commit to master branch, run update and then commit.\n'
3302
'You can also pass --local to commit to continue working '
1904
3307
class cmd_check(Command):
1905
"""Validate consistency of branch history.
1907
This command checks various invariants about the branch storage to
1908
detect data corruption or bzr bugs.
3308
__doc__ = """Validate working tree structure, branch consistency and repository history.
3310
This command checks various invariants about branch and repository storage
3311
to detect data corruption or bzr bugs.
3313
The working tree and branch checks will only give output if a problem is
3314
detected. The output fields of the repository check are:
3317
This is just the number of revisions checked. It doesn't
3321
This is just the number of versionedfiles checked. It
3322
doesn't indicate a problem.
3324
unreferenced ancestors
3325
Texts that are ancestors of other texts, but
3326
are not properly referenced by the revision ancestry. This is a
3327
subtle problem that Bazaar can work around.
3330
This is the total number of unique file contents
3331
seen in the checked revisions. It does not indicate a problem.
3334
This is the total number of repeated texts seen
3335
in the checked revisions. Texts can be repeated when their file
3336
entries are modified, but the file contents are not. It does not
3339
If no restrictions are specified, all Bazaar data that is found at the given
3340
location will be checked.
3344
Check the tree and branch at 'foo'::
3346
bzr check --tree --branch foo
3348
Check only the repository at 'bar'::
3350
bzr check --repo bar
3352
Check everything at 'baz'::
1910
takes_args = ['branch?']
1911
takes_options = ['verbose']
1913
def run(self, branch=None, verbose=False):
1914
from bzrlib.check import check
1916
tree = WorkingTree.open_containing()[0]
1917
branch = tree.branch
1919
branch = Branch.open(branch)
1920
check(branch, verbose)
3357
_see_also = ['reconcile']
3358
takes_args = ['path?']
3359
takes_options = ['verbose',
3360
Option('branch', help="Check the branch related to the"
3361
" current directory."),
3362
Option('repo', help="Check the repository related to the"
3363
" current directory."),
3364
Option('tree', help="Check the working tree related to"
3365
" the current directory.")]
3367
def run(self, path=None, verbose=False, branch=False, repo=False,
3369
from bzrlib.check import check_dwim
3372
if not branch and not repo and not tree:
3373
branch = repo = tree = True
3374
check_dwim(path, verbose, do_branch=branch, do_repo=repo, do_tree=tree)
1923
3377
class cmd_upgrade(Command):
1924
"""Upgrade branch storage to current format.
1926
The check command or bzr developers may sometimes advise you to run
1927
this command. When the default format has changed you may also be warned
1928
during other operations to upgrade.
3378
__doc__ = """Upgrade a repository, branch or working tree to a newer format.
3380
When the default format has changed after a major new release of
3381
Bazaar, you may be informed during certain operations that you
3382
should upgrade. Upgrading to a newer format may improve performance
3383
or make new features available. It may however limit interoperability
3384
with older repositories or with older versions of Bazaar.
3386
If you wish to upgrade to a particular format rather than the
3387
current default, that can be specified using the --format option.
3388
As a consequence, you can use the upgrade command this way to
3389
"downgrade" to an earlier format, though some conversions are
3390
a one way process (e.g. changing from the 1.x default to the
3391
2.x default) so downgrading is not always possible.
3393
A backup.bzr.~#~ directory is created at the start of the conversion
3394
process (where # is a number). By default, this is left there on
3395
completion. If the conversion fails, delete the new .bzr directory
3396
and rename this one back in its place. Use the --clean option to ask
3397
for the backup.bzr directory to be removed on successful conversion.
3398
Alternatively, you can delete it by hand if everything looks good
3401
If the location given is a shared repository, dependent branches
3402
are also converted provided the repository converts successfully.
3403
If the conversion of a branch fails, remaining branches are still
3406
For more information on upgrades, see the Bazaar Upgrade Guide,
3407
http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
3410
_see_also = ['check', 'reconcile', 'formats']
1930
3411
takes_args = ['url?']
1931
3412
takes_options = [
1933
help='Upgrade to a specific format. Current formats'
1934
' are: default, knit, metaweave and weave.'
1935
' Default is knit; metaweave and weave are'
1937
type=get_format_type),
1941
def run(self, url='.', format=None):
3413
RegistryOption('format',
3414
help='Upgrade to a specific format. See "bzr help'
3415
' formats" for details.',
3416
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3417
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3418
value_switches=True, title='Branch format'),
3420
help='Remove the backup.bzr directory if successful.'),
3422
help="Show what would be done, but don't actually do anything."),
3425
def run(self, url='.', format=None, clean=False, dry_run=False):
1942
3426
from bzrlib.upgrade import upgrade
1944
format = get_format_type('default')
1945
upgrade(url, format)
3427
exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3429
if len(exceptions) == 1:
3430
# Compatibility with historical behavior
1948
3436
class cmd_whoami(Command):
1949
"""Show or set bzr user id.
1953
bzr whoami 'Frank Chu <fchu@example.com>'
3437
__doc__ = """Show or set bzr user id.
3440
Show the email of the current user::
3444
Set the current user::
3446
bzr whoami "Frank Chu <fchu@example.com>"
1955
takes_options = [ Option('email',
1956
help='display email address only'),
3448
takes_options = [ 'directory',
3450
help='Display email address only.'),
1957
3451
Option('branch',
1958
help='set identity for the current branch instead of '
3452
help='Set identity for the current branch instead of '
1961
3455
takes_args = ['name?']
1962
3456
encoding_type = 'replace'
1964
3458
@display_command
1965
def run(self, email=False, branch=False, name=None):
3459
def run(self, email=False, branch=False, name=None, directory=None):
1966
3460
if name is None:
1967
# use branch if we're inside one; otherwise global config
1969
c = Branch.open_containing('.')[0].get_config()
1970
except errors.NotBranchError:
1971
c = config.GlobalConfig()
3461
if directory is None:
3462
# use branch if we're inside one; otherwise global config
3464
c = Branch.open_containing(u'.')[0].get_config()
3465
except errors.NotBranchError:
3466
c = _mod_config.GlobalConfig()
3468
c = Branch.open(directory).get_config()
1973
3470
self.outf.write(c.user_email() + '\n')
1975
3472
self.outf.write(c.username() + '\n')
3476
raise errors.BzrCommandError("--email can only be used to display existing "
1978
3479
# display a warning if an email address isn't included in the given name.
1980
config.extract_email_address(name)
3481
_mod_config.extract_email_address(name)
1981
3482
except errors.NoEmailInUsername, e:
1982
3483
warning('"%s" does not seem to contain an email address. '
1983
3484
'This is allowed, but not recommended.', name)
1985
3486
# use global config unless --branch given
1987
c = Branch.open_containing('.')[0].get_config()
3488
if directory is None:
3489
c = Branch.open_containing(u'.')[0].get_config()
3491
c = Branch.open(directory).get_config()
1989
c = config.GlobalConfig()
3493
c = _mod_config.GlobalConfig()
1990
3494
c.set_user_option('email', name)
1993
3497
class cmd_nick(Command):
1994
"""Print or set the branch nickname.
1996
If unset, the tree root directory name is used as the nickname
1997
To print the current nickname, execute with no argument.
3498
__doc__ = """Print or set the branch nickname.
3500
If unset, the tree root directory name is used as the nickname.
3501
To print the current nickname, execute with no argument.
3503
Bound branches use the nickname of its master branch unless it is set
3507
_see_also = ['info']
1999
3508
takes_args = ['nickname?']
2000
def run(self, nickname=None):
2001
branch = Branch.open_containing(u'.')[0]
3509
takes_options = ['directory']
3510
def run(self, nickname=None, directory=u'.'):
3511
branch = Branch.open_containing(directory)[0]
2002
3512
if nickname is None:
2003
3513
self.printme(branch)
2052
3659
takes_args = ['testspecs*']
2053
3660
takes_options = ['verbose',
2054
Option('one', help='stop when one test fails'),
2055
Option('keep-output',
2056
help='keep output directories when tests fail'),
3662
help='Stop when one test fails.',
2058
3666
help='Use a different transport by default '
2059
3667
'throughout the test suite.',
2060
3668
type=get_transport_type),
2061
Option('benchmark', help='run the bzr bencharks.'),
3670
help='Run the benchmarks rather than selftests.',
2062
3672
Option('lsprof-timed',
2063
help='generate lsprof output for benchmarked'
3673
help='Generate lsprof output for benchmarked'
2064
3674
' sections of code.'),
2065
Option('cache-dir', type=str,
2066
help='a directory to cache intermediate'
2067
' benchmark steps'),
3675
Option('lsprof-tests',
3676
help='Generate lsprof output for each test.'),
3678
help='Run all tests, but run specified tests first.',
3682
help='List the tests instead of running them.'),
3683
RegistryOption('parallel',
3684
help="Run the test suite in parallel.",
3685
lazy_registry=('bzrlib.tests', 'parallel_registry'),
3686
value_switches=False,
3688
Option('randomize', type=str, argname="SEED",
3689
help='Randomize the order of tests using the given'
3690
' seed or "now" for the current time.'),
3691
Option('exclude', type=str, argname="PATTERN",
3693
help='Exclude tests that match this regular'
3696
help='Output test progress via subunit.'),
3697
Option('strict', help='Fail on missing dependencies or '
3699
Option('load-list', type=str, argname='TESTLISTFILE',
3700
help='Load a test id list from a text file.'),
3701
ListOption('debugflag', type=str, short_name='E',
3702
help='Turn on a selftest debug flag.'),
3703
ListOption('starting-with', type=str, argname='TESTID',
3704
param_name='starting_with', short_name='s',
3706
'Load only the tests starting with TESTID.'),
2070
def run(self, testspecs_list=None, verbose=None, one=False,
2071
keep_output=False, transport=None, benchmark=None,
2072
lsprof_timed=None, cache_dir=None):
2074
from bzrlib.tests import selftest
2075
import bzrlib.benchmarks as benchmarks
2076
from bzrlib.benchmarks import tree_creator
2078
if cache_dir is not None:
2079
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
2080
print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
2081
print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
3708
encoding_type = 'replace'
3711
Command.__init__(self)
3712
self.additional_selftest_args = {}
3714
def run(self, testspecs_list=None, verbose=False, one=False,
3715
transport=None, benchmark=None,
3717
first=False, list_only=False,
3718
randomize=None, exclude=None, strict=False,
3719
load_list=None, debugflag=None, starting_with=None, subunit=False,
3720
parallel=None, lsprof_tests=False):
3721
from bzrlib import tests
2083
3723
if testspecs_list is not None:
2084
3724
pattern = '|'.join(testspecs_list)
3729
from bzrlib.tests import SubUnitBzrRunner
3731
raise errors.BzrCommandError("subunit not available. subunit "
3732
"needs to be installed to use --subunit.")
3733
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3734
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3735
# stdout, which would corrupt the subunit stream.
3736
# FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3737
# following code can be deleted when it's sufficiently deployed
3738
# -- vila/mgz 20100514
3739
if (sys.platform == "win32"
3740
and getattr(sys.stdout, 'fileno', None) is not None):
3742
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3744
self.additional_selftest_args.setdefault(
3745
'suite_decorators', []).append(parallel)
2088
test_suite_factory = benchmarks.test_suite
2091
# TODO: should possibly lock the history file...
2092
benchfile = open(".perf_history", "at")
2094
test_suite_factory = None
3747
raise errors.BzrCommandError(
3748
"--benchmark is no longer supported from bzr 2.2; "
3749
"use bzr-usertest instead")
3750
test_suite_factory = None
3751
selftest_kwargs = {"verbose": verbose,
3753
"stop_on_failure": one,
3754
"transport": transport,
3755
"test_suite_factory": test_suite_factory,
3756
"lsprof_timed": lsprof_timed,
3757
"lsprof_tests": lsprof_tests,
3758
"matching_tests_first": first,
3759
"list_only": list_only,
3760
"random_seed": randomize,
3761
"exclude_pattern": exclude,
3763
"load_list": load_list,
3764
"debug_flags": debugflag,
3765
"starting_with": starting_with
3767
selftest_kwargs.update(self.additional_selftest_args)
3769
# Make deprecation warnings visible, unless -Werror is set
3770
cleanup = symbol_versioning.activate_deprecation_warnings(
2099
result = selftest(verbose=verbose,
2101
stop_on_failure=one,
2102
keep_output=keep_output,
2103
transport=transport,
2104
test_suite_factory=test_suite_factory,
2105
lsprof_timed=lsprof_timed,
2106
bench_history=benchfile)
3773
result = tests.selftest(**selftest_kwargs)
2108
if benchfile is not None:
2111
info('tests passed')
2113
info('tests failed')
2114
3776
return int(not result)
2117
3779
class cmd_version(Command):
2118
"""Show version of bzr."""
3780
__doc__ = """Show version of bzr."""
3782
encoding_type = 'replace'
3784
Option("short", help="Print just the version number."),
2120
3787
@display_command
3788
def run(self, short=False):
2122
3789
from bzrlib.version import show_version
3791
self.outf.write(bzrlib.version_string + '\n')
3793
show_version(to_file=self.outf)
2126
3796
class cmd_rocks(Command):
2127
"""Statement of optimism."""
3797
__doc__ = """Statement of optimism."""
2131
3801
@display_command
2133
print "it sure does!"
3803
self.outf.write("It sure does!\n")
2136
3806
class cmd_find_merge_base(Command):
2137
"""Find and print a base revision for merging two branches."""
3807
__doc__ = """Find and print a base revision for merging two branches."""
2138
3808
# TODO: Options to specify revisions on either side, as if
2139
3809
# merging only part of the history.
2140
3810
takes_args = ['branch', 'other']
2143
3813
@display_command
2144
3814
def run(self, branch, other):
2145
from bzrlib.revision import MultipleRevisionSources
3815
from bzrlib.revision import ensure_null
2147
3817
branch1 = Branch.open_containing(branch)[0]
2148
3818
branch2 = Branch.open_containing(other)[0]
2150
history_1 = branch1.revision_history()
2151
history_2 = branch2.revision_history()
2153
last1 = branch1.last_revision()
2154
last2 = branch2.last_revision()
2156
source = MultipleRevisionSources(branch1.repository,
2159
base_rev_id = common_ancestor(last1, last2, source)
2161
print 'merge base is revision %s' % base_rev_id
3819
self.add_cleanup(branch1.lock_read().unlock)
3820
self.add_cleanup(branch2.lock_read().unlock)
3821
last1 = ensure_null(branch1.last_revision())
3822
last2 = ensure_null(branch2.last_revision())
3824
graph = branch1.repository.get_graph(branch2.repository)
3825
base_rev_id = graph.find_unique_lca(last1, last2)
3827
self.outf.write('merge base is revision %s\n' % base_rev_id)
2164
3830
class cmd_merge(Command):
2165
"""Perform a three-way merge.
2167
The branch is the branch you will merge from. By default, it will merge
2168
the latest revision. If you specify a revision, that revision will be
2169
merged. If you specify two revisions, the first will be used as a BASE,
2170
and the second one as OTHER. Revision numbers are always relative to the
2173
By default, bzr will try to merge in all new work from the other
2174
branch, automatically determining an appropriate base. If this
2175
fails, you may need to give an explicit base.
3831
__doc__ = """Perform a three-way merge.
3833
The source of the merge can be specified either in the form of a branch,
3834
or in the form of a path to a file containing a merge directive generated
3835
with bzr send. If neither is specified, the default is the upstream branch
3836
or the branch most recently merged using --remember.
3838
When merging from a branch, by default bzr will try to merge in all new
3839
work from the other branch, automatically determining an appropriate base
3840
revision. If this fails, you may need to give an explicit base.
3842
To pick a different ending revision, pass "--revision OTHER". bzr will
3843
try to merge in all new work up to and including revision OTHER.
3845
If you specify two values, "--revision BASE..OTHER", only revisions BASE
3846
through OTHER, excluding BASE but including OTHER, will be merged. If this
3847
causes some revisions to be skipped, i.e. if the destination branch does
3848
not already contain revision BASE, such a merge is commonly referred to as
3851
Revision numbers are always relative to the source branch.
2177
3853
Merge will do its best to combine the changes in two branches, but there
2178
3854
are some kinds of problems only a human can fix. When it encounters those,
2179
3855
it will mark a conflict. A conflict means that you need to fix something,
2186
3862
default, use --remember. The value will only be saved if the remote
2187
3863
location can be accessed.
2191
To merge the latest revision from bzr.dev
2192
bzr merge ../bzr.dev
2194
To merge changes up to and including revision 82 from bzr.dev
2195
bzr merge -r 82 ../bzr.dev
2197
To merge the changes introduced by 82, without previous changes:
2198
bzr merge -r 81..82 ../bzr.dev
3865
The results of the merge are placed into the destination working
3866
directory, where they can be reviewed (with bzr diff), tested, and then
3867
committed to record the result of the merge.
2200
3869
merge refuses to run if there are any uncommitted changes, unless
2203
The following merge types are available:
3870
--force is given. The --force option can also be used to create a
3871
merge revision which has more than two parents.
3873
If one would like to merge changes from the working tree of the other
3874
branch without merging any committed revisions, the --uncommitted option
3877
To select only some changes to merge, use "merge -i", which will prompt
3878
you to apply each diff hunk and file change, similar to "shelve".
3881
To merge all new revisions from bzr.dev::
3883
bzr merge ../bzr.dev
3885
To merge changes up to and including revision 82 from bzr.dev::
3887
bzr merge -r 82 ../bzr.dev
3889
To merge the changes introduced by 82, without previous changes::
3891
bzr merge -r 81..82 ../bzr.dev
3893
To apply a merge directive contained in /tmp/merge::
3895
bzr merge /tmp/merge
3897
To create a merge revision with three parents from two branches
3898
feature1a and feature1b:
3900
bzr merge ../feature1a
3901
bzr merge ../feature1b --force
3902
bzr commit -m 'revision with three parents'
2205
takes_args = ['branch?']
2206
takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
2207
Option('show-base', help="Show base revision text in "
2209
Option('uncommitted', help='Apply uncommitted changes'
2210
' from a working copy, instead of branch changes')]
2213
from inspect import getdoc
2214
return getdoc(self) + '\n' + _mod_merge.merge_type_help()
2216
def run(self, branch=None, revision=None, force=False, merge_type=None,
2217
show_base=False, reprocess=False, remember=False,
3905
encoding_type = 'exact'
3906
_see_also = ['update', 'remerge', 'status-flags', 'send']
3907
takes_args = ['location?']
3912
help='Merge even if the destination tree has uncommitted changes.'),
3916
Option('show-base', help="Show base revision text in "
3918
Option('uncommitted', help='Apply uncommitted changes'
3919
' from a working copy, instead of branch changes.'),
3920
Option('pull', help='If the destination is already'
3921
' completely merged into the source, pull from the'
3922
' source rather than merging. When this happens,'
3923
' you do not need to commit the result.'),
3924
custom_help('directory',
3925
help='Branch to merge into, '
3926
'rather than the one containing the working directory.'),
3927
Option('preview', help='Instead of merging, show a diff of the'
3929
Option('interactive', help='Select changes interactively.',
3933
def run(self, location=None, revision=None, force=False,
3934
merge_type=None, show_base=False, reprocess=None, remember=False,
3935
uncommitted=False, pull=False,
2219
3940
if merge_type is None:
2220
3941
merge_type = _mod_merge.Merge3Merger
2222
tree = WorkingTree.open_containing(u'.')[0]
2224
if branch is not None:
3943
if directory is None: directory = u'.'
3944
possible_transports = []
3946
allow_pending = True
3947
verified = 'inapplicable'
3948
tree = WorkingTree.open_containing(directory)[0]
3951
basis_tree = tree.revision_tree(tree.last_revision())
3952
except errors.NoSuchRevision:
3953
basis_tree = tree.basis_tree()
3955
# die as quickly as possible if there are uncommitted changes
3957
if tree.has_changes():
3958
raise errors.UncommittedChanges(tree)
3960
view_info = _get_view_info_for_change_reporter(tree)
3961
change_reporter = delta._ChangeReporter(
3962
unversioned_filter=tree.is_ignored, view_info=view_info)
3963
pb = ui.ui_factory.nested_progress_bar()
3964
self.add_cleanup(pb.finished)
3965
self.add_cleanup(tree.lock_write().unlock)
3966
if location is not None:
2226
reader = bundle.read_bundle_from_url(branch)
3968
mergeable = bundle.read_mergeable_from_url(location,
3969
possible_transports=possible_transports)
2227
3970
except errors.NotABundle:
2228
pass # Continue on considering this url a Branch
2230
conflicts = merge_bundle(reader, tree, not force, merge_type,
2231
reprocess, show_base)
2237
if revision is None \
2238
or len(revision) < 1 or revision[0].needs_branch():
2239
branch = self._get_remembered_parent(tree, branch, 'Merging from')
2241
if revision is None or len(revision) < 1:
2244
other = [branch, None]
2247
other = [branch, -1]
2248
other_branch, path = Branch.open_containing(branch)
3974
raise errors.BzrCommandError('Cannot use --uncommitted'
3975
' with bundles or merge directives.')
3977
if revision is not None:
3978
raise errors.BzrCommandError(
3979
'Cannot use -r with merge directives or bundles')
3980
merger, verified = _mod_merge.Merger.from_mergeable(tree,
3983
if merger is None and uncommitted:
3984
if revision is not None and len(revision) > 0:
2251
3985
raise errors.BzrCommandError('Cannot use --uncommitted and'
2252
' --revision at the same time.')
2253
branch = revision[0].get_branch() or branch
2254
if len(revision) == 1:
2256
other_branch, path = Branch.open_containing(branch)
2257
revno = revision[0].in_history(other_branch).revno
2258
other = [branch, revno]
2260
assert len(revision) == 2
2261
if None in revision:
2262
raise errors.BzrCommandError(
2263
"Merge doesn't permit empty revision specifier.")
2264
base_branch, path = Branch.open_containing(branch)
2265
branch1 = revision[1].get_branch() or branch
2266
other_branch, path1 = Branch.open_containing(branch1)
2267
if revision[0].get_branch() is not None:
2268
# then path was obtained from it, and is None.
2271
base = [branch, revision[0].in_history(base_branch).revno]
2272
other = [branch1, revision[1].in_history(other_branch).revno]
2274
if tree.branch.get_parent() is None or remember:
2275
tree.branch.set_parent(other_branch.base)
2278
interesting_files = [path]
2280
interesting_files = None
2281
pb = ui.ui_factory.nested_progress_bar()
3986
' --revision at the same time.')
3987
merger = self.get_merger_from_uncommitted(tree, location, None)
3988
allow_pending = False
3991
merger, allow_pending = self._get_merger_from_branch(tree,
3992
location, revision, remember, possible_transports, None)
3994
merger.merge_type = merge_type
3995
merger.reprocess = reprocess
3996
merger.show_base = show_base
3997
self.sanity_check_merger(merger)
3998
if (merger.base_rev_id == merger.other_rev_id and
3999
merger.other_rev_id is not None):
4000
note('Nothing to do.')
4002
if pull and not preview:
4003
if merger.interesting_files is not None:
4004
raise errors.BzrCommandError('Cannot pull individual files')
4005
if (merger.base_rev_id == tree.last_revision()):
4006
result = tree.pull(merger.other_branch, False,
4007
merger.other_rev_id)
4008
result.report(self.outf)
4010
if merger.this_basis is None:
4011
raise errors.BzrCommandError(
4012
"This branch has no commits."
4013
" (perhaps you would prefer 'bzr pull')")
4015
return self._do_preview(merger)
4017
return self._do_interactive(merger)
4019
return self._do_merge(merger, change_reporter, allow_pending,
4022
def _get_preview(self, merger):
4023
tree_merger = merger.make_merger()
4024
tt = tree_merger.make_preview_transform()
4025
self.add_cleanup(tt.finalize)
4026
result_tree = tt.get_preview_tree()
4029
def _do_preview(self, merger):
4030
from bzrlib.diff import show_diff_trees
4031
result_tree = self._get_preview(merger)
4032
path_encoding = osutils.get_diff_header_encoding()
4033
show_diff_trees(merger.this_tree, result_tree, self.outf,
4034
old_label='', new_label='',
4035
path_encoding=path_encoding)
4037
def _do_merge(self, merger, change_reporter, allow_pending, verified):
4038
merger.change_reporter = change_reporter
4039
conflict_count = merger.do_merge()
4041
merger.set_pending()
4042
if verified == 'failed':
4043
warning('Preview patch does not match changes')
4044
if conflict_count != 0:
4049
def _do_interactive(self, merger):
4050
"""Perform an interactive merge.
4052
This works by generating a preview tree of the merge, then using
4053
Shelver to selectively remove the differences between the working tree
4054
and the preview tree.
4056
from bzrlib import shelf_ui
4057
result_tree = self._get_preview(merger)
4058
writer = bzrlib.option.diff_writer_registry.get()
4059
shelver = shelf_ui.Shelver(merger.this_tree, result_tree, destroy=True,
4060
reporter=shelf_ui.ApplyReporter(),
4061
diff_writer=writer(sys.stdout))
2284
conflict_count = _merge_helper(
2285
other, base, check_clean=(not force),
2286
merge_type=merge_type,
2287
reprocess=reprocess,
2288
show_base=show_base,
2289
pb=pb, file_list=interesting_files)
2292
if conflict_count != 0:
4067
def sanity_check_merger(self, merger):
4068
if (merger.show_base and
4069
not merger.merge_type is _mod_merge.Merge3Merger):
4070
raise errors.BzrCommandError("Show-base is not supported for this"
4071
" merge type. %s" % merger.merge_type)
4072
if merger.reprocess is None:
4073
if merger.show_base:
4074
merger.reprocess = False
2296
except errors.AmbiguousBase, e:
2297
m = ("sorry, bzr can't determine the right merge base yet\n"
2298
"candidates are:\n "
2299
+ "\n ".join(e.bases)
2301
"please specify an explicit base with -r,\n"
2302
"and (if you want) report this to the bzr developers\n")
2305
# TODO: move up to common parent; this isn't merge-specific anymore.
2306
def _get_remembered_parent(self, tree, supplied_location, verb_string):
4076
# Use reprocess if the merger supports it
4077
merger.reprocess = merger.merge_type.supports_reprocess
4078
if merger.reprocess and not merger.merge_type.supports_reprocess:
4079
raise errors.BzrCommandError("Conflict reduction is not supported"
4080
" for merge type %s." %
4082
if merger.reprocess and merger.show_base:
4083
raise errors.BzrCommandError("Cannot do conflict reduction and"
4086
def _get_merger_from_branch(self, tree, location, revision, remember,
4087
possible_transports, pb):
4088
"""Produce a merger from a location, assuming it refers to a branch."""
4089
from bzrlib.tag import _merge_tags_if_possible
4090
# find the branch locations
4091
other_loc, user_location = self._select_branch_location(tree, location,
4093
if revision is not None and len(revision) == 2:
4094
base_loc, _unused = self._select_branch_location(tree,
4095
location, revision, 0)
4097
base_loc = other_loc
4099
other_branch, other_path = Branch.open_containing(other_loc,
4100
possible_transports)
4101
if base_loc == other_loc:
4102
base_branch = other_branch
4104
base_branch, base_path = Branch.open_containing(base_loc,
4105
possible_transports)
4106
# Find the revision ids
4107
other_revision_id = None
4108
base_revision_id = None
4109
if revision is not None:
4110
if len(revision) >= 1:
4111
other_revision_id = revision[-1].as_revision_id(other_branch)
4112
if len(revision) == 2:
4113
base_revision_id = revision[0].as_revision_id(base_branch)
4114
if other_revision_id is None:
4115
other_revision_id = _mod_revision.ensure_null(
4116
other_branch.last_revision())
4117
# Remember where we merge from
4118
if ((remember or tree.branch.get_submit_branch() is None) and
4119
user_location is not None):
4120
tree.branch.set_submit_branch(other_branch.base)
4121
# Merge tags (but don't set them in the master branch yet, the user
4122
# might revert this merge). Commit will propagate them.
4123
_merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
4124
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4125
other_revision_id, base_revision_id, other_branch, base_branch)
4126
if other_path != '':
4127
allow_pending = False
4128
merger.interesting_files = [other_path]
4130
allow_pending = True
4131
return merger, allow_pending
4133
def get_merger_from_uncommitted(self, tree, location, pb):
4134
"""Get a merger for uncommitted changes.
4136
:param tree: The tree the merger should apply to.
4137
:param location: The location containing uncommitted changes.
4138
:param pb: The progress bar to use for showing progress.
4140
location = self._select_branch_location(tree, location)[0]
4141
other_tree, other_path = WorkingTree.open_containing(location)
4142
merger = _mod_merge.Merger.from_uncommitted(tree, other_tree, pb)
4143
if other_path != '':
4144
merger.interesting_files = [other_path]
4147
def _select_branch_location(self, tree, user_location, revision=None,
4149
"""Select a branch location, according to possible inputs.
4151
If provided, branches from ``revision`` are preferred. (Both
4152
``revision`` and ``index`` must be supplied.)
4154
Otherwise, the ``location`` parameter is used. If it is None, then the
4155
``submit`` or ``parent`` location is used, and a note is printed.
4157
:param tree: The working tree to select a branch for merging into
4158
:param location: The location entered by the user
4159
:param revision: The revision parameter to the command
4160
:param index: The index to use for the revision parameter. Negative
4161
indices are permitted.
4162
:return: (selected_location, user_location). The default location
4163
will be the user-entered location.
4165
if (revision is not None and index is not None
4166
and revision[index] is not None):
4167
branch = revision[index].get_branch()
4168
if branch is not None:
4169
return branch, branch
4170
if user_location is None:
4171
location = self._get_remembered(tree, 'Merging from')
4173
location = user_location
4174
return location, user_location
4176
def _get_remembered(self, tree, verb_string):
2307
4177
"""Use tree.branch's parent if none was supplied.
2309
4179
Report if the remembered location was used.
2311
if supplied_location is not None:
2312
return supplied_location
2313
stored_location = tree.branch.get_parent()
4181
stored_location = tree.branch.get_submit_branch()
4182
stored_location_type = "submit"
4183
if stored_location is None:
4184
stored_location = tree.branch.get_parent()
4185
stored_location_type = "parent"
2314
4186
mutter("%s", stored_location)
2315
4187
if stored_location is None:
2316
4188
raise errors.BzrCommandError("No location specified or remembered")
2317
display_url = urlutils.unescape_for_display(stored_location, self.outf.encoding)
2318
self.outf.write("%s remembered location %s\n" % (verb_string, display_url))
4189
display_url = urlutils.unescape_for_display(stored_location, 'utf-8')
4190
note(u"%s remembered %s location %s", verb_string,
4191
stored_location_type, display_url)
2319
4192
return stored_location
2322
4195
class cmd_remerge(Command):
4196
__doc__ = """Redo a merge.
2325
4198
Use this if you want to try a different merge technique while resolving
2326
conflicts. Some merge techniques are better than others, and remerge
4199
conflicts. Some merge techniques are better than others, and remerge
2327
4200
lets you try different ones on different files.
2329
4202
The options for remerge have the same meaning and defaults as the ones for
2330
4203
merge. The difference is that remerge can (only) be run when there is a
2331
4204
pending merge, and it lets you specify particular files.
2334
$ bzr remerge --show-base
2335
4207
Re-do the merge of all conflicted files, and show the base text in
2336
conflict regions, in addition to the usual THIS and OTHER texts.
2338
$ bzr remerge --merge-type weave --reprocess foobar
4208
conflict regions, in addition to the usual THIS and OTHER texts::
4210
bzr remerge --show-base
2339
4212
Re-do the merge of "foobar", using the weave merge algorithm, with
2340
additional processing to reduce the size of conflict regions.
2342
The following merge types are available:"""
4213
additional processing to reduce the size of conflict regions::
4215
bzr remerge --merge-type weave --reprocess foobar
2343
4217
takes_args = ['file*']
2344
takes_options = ['merge-type', 'reprocess',
2345
Option('show-base', help="Show base revision text in "
2349
from inspect import getdoc
2350
return getdoc(self) + '\n' + _mod_merge.merge_type_help()
4222
help="Show base revision text in conflicts."),
2352
4225
def run(self, file_list=None, merge_type=None, show_base=False,
2353
4226
reprocess=False):
4227
from bzrlib.conflicts import restore
2354
4228
if merge_type is None:
2355
4229
merge_type = _mod_merge.Merge3Merger
2356
tree, file_list = tree_files(file_list)
4230
tree, file_list = WorkingTree.open_containing_paths(file_list)
4231
self.add_cleanup(tree.lock_write().unlock)
4232
parents = tree.get_parent_ids()
4233
if len(parents) != 2:
4234
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4235
" merges. Not cherrypicking or"
4237
repository = tree.branch.repository
4238
interesting_ids = None
4240
conflicts = tree.conflicts()
4241
if file_list is not None:
4242
interesting_ids = set()
4243
for filename in file_list:
4244
file_id = tree.path2id(filename)
4246
raise errors.NotVersionedError(filename)
4247
interesting_ids.add(file_id)
4248
if tree.kind(file_id) != "directory":
4251
for name, ie in tree.inventory.iter_entries(file_id):
4252
interesting_ids.add(ie.file_id)
4253
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
4255
# Remerge only supports resolving contents conflicts
4256
allowed_conflicts = ('text conflict', 'contents conflict')
4257
restore_files = [c.path for c in conflicts
4258
if c.typestring in allowed_conflicts]
4259
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
4260
tree.set_conflicts(ConflictList(new_conflicts))
4261
if file_list is not None:
4262
restore_files = file_list
4263
for filename in restore_files:
4265
restore(tree.abspath(filename))
4266
except errors.NotConflicted:
4268
# Disable pending merges, because the file texts we are remerging
4269
# have not had those merges performed. If we use the wrong parents
4270
# list, we imply that the working tree text has seen and rejected
4271
# all the changes from the other tree, when in fact those changes
4272
# have not yet been seen.
4273
tree.set_parent_ids(parents[:1])
2359
parents = tree.get_parent_ids()
2360
if len(parents) != 2:
2361
raise errors.BzrCommandError("Sorry, remerge only works after normal"
2362
" merges. Not cherrypicking or"
2364
repository = tree.branch.repository
2365
base_revision = common_ancestor(parents[0],
2366
parents[1], repository)
2367
base_tree = repository.revision_tree(base_revision)
2368
other_tree = repository.revision_tree(parents[1])
2369
interesting_ids = None
2371
conflicts = tree.conflicts()
2372
if file_list is not None:
2373
interesting_ids = set()
2374
for filename in file_list:
2375
file_id = tree.path2id(filename)
2377
raise errors.NotVersionedError(filename)
2378
interesting_ids.add(file_id)
2379
if tree.kind(file_id) != "directory":
2382
for name, ie in tree.inventory.iter_entries(file_id):
2383
interesting_ids.add(ie.file_id)
2384
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
2386
# Remerge only supports resolving contents conflicts
2387
allowed_conflicts = ('text conflict', 'contents conflict')
2388
restore_files = [c.path for c in conflicts
2389
if c.typestring in allowed_conflicts]
2390
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
2391
tree.set_conflicts(ConflictList(new_conflicts))
2392
if file_list is not None:
2393
restore_files = file_list
2394
for filename in restore_files:
2396
restore(tree.abspath(filename))
2397
except errors.NotConflicted:
2399
conflicts = _mod_merge.merge_inner(
2400
tree.branch, other_tree, base_tree,
2402
interesting_ids=interesting_ids,
2403
other_rev_id=parents[1],
2404
merge_type=merge_type,
2405
show_base=show_base,
2406
reprocess=reprocess)
4275
merger = _mod_merge.Merger.from_revision_ids(None, tree, parents[1])
4276
merger.interesting_ids = interesting_ids
4277
merger.merge_type = merge_type
4278
merger.show_base = show_base
4279
merger.reprocess = reprocess
4280
conflicts = merger.do_merge()
4282
tree.set_parent_ids(parents)
2409
4283
if conflicts > 0:
2491
4390
class cmd_shell_complete(Command):
2492
"""Show appropriate completions for context.
4391
__doc__ = """Show appropriate completions for context.
2494
4393
For a list of all available commands, say 'bzr shell-complete'.
2496
4395
takes_args = ['context?']
2497
4396
aliases = ['s-c']
2500
4399
@display_command
2501
4400
def run(self, context=None):
2502
4401
import shellcomplete
2503
4402
shellcomplete.shellcomplete(context)
2506
class cmd_fetch(Command):
2507
"""Copy in history from another branch but don't merge it.
2509
This is an internal method used for pull and merge.
2512
takes_args = ['from_branch', 'to_branch']
2513
def run(self, from_branch, to_branch):
2514
from bzrlib.fetch import Fetcher
2515
from_b = Branch.open(from_branch)
2516
to_b = Branch.open(to_branch)
2517
Fetcher(to_b, from_b)
2520
4405
class cmd_missing(Command):
2521
"""Show unmerged/unpulled revisions between two branches.
4406
__doc__ = """Show unmerged/unpulled revisions between two branches.
2523
4408
OTHER_BRANCH may be local or remote.
4410
To filter on a range of revisions, you can use the command -r begin..end
4411
-r revision requests a specific revision, -r ..end or -r begin.. are
4415
1 - some missing revisions
4416
0 - no missing revisions
4420
Determine the missing revisions between this and the branch at the
4421
remembered pull location::
4425
Determine the missing revisions between this and another branch::
4427
bzr missing http://server/branch
4429
Determine the missing revisions up to a specific revision on the other
4432
bzr missing -r ..-10
4434
Determine the missing revisions up to a specific revision on this
4437
bzr missing --my-revision ..-10
4440
_see_also = ['merge', 'pull']
2525
4441
takes_args = ['other_branch?']
2526
takes_options = [Option('reverse', 'Reverse the order of revisions'),
2528
'Display changes in the local branch only'),
2529
Option('theirs-only',
2530
'Display changes in the remote branch only'),
4444
Option('reverse', 'Reverse the order of revisions.'),
4446
'Display changes in the local branch only.'),
4447
Option('this' , 'Same as --mine-only.'),
4448
Option('theirs-only',
4449
'Display changes in the remote branch only.'),
4450
Option('other', 'Same as --theirs-only.'),
4454
custom_help('revision',
4455
help='Filter on other branch revisions (inclusive). '
4456
'See "help revisionspec" for details.'),
4457
Option('my-revision',
4458
type=_parse_revision_str,
4459
help='Filter on local branch revisions (inclusive). '
4460
'See "help revisionspec" for details.'),
4461
Option('include-merges',
4462
'Show all revisions in addition to the mainline ones.'),
2538
4464
encoding_type = 'replace'
2540
4466
@display_command
2541
4467
def run(self, other_branch=None, reverse=False, mine_only=False,
2542
theirs_only=False, log_format=None, long=False, short=False, line=False,
2543
show_ids=False, verbose=False):
2544
from bzrlib.missing import find_unmerged, iter_log_data
2545
from bzrlib.log import log_formatter
2546
local_branch = Branch.open_containing(u".")[0]
4469
log_format=None, long=False, short=False, line=False,
4470
show_ids=False, verbose=False, this=False, other=False,
4471
include_merges=False, revision=None, my_revision=None,
4473
from bzrlib.missing import find_unmerged, iter_log_revisions
4482
# TODO: We should probably check that we don't have mine-only and
4483
# theirs-only set, but it gets complicated because we also have
4484
# this and other which could be used.
4491
local_branch = Branch.open_containing(directory)[0]
4492
self.add_cleanup(local_branch.lock_read().unlock)
2547
4494
parent = local_branch.get_parent()
2548
4495
if other_branch is None:
2549
4496
other_branch = parent
2550
4497
if other_branch is None:
2551
raise errors.BzrCommandError("No peer location known or specified.")
2552
print "Using last location: " + local_branch.get_parent()
4498
raise errors.BzrCommandError("No peer location known"
4500
display_url = urlutils.unescape_for_display(parent,
4502
message("Using saved parent location: "
4503
+ display_url + "\n")
2553
4505
remote_branch = Branch.open(other_branch)
2554
4506
if remote_branch.base == local_branch.base:
2555
4507
remote_branch = local_branch
2556
local_branch.lock_read()
2558
remote_branch.lock_read()
2560
local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
2561
if (log_format is None):
2562
default = local_branch.get_config().log_format()
2563
log_format = get_log_format(long=long, short=short,
2564
line=line, default=default)
2565
lf = log_formatter(log_format,
2568
show_timezone='original')
2569
if reverse is False:
2570
local_extra.reverse()
2571
remote_extra.reverse()
2572
if local_extra and not theirs_only:
2573
print "You have %d extra revision(s):" % len(local_extra)
2574
for data in iter_log_data(local_extra, local_branch.repository,
2577
printed_local = True
2579
printed_local = False
2580
if remote_extra and not mine_only:
2581
if printed_local is True:
2583
print "You are missing %d revision(s):" % len(remote_extra)
2584
for data in iter_log_data(remote_extra, remote_branch.repository,
2587
if not remote_extra and not local_extra:
2589
print "Branches are up to date."
2593
remote_branch.unlock()
2595
local_branch.unlock()
4509
self.add_cleanup(remote_branch.lock_read().unlock)
4511
local_revid_range = _revision_range_to_revid_range(
4512
_get_revision_range(my_revision, local_branch,
4515
remote_revid_range = _revision_range_to_revid_range(
4516
_get_revision_range(revision,
4517
remote_branch, self.name()))
4519
local_extra, remote_extra = find_unmerged(
4520
local_branch, remote_branch, restrict,
4521
backward=not reverse,
4522
include_merges=include_merges,
4523
local_revid_range=local_revid_range,
4524
remote_revid_range=remote_revid_range)
4526
if log_format is None:
4527
registry = log.log_formatter_registry
4528
log_format = registry.get_default(local_branch)
4529
lf = log_format(to_file=self.outf,
4531
show_timezone='original')
4534
if local_extra and not theirs_only:
4535
message("You have %d extra revision(s):\n" %
4537
for revision in iter_log_revisions(local_extra,
4538
local_branch.repository,
4540
lf.log_revision(revision)
4541
printed_local = True
4544
printed_local = False
4546
if remote_extra and not mine_only:
4547
if printed_local is True:
4549
message("You are missing %d revision(s):\n" %
4551
for revision in iter_log_revisions(remote_extra,
4552
remote_branch.repository,
4554
lf.log_revision(revision)
4557
if mine_only and not local_extra:
4558
# We checked local, and found nothing extra
4559
message('This branch is up to date.\n')
4560
elif theirs_only and not remote_extra:
4561
# We checked remote, and found nothing extra
4562
message('Other branch is up to date.\n')
4563
elif not (mine_only or theirs_only or local_extra or
4565
# We checked both branches, and neither one had extra
4567
message("Branches are up to date.\n")
2596
4569
if not status_code and parent is None and other_branch is not None:
2597
local_branch.lock_write()
2599
# handle race conditions - a parent might be set while we run.
2600
if local_branch.get_parent() is None:
2601
local_branch.set_parent(remote_branch.base)
2603
local_branch.unlock()
4570
self.add_cleanup(local_branch.lock_write().unlock)
4571
# handle race conditions - a parent might be set while we run.
4572
if local_branch.get_parent() is None:
4573
local_branch.set_parent(remote_branch.base)
2604
4574
return status_code
4577
class cmd_pack(Command):
4578
__doc__ = """Compress the data within a repository.
4580
This operation compresses the data within a bazaar repository. As
4581
bazaar supports automatic packing of repository, this operation is
4582
normally not required to be done manually.
4584
During the pack operation, bazaar takes a backup of existing repository
4585
data, i.e. pack files. This backup is eventually removed by bazaar
4586
automatically when it is safe to do so. To save disk space by removing
4587
the backed up pack files, the --clean-obsolete-packs option may be
4590
Warning: If you use --clean-obsolete-packs and your machine crashes
4591
during or immediately after repacking, you may be left with a state
4592
where the deletion has been written to disk but the new packs have not
4593
been. In this case the repository may be unusable.
4596
_see_also = ['repositories']
4597
takes_args = ['branch_or_repo?']
4599
Option('clean-obsolete-packs', 'Delete obsolete packs to save disk space.'),
4602
def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4603
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4605
branch = dir.open_branch()
4606
repository = branch.repository
4607
except errors.NotBranchError:
4608
repository = dir.open_repository()
4609
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
2607
4612
class cmd_plugins(Command):
4613
__doc__ = """List the installed plugins.
4615
This command displays the list of installed plugins including
4616
version of plugin and a short description of each.
4618
--verbose shows the path where each plugin is located.
4620
A plugin is an external component for Bazaar that extends the
4621
revision control system, by adding or replacing code in Bazaar.
4622
Plugins can do a variety of things, including overriding commands,
4623
adding new commands, providing additional network transports and
4624
customizing log output.
4626
See the Bazaar Plugin Guide <http://doc.bazaar.canonical.com/plugins/en/>
4627
for further information on plugins including where to find them and how to
4628
install them. Instructions are also provided there on how to write new
4629
plugins using the Python programming language.
4631
takes_options = ['verbose']
2610
4633
@display_command
2612
import bzrlib.plugin
2613
from inspect import getdoc
2614
for name, plugin in bzrlib.plugin.all_plugins().items():
2615
if getattr(plugin, '__path__', None) is not None:
2616
print plugin.__path__[0]
2617
elif getattr(plugin, '__file__', None) is not None:
2618
print plugin.__file__
2624
print '\t', d.split('\n')[0]
4634
def run(self, verbose=False):
4635
from bzrlib import plugin
4636
self.outf.writelines(
4637
plugin.describe_plugins(show_paths=verbose))
2627
4640
class cmd_testament(Command):
2628
"""Show testament (signing-form) of a revision."""
2629
takes_options = ['revision',
2630
Option('long', help='Produce long-format testament'),
2631
Option('strict', help='Produce a strict-format'
4641
__doc__ = """Show testament (signing-form) of a revision."""
4644
Option('long', help='Produce long-format testament.'),
4646
help='Produce a strict-format testament.')]
2633
4647
takes_args = ['branch?']
2634
4648
@display_command
2635
4649
def run(self, branch=u'.', revision=None, long=False, strict=False):
2892
5012
class cmd_serve(Command):
2893
"""Run the bzr server."""
5013
__doc__ = """Run the bzr server."""
2895
5015
aliases = ['server']
2897
5017
takes_options = [
2899
help='serve on stdin/out for use from inetd or sshd'),
5019
help='Serve on stdin/out for use from inetd or sshd.'),
5020
RegistryOption('protocol',
5021
help="Protocol to serve.",
5022
lazy_registry=('bzrlib.transport', 'transport_server_registry'),
5023
value_switches=True),
2901
help='listen for connections on nominated port of the form '
2902
'[hostname:]portnumber. Passing 0 as the port number will '
2903
'result in a dynamically allocated port.',
5025
help='Listen for connections on nominated port of the form '
5026
'[hostname:]portnumber. Passing 0 as the port number will '
5027
'result in a dynamically allocated port. The default port '
5028
'depends on the protocol.',
2906
help='serve contents of directory',
5030
custom_help('directory',
5031
help='Serve contents of this directory.'),
2908
5032
Option('allow-writes',
2909
help='By default the server is a readonly server. Supplying '
5033
help='By default the server is a readonly server. Supplying '
2910
5034
'--allow-writes enables write access to the contents of '
2911
'the served directory and below. '
5035
'the served directory and below. Note that ``bzr serve`` '
5036
'does not perform authentication, so unless some form of '
5037
'external authentication is arranged supplying this '
5038
'option leads to global uncontrolled write access to your '
2915
def run(self, port=None, inet=False, directory=None, allow_writes=False):
2916
from bzrlib.transport import smart
2917
from bzrlib.transport import get_transport
5043
def get_host_and_port(self, port):
5044
"""Return the host and port to run the smart server on.
5046
If 'port' is None, None will be returned for the host and port.
5048
If 'port' has a colon in it, the string before the colon will be
5049
interpreted as the host.
5051
:param port: A string of the port to run the server on.
5052
:return: A tuple of (host, port), where 'host' is a host name or IP,
5053
and port is an integer TCP/IP port.
5056
if port is not None:
5058
host, port = port.split(':')
5062
def run(self, port=None, inet=False, directory=None, allow_writes=False,
5064
from bzrlib import transport
2918
5065
if directory is None:
2919
5066
directory = os.getcwd()
5067
if protocol is None:
5068
protocol = transport.transport_server_registry.get()
5069
host, port = self.get_host_and_port(port)
2920
5070
url = urlutils.local_path_to_url(directory)
2921
5071
if not allow_writes:
2922
5072
url = 'readonly+' + url
2923
t = get_transport(url)
2925
server = smart.SmartServerPipeStreamMedium(sys.stdin, sys.stdout, t)
2926
elif port is not None:
2928
host, port = port.split(':')
2931
server = smart.SmartTCPServer(t, host=host, port=int(port))
2932
print 'listening on port: ', server.port
2935
raise errors.BzrCommandError("bzr serve requires one of --inet or --port")
2939
# command-line interpretation helper for merge-related commands
2940
def _merge_helper(other_revision, base_revision,
2941
check_clean=True, ignore_zero=False,
2942
this_dir=None, backup_files=False,
2944
file_list=None, show_base=False, reprocess=False,
2945
pb=DummyProgress()):
2946
"""Merge changes into a tree.
2949
list(path, revno) Base for three-way merge.
2950
If [None, None] then a base will be automatically determined.
2952
list(path, revno) Other revision for three-way merge.
2954
Directory to merge changes into; '.' by default.
2956
If true, this_dir must have no uncommitted changes before the
2958
ignore_zero - If true, suppress the "zero conflicts" message when
2959
there are no conflicts; should be set when doing something we expect
2960
to complete perfectly.
2961
file_list - If supplied, merge only changes to selected files.
2963
All available ancestors of other_revision and base_revision are
2964
automatically pulled into the branch.
2966
The revno may be -1 to indicate the last revision on the branch, which is
2969
This function is intended for use from the command line; programmatic
2970
clients might prefer to call merge.merge_inner(), which has less magic
2973
# Loading it late, so that we don't always have to import bzrlib.merge
2974
if merge_type is None:
2975
merge_type = _mod_merge.Merge3Merger
2976
if this_dir is None:
2978
this_tree = WorkingTree.open_containing(this_dir)[0]
2979
if show_base and not merge_type is _mod_merge.Merge3Merger:
2980
raise errors.BzrCommandError("Show-base is not supported for this merge"
2981
" type. %s" % merge_type)
2982
if reprocess and not merge_type.supports_reprocess:
2983
raise errors.BzrCommandError("Conflict reduction is not supported for merge"
2984
" type %s." % merge_type)
2985
if reprocess and show_base:
2986
raise errors.BzrCommandError("Cannot do conflict reduction and show base.")
2988
merger = _mod_merge.Merger(this_tree.branch, this_tree=this_tree,
2990
merger.pp = ProgressPhase("Merge phase", 5, pb)
2991
merger.pp.next_phase()
2992
merger.check_basis(check_clean)
2993
merger.set_other(other_revision)
2994
merger.pp.next_phase()
2995
merger.set_base(base_revision)
2996
if merger.base_rev_id == merger.other_rev_id:
2997
note('Nothing to do.')
2999
merger.backup_files = backup_files
3000
merger.merge_type = merge_type
3001
merger.set_interesting_files(file_list)
3002
merger.show_base = show_base
3003
merger.reprocess = reprocess
3004
conflicts = merger.do_merge()
3005
if file_list is None:
3006
merger.set_pending()
3013
merge = _merge_helper
3016
# these get imported and then picked up by the scan for cmd_*
3017
# TODO: Some more consistent way to split command definitions across files;
3018
# we do need to load at least some information about them to know of
3019
# aliases. ideally we would avoid loading the implementation until the
3020
# details were needed.
3021
from bzrlib.cmd_version_info import cmd_version_info
3022
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
3023
from bzrlib.bundle.commands import cmd_bundle_revisions
3024
from bzrlib.sign_my_commits import cmd_sign_my_commits
3025
from bzrlib.weave_commands import cmd_weave_list, cmd_weave_join, \
3026
cmd_weave_plan_merge, cmd_weave_merge_text
5073
t = transport.get_transport(url)
5074
protocol(t, host, port, inet)
5077
class cmd_join(Command):
5078
__doc__ = """Combine a tree into its containing tree.
5080
This command requires the target tree to be in a rich-root format.
5082
The TREE argument should be an independent tree, inside another tree, but
5083
not part of it. (Such trees can be produced by "bzr split", but also by
5084
running "bzr branch" with the target inside a tree.)
5086
The result is a combined tree, with the subtree no longer an independent
5087
part. This is marked as a merge of the subtree into the containing tree,
5088
and all history is preserved.
5091
_see_also = ['split']
5092
takes_args = ['tree']
5094
Option('reference', help='Join by reference.', hidden=True),
5097
def run(self, tree, reference=False):
5098
sub_tree = WorkingTree.open(tree)
5099
parent_dir = osutils.dirname(sub_tree.basedir)
5100
containing_tree = WorkingTree.open_containing(parent_dir)[0]
5101
repo = containing_tree.branch.repository
5102
if not repo.supports_rich_root():
5103
raise errors.BzrCommandError(
5104
"Can't join trees because %s doesn't support rich root data.\n"
5105
"You can use bzr upgrade on the repository."
5109
containing_tree.add_reference(sub_tree)
5110
except errors.BadReferenceTarget, e:
5111
# XXX: Would be better to just raise a nicely printable
5112
# exception from the real origin. Also below. mbp 20070306
5113
raise errors.BzrCommandError("Cannot join %s. %s" %
5117
containing_tree.subsume(sub_tree)
5118
except errors.BadSubsumeSource, e:
5119
raise errors.BzrCommandError("Cannot join %s. %s" %
5123
class cmd_split(Command):
5124
__doc__ = """Split a subdirectory of a tree into a separate tree.
5126
This command will produce a target tree in a format that supports
5127
rich roots, like 'rich-root' or 'rich-root-pack'. These formats cannot be
5128
converted into earlier formats like 'dirstate-tags'.
5130
The TREE argument should be a subdirectory of a working tree. That
5131
subdirectory will be converted into an independent tree, with its own
5132
branch. Commits in the top-level tree will not apply to the new subtree.
5135
_see_also = ['join']
5136
takes_args = ['tree']
5138
def run(self, tree):
5139
containing_tree, subdir = WorkingTree.open_containing(tree)
5140
sub_id = containing_tree.path2id(subdir)
5142
raise errors.NotVersionedError(subdir)
5144
containing_tree.extract(sub_id)
5145
except errors.RootNotRich:
5146
raise errors.RichRootUpgradeRequired(containing_tree.branch.base)
5149
class cmd_merge_directive(Command):
5150
__doc__ = """Generate a merge directive for auto-merge tools.
5152
A directive requests a merge to be performed, and also provides all the
5153
information necessary to do so. This means it must either include a
5154
revision bundle, or the location of a branch containing the desired
5157
A submit branch (the location to merge into) must be supplied the first
5158
time the command is issued. After it has been supplied once, it will
5159
be remembered as the default.
5161
A public branch is optional if a revision bundle is supplied, but required
5162
if --diff or --plain is specified. It will be remembered as the default
5163
after the first use.
5166
takes_args = ['submit_branch?', 'public_branch?']
5170
_see_also = ['send']
5174
RegistryOption.from_kwargs('patch-type',
5175
'The type of patch to include in the directive.',
5177
value_switches=True,
5179
bundle='Bazaar revision bundle (default).',
5180
diff='Normal unified diff.',
5181
plain='No patch, just directive.'),
5182
Option('sign', help='GPG-sign the directive.'), 'revision',
5183
Option('mail-to', type=str,
5184
help='Instead of printing the directive, email to this address.'),
5185
Option('message', type=str, short_name='m',
5186
help='Message to use when committing this merge.')
5189
encoding_type = 'exact'
5191
def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
5192
sign=False, revision=None, mail_to=None, message=None,
5194
from bzrlib.revision import ensure_null, NULL_REVISION
5195
include_patch, include_bundle = {
5196
'plain': (False, False),
5197
'diff': (True, False),
5198
'bundle': (True, True),
5200
branch = Branch.open(directory)
5201
stored_submit_branch = branch.get_submit_branch()
5202
if submit_branch is None:
5203
submit_branch = stored_submit_branch
5205
if stored_submit_branch is None:
5206
branch.set_submit_branch(submit_branch)
5207
if submit_branch is None:
5208
submit_branch = branch.get_parent()
5209
if submit_branch is None:
5210
raise errors.BzrCommandError('No submit branch specified or known')
5212
stored_public_branch = branch.get_public_branch()
5213
if public_branch is None:
5214
public_branch = stored_public_branch
5215
elif stored_public_branch is None:
5216
branch.set_public_branch(public_branch)
5217
if not include_bundle and public_branch is None:
5218
raise errors.BzrCommandError('No public branch specified or'
5220
base_revision_id = None
5221
if revision is not None:
5222
if len(revision) > 2:
5223
raise errors.BzrCommandError('bzr merge-directive takes '
5224
'at most two one revision identifiers')
5225
revision_id = revision[-1].as_revision_id(branch)
5226
if len(revision) == 2:
5227
base_revision_id = revision[0].as_revision_id(branch)
5229
revision_id = branch.last_revision()
5230
revision_id = ensure_null(revision_id)
5231
if revision_id == NULL_REVISION:
5232
raise errors.BzrCommandError('No revisions to bundle.')
5233
directive = merge_directive.MergeDirective2.from_objects(
5234
branch.repository, revision_id, time.time(),
5235
osutils.local_time_offset(), submit_branch,
5236
public_branch=public_branch, include_patch=include_patch,
5237
include_bundle=include_bundle, message=message,
5238
base_revision_id=base_revision_id)
5241
self.outf.write(directive.to_signed(branch))
5243
self.outf.writelines(directive.to_lines())
5245
message = directive.to_email(mail_to, branch, sign)
5246
s = SMTPConnection(branch.get_config())
5247
s.send_email(message)
5250
class cmd_send(Command):
5251
__doc__ = """Mail or create a merge-directive for submitting changes.
5253
A merge directive provides many things needed for requesting merges:
5255
* A machine-readable description of the merge to perform
5257
* An optional patch that is a preview of the changes requested
5259
* An optional bundle of revision data, so that the changes can be applied
5260
directly from the merge directive, without retrieving data from a
5263
`bzr send` creates a compact data set that, when applied using bzr
5264
merge, has the same effect as merging from the source branch.
5266
By default the merge directive is self-contained and can be applied to any
5267
branch containing submit_branch in its ancestory without needing access to
5270
If --no-bundle is specified, then Bazaar doesn't send the contents of the
5271
revisions, but only a structured request to merge from the
5272
public_location. In that case the public_branch is needed and it must be
5273
up-to-date and accessible to the recipient. The public_branch is always
5274
included if known, so that people can check it later.
5276
The submit branch defaults to the parent of the source branch, but can be
5277
overridden. Both submit branch and public branch will be remembered in
5278
branch.conf the first time they are used for a particular branch. The
5279
source branch defaults to that containing the working directory, but can
5280
be changed using --from.
5282
In order to calculate those changes, bzr must analyse the submit branch.
5283
Therefore it is most efficient for the submit branch to be a local mirror.
5284
If a public location is known for the submit_branch, that location is used
5285
in the merge directive.
5287
The default behaviour is to send the merge directive by mail, unless -o is
5288
given, in which case it is sent to a file.
5290
Mail is sent using your preferred mail program. This should be transparent
5291
on Windows (it uses MAPI). On Unix, it requires the xdg-email utility.
5292
If the preferred client can't be found (or used), your editor will be used.
5294
To use a specific mail program, set the mail_client configuration option.
5295
(For Thunderbird 1.5, this works around some bugs.) Supported values for
5296
specific clients are "claws", "evolution", "kmail", "mail.app" (MacOS X's
5297
Mail.app), "mutt", and "thunderbird"; generic options are "default",
5298
"editor", "emacsclient", "mapi", and "xdg-email". Plugins may also add
5301
If mail is being sent, a to address is required. This can be supplied
5302
either on the commandline, by setting the submit_to configuration
5303
option in the branch itself or the child_submit_to configuration option
5304
in the submit branch.
5306
Two formats are currently supported: "4" uses revision bundle format 4 and
5307
merge directive format 2. It is significantly faster and smaller than
5308
older formats. It is compatible with Bazaar 0.19 and later. It is the
5309
default. "0.9" uses revision bundle format 0.9 and merge directive
5310
format 1. It is compatible with Bazaar 0.12 - 0.18.
5312
The merge directives created by bzr send may be applied using bzr merge or
5313
bzr pull by specifying a file containing a merge directive as the location.
5315
bzr send makes extensive use of public locations to map local locations into
5316
URLs that can be used by other people. See `bzr help configuration` to
5317
set them, and use `bzr info` to display them.
5320
encoding_type = 'exact'
5322
_see_also = ['merge', 'pull']
5324
takes_args = ['submit_branch?', 'public_branch?']
5328
help='Do not include a bundle in the merge directive.'),
5329
Option('no-patch', help='Do not include a preview patch in the merge'
5332
help='Remember submit and public branch.'),
5334
help='Branch to generate the submission from, '
5335
'rather than the one containing the working directory.',
5338
Option('output', short_name='o',
5339
help='Write merge directive to this file or directory; '
5340
'use - for stdout.',
5343
help='Refuse to send if there are uncommitted changes in'
5344
' the working tree, --no-strict disables the check.'),
5345
Option('mail-to', help='Mail the request to this address.',
5349
Option('body', help='Body for the email.', type=unicode),
5350
RegistryOption('format',
5351
help='Use the specified output format.',
5352
lazy_registry=('bzrlib.send', 'format_registry')),
5355
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5356
no_patch=False, revision=None, remember=False, output=None,
5357
format=None, mail_to=None, message=None, body=None,
5358
strict=None, **kwargs):
5359
from bzrlib.send import send
5360
return send(submit_branch, revision, public_branch, remember,
5361
format, no_bundle, no_patch, output,
5362
kwargs.get('from', '.'), mail_to, message, body,
5367
class cmd_bundle_revisions(cmd_send):
5368
__doc__ = """Create a merge-directive for submitting changes.
5370
A merge directive provides many things needed for requesting merges:
5372
* A machine-readable description of the merge to perform
5374
* An optional patch that is a preview of the changes requested
5376
* An optional bundle of revision data, so that the changes can be applied
5377
directly from the merge directive, without retrieving data from a
5380
If --no-bundle is specified, then public_branch is needed (and must be
5381
up-to-date), so that the receiver can perform the merge using the
5382
public_branch. The public_branch is always included if known, so that
5383
people can check it later.
5385
The submit branch defaults to the parent, but can be overridden. Both
5386
submit branch and public branch will be remembered if supplied.
5388
If a public_branch is known for the submit_branch, that public submit
5389
branch is used in the merge instructions. This means that a local mirror
5390
can be used as your actual submit branch, once you have set public_branch
5393
Two formats are currently supported: "4" uses revision bundle format 4 and
5394
merge directive format 2. It is significantly faster and smaller than
5395
older formats. It is compatible with Bazaar 0.19 and later. It is the
5396
default. "0.9" uses revision bundle format 0.9 and merge directive
5397
format 1. It is compatible with Bazaar 0.12 - 0.18.
5402
help='Do not include a bundle in the merge directive.'),
5403
Option('no-patch', help='Do not include a preview patch in the merge'
5406
help='Remember submit and public branch.'),
5408
help='Branch to generate the submission from, '
5409
'rather than the one containing the working directory.',
5412
Option('output', short_name='o', help='Write directive to this file.',
5415
help='Refuse to bundle revisions if there are uncommitted'
5416
' changes in the working tree, --no-strict disables the check.'),
5418
RegistryOption('format',
5419
help='Use the specified output format.',
5420
lazy_registry=('bzrlib.send', 'format_registry')),
5422
aliases = ['bundle']
5424
_see_also = ['send', 'merge']
5428
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5429
no_patch=False, revision=None, remember=False, output=None,
5430
format=None, strict=None, **kwargs):
5433
from bzrlib.send import send
5434
return send(submit_branch, revision, public_branch, remember,
5435
format, no_bundle, no_patch, output,
5436
kwargs.get('from', '.'), None, None, None,
5437
self.outf, strict=strict)
5440
class cmd_tag(Command):
5441
__doc__ = """Create, remove or modify a tag naming a revision.
5443
Tags give human-meaningful names to revisions. Commands that take a -r
5444
(--revision) option can be given -rtag:X, where X is any previously
5447
Tags are stored in the branch. Tags are copied from one branch to another
5448
along when you branch, push, pull or merge.
5450
It is an error to give a tag name that already exists unless you pass
5451
--force, in which case the tag is moved to point to the new revision.
5453
To rename a tag (change the name but keep it on the same revsion), run ``bzr
5454
tag new-name -r tag:old-name`` and then ``bzr tag --delete oldname``.
5456
If no tag name is specified it will be determined through the
5457
'automatic_tag_name' hook. This can e.g. be used to automatically tag
5458
upstream releases by reading configure.ac. See ``bzr help hooks`` for
5462
_see_also = ['commit', 'tags']
5463
takes_args = ['tag_name?']
5466
help='Delete this tag rather than placing it.',
5468
custom_help('directory',
5469
help='Branch in which to place the tag.'),
5471
help='Replace existing tags.',
5476
def run(self, tag_name=None,
5482
branch, relpath = Branch.open_containing(directory)
5483
self.add_cleanup(branch.lock_write().unlock)
5485
if tag_name is None:
5486
raise errors.BzrCommandError("No tag specified to delete.")
5487
branch.tags.delete_tag(tag_name)
5488
note('Deleted tag %s.' % tag_name)
5491
if len(revision) != 1:
5492
raise errors.BzrCommandError(
5493
"Tags can only be placed on a single revision, "
5495
revision_id = revision[0].as_revision_id(branch)
5497
revision_id = branch.last_revision()
5498
if tag_name is None:
5499
tag_name = branch.automatic_tag_name(revision_id)
5500
if tag_name is None:
5501
raise errors.BzrCommandError(
5502
"Please specify a tag name.")
5503
if (not force) and branch.tags.has_tag(tag_name):
5504
raise errors.TagAlreadyExists(tag_name)
5505
branch.tags.set_tag(tag_name, revision_id)
5506
note('Created tag %s.' % tag_name)
5509
class cmd_tags(Command):
5510
__doc__ = """List tags.
5512
This command shows a table of tag names and the revisions they reference.
5517
custom_help('directory',
5518
help='Branch whose tags should be displayed.'),
5519
RegistryOption('sort',
5520
'Sort tags by different criteria.', title='Sorting',
5521
lazy_registry=('bzrlib.tag', 'tag_sort_methods')
5528
def run(self, directory='.', sort=None, show_ids=False, revision=None):
5529
from bzrlib.tag import tag_sort_methods
5530
branch, relpath = Branch.open_containing(directory)
5532
tags = branch.tags.get_tag_dict().items()
5536
self.add_cleanup(branch.lock_read().unlock)
5538
graph = branch.repository.get_graph()
5539
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5540
revid1, revid2 = rev1.rev_id, rev2.rev_id
5541
# only show revisions between revid1 and revid2 (inclusive)
5542
tags = [(tag, revid) for tag, revid in tags if
5543
graph.is_between(revid, revid1, revid2)]
5545
sort = tag_sort_methods.get()
5548
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5549
for index, (tag, revid) in enumerate(tags):
5551
revno = branch.revision_id_to_dotted_revno(revid)
5552
if isinstance(revno, tuple):
5553
revno = '.'.join(map(str, revno))
5554
except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5555
# Bad tag data/merges can lead to tagged revisions
5556
# which are not in this branch. Fail gracefully ...
5558
tags[index] = (tag, revno)
5560
for tag, revspec in tags:
5561
self.outf.write('%-20s %s\n' % (tag, revspec))
5564
class cmd_reconfigure(Command):
5565
__doc__ = """Reconfigure the type of a bzr directory.
5567
A target configuration must be specified.
5569
For checkouts, the bind-to location will be auto-detected if not specified.
5570
The order of preference is
5571
1. For a lightweight checkout, the current bound location.
5572
2. For branches that used to be checkouts, the previously-bound location.
5573
3. The push location.
5574
4. The parent location.
5575
If none of these is available, --bind-to must be specified.
5578
_see_also = ['branches', 'checkouts', 'standalone-trees', 'working-trees']
5579
takes_args = ['location?']
5581
RegistryOption.from_kwargs(
5583
title='Target type',
5584
help='The type to reconfigure the directory to.',
5585
value_switches=True, enum_switch=False,
5586
branch='Reconfigure to be an unbound branch with no working tree.',
5587
tree='Reconfigure to be an unbound branch with a working tree.',
5588
checkout='Reconfigure to be a bound branch with a working tree.',
5589
lightweight_checkout='Reconfigure to be a lightweight'
5590
' checkout (with no local history).',
5591
standalone='Reconfigure to be a standalone branch '
5592
'(i.e. stop using shared repository).',
5593
use_shared='Reconfigure to use a shared repository.',
5594
with_trees='Reconfigure repository to create '
5595
'working trees on branches by default.',
5596
with_no_trees='Reconfigure repository to not create '
5597
'working trees on branches by default.'
5599
Option('bind-to', help='Branch to bind checkout to.', type=str),
5601
help='Perform reconfiguration even if local changes'
5603
Option('stacked-on',
5604
help='Reconfigure a branch to be stacked on another branch.',
5608
help='Reconfigure a branch to be unstacked. This '
5609
'may require copying substantial data into it.',
5613
def run(self, location=None, target_type=None, bind_to=None, force=False,
5616
directory = bzrdir.BzrDir.open(location)
5617
if stacked_on and unstacked:
5618
raise BzrCommandError("Can't use both --stacked-on and --unstacked")
5619
elif stacked_on is not None:
5620
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5622
reconfigure.ReconfigureUnstacked().apply(directory)
5623
# At the moment you can use --stacked-on and a different
5624
# reconfiguration shape at the same time; there seems no good reason
5626
if target_type is None:
5627
if stacked_on or unstacked:
5630
raise errors.BzrCommandError('No target configuration '
5632
elif target_type == 'branch':
5633
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5634
elif target_type == 'tree':
5635
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5636
elif target_type == 'checkout':
5637
reconfiguration = reconfigure.Reconfigure.to_checkout(
5639
elif target_type == 'lightweight-checkout':
5640
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5642
elif target_type == 'use-shared':
5643
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5644
elif target_type == 'standalone':
5645
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5646
elif target_type == 'with-trees':
5647
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5649
elif target_type == 'with-no-trees':
5650
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5652
reconfiguration.apply(force)
5655
class cmd_switch(Command):
5656
__doc__ = """Set the branch of a checkout and update.
5658
For lightweight checkouts, this changes the branch being referenced.
5659
For heavyweight checkouts, this checks that there are no local commits
5660
versus the current bound branch, then it makes the local branch a mirror
5661
of the new location and binds to it.
5663
In both cases, the working tree is updated and uncommitted changes
5664
are merged. The user can commit or revert these as they desire.
5666
Pending merges need to be committed or reverted before using switch.
5668
The path to the branch to switch to can be specified relative to the parent
5669
directory of the current branch. For example, if you are currently in a
5670
checkout of /path/to/branch, specifying 'newbranch' will find a branch at
5673
Bound branches use the nickname of its master branch unless it is set
5674
locally, in which case switching will update the local nickname to be
5678
takes_args = ['to_location?']
5679
takes_options = ['directory',
5681
help='Switch even if local commits will be lost.'),
5683
Option('create-branch', short_name='b',
5684
help='Create the target branch from this one before'
5685
' switching to it.'),
5688
def run(self, to_location=None, force=False, create_branch=False,
5689
revision=None, directory=u'.'):
5690
from bzrlib import switch
5691
tree_location = directory
5692
revision = _get_one_revision('switch', revision)
5693
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5694
if to_location is None:
5695
if revision is None:
5696
raise errors.BzrCommandError('You must supply either a'
5697
' revision or a location')
5698
to_location = tree_location
5700
branch = control_dir.open_branch()
5701
had_explicit_nick = branch.get_config().has_explicit_nickname()
5702
except errors.NotBranchError:
5704
had_explicit_nick = False
5707
raise errors.BzrCommandError('cannot create branch without'
5709
to_location = directory_service.directories.dereference(
5711
if '/' not in to_location and '\\' not in to_location:
5712
# This path is meant to be relative to the existing branch
5713
this_url = self._get_branch_location(control_dir)
5714
to_location = urlutils.join(this_url, '..', to_location)
5715
to_branch = branch.bzrdir.sprout(to_location,
5716
possible_transports=[branch.bzrdir.root_transport],
5717
source_branch=branch).open_branch()
5720
to_branch = Branch.open(to_location)
5721
except errors.NotBranchError:
5722
this_url = self._get_branch_location(control_dir)
5723
to_branch = Branch.open(
5724
urlutils.join(this_url, '..', to_location))
5725
if revision is not None:
5726
revision = revision.as_revision_id(to_branch)
5727
switch.switch(control_dir, to_branch, force, revision_id=revision)
5728
if had_explicit_nick:
5729
branch = control_dir.open_branch() #get the new branch!
5730
branch.nick = to_branch.nick
5731
note('Switched to branch: %s',
5732
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5734
def _get_branch_location(self, control_dir):
5735
"""Return location of branch for this control dir."""
5737
this_branch = control_dir.open_branch()
5738
# This may be a heavy checkout, where we want the master branch
5739
master_location = this_branch.get_bound_location()
5740
if master_location is not None:
5741
return master_location
5742
# If not, use a local sibling
5743
return this_branch.base
5744
except errors.NotBranchError:
5745
format = control_dir.find_branch_format()
5746
if getattr(format, 'get_reference', None) is not None:
5747
return format.get_reference(control_dir)
5749
return control_dir.root_transport.base
5752
class cmd_view(Command):
5753
__doc__ = """Manage filtered views.
5755
Views provide a mask over the tree so that users can focus on
5756
a subset of a tree when doing their work. After creating a view,
5757
commands that support a list of files - status, diff, commit, etc -
5758
effectively have that list of files implicitly given each time.
5759
An explicit list of files can still be given but those files
5760
must be within the current view.
5762
In most cases, a view has a short life-span: it is created to make
5763
a selected change and is deleted once that change is committed.
5764
At other times, you may wish to create one or more named views
5765
and switch between them.
5767
To disable the current view without deleting it, you can switch to
5768
the pseudo view called ``off``. This can be useful when you need
5769
to see the whole tree for an operation or two (e.g. merge) but
5770
want to switch back to your view after that.
5773
To define the current view::
5775
bzr view file1 dir1 ...
5777
To list the current view::
5781
To delete the current view::
5785
To disable the current view without deleting it::
5787
bzr view --switch off
5789
To define a named view and switch to it::
5791
bzr view --name view-name file1 dir1 ...
5793
To list a named view::
5795
bzr view --name view-name
5797
To delete a named view::
5799
bzr view --name view-name --delete
5801
To switch to a named view::
5803
bzr view --switch view-name
5805
To list all views defined::
5809
To delete all views::
5811
bzr view --delete --all
5815
takes_args = ['file*']
5818
help='Apply list or delete action to all views.',
5821
help='Delete the view.',
5824
help='Name of the view to define, list or delete.',
5828
help='Name of the view to switch to.',
5833
def run(self, file_list,
5839
tree, file_list = WorkingTree.open_containing_paths(file_list,
5841
current_view, view_dict = tree.views.get_view_info()
5846
raise errors.BzrCommandError(
5847
"Both --delete and a file list specified")
5849
raise errors.BzrCommandError(
5850
"Both --delete and --switch specified")
5852
tree.views.set_view_info(None, {})
5853
self.outf.write("Deleted all views.\n")
5855
raise errors.BzrCommandError("No current view to delete")
5857
tree.views.delete_view(name)
5858
self.outf.write("Deleted '%s' view.\n" % name)
5861
raise errors.BzrCommandError(
5862
"Both --switch and a file list specified")
5864
raise errors.BzrCommandError(
5865
"Both --switch and --all specified")
5866
elif switch == 'off':
5867
if current_view is None:
5868
raise errors.BzrCommandError("No current view to disable")
5869
tree.views.set_view_info(None, view_dict)
5870
self.outf.write("Disabled '%s' view.\n" % (current_view))
5872
tree.views.set_view_info(switch, view_dict)
5873
view_str = views.view_display_str(tree.views.lookup_view())
5874
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
5877
self.outf.write('Views defined:\n')
5878
for view in sorted(view_dict):
5879
if view == current_view:
5883
view_str = views.view_display_str(view_dict[view])
5884
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
5886
self.outf.write('No views defined.\n')
5889
# No name given and no current view set
5892
raise errors.BzrCommandError(
5893
"Cannot change the 'off' pseudo view")
5894
tree.views.set_view(name, sorted(file_list))
5895
view_str = views.view_display_str(tree.views.lookup_view())
5896
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
5900
# No name given and no current view set
5901
self.outf.write('No current view.\n')
5903
view_str = views.view_display_str(tree.views.lookup_view(name))
5904
self.outf.write("'%s' view is: %s\n" % (name, view_str))
5907
class cmd_hooks(Command):
5908
__doc__ = """Show hooks."""
5913
for hook_key in sorted(hooks.known_hooks.keys()):
5914
some_hooks = hooks.known_hooks_key_to_object(hook_key)
5915
self.outf.write("%s:\n" % type(some_hooks).__name__)
5916
for hook_name, hook_point in sorted(some_hooks.items()):
5917
self.outf.write(" %s:\n" % (hook_name,))
5918
found_hooks = list(hook_point)
5920
for hook in found_hooks:
5921
self.outf.write(" %s\n" %
5922
(some_hooks.get_hook_name(hook),))
5924
self.outf.write(" <no hooks installed>\n")
5927
class cmd_remove_branch(Command):
5928
__doc__ = """Remove a branch.
5930
This will remove the branch from the specified location but
5931
will keep any working tree or repository in place.
5935
Remove the branch at repo/trunk::
5937
bzr remove-branch repo/trunk
5941
takes_args = ["location?"]
5943
aliases = ["rmbranch"]
5945
def run(self, location=None):
5946
if location is None:
5948
branch = Branch.open_containing(location)[0]
5949
branch.bzrdir.destroy_branch()
5952
class cmd_shelve(Command):
5953
__doc__ = """Temporarily set aside some changes from the current tree.
5955
Shelve allows you to temporarily put changes you've made "on the shelf",
5956
ie. out of the way, until a later time when you can bring them back from
5957
the shelf with the 'unshelve' command. The changes are stored alongside
5958
your working tree, and so they aren't propagated along with your branch nor
5959
will they survive its deletion.
5961
If shelve --list is specified, previously-shelved changes are listed.
5963
Shelve is intended to help separate several sets of changes that have
5964
been inappropriately mingled. If you just want to get rid of all changes
5965
and you don't need to restore them later, use revert. If you want to
5966
shelve all text changes at once, use shelve --all.
5968
If filenames are specified, only the changes to those files will be
5969
shelved. Other files will be left untouched.
5971
If a revision is specified, changes since that revision will be shelved.
5973
You can put multiple items on the shelf, and by default, 'unshelve' will
5974
restore the most recently shelved changes.
5976
For complicated changes, it is possible to edit the changes in a separate
5977
editor program to decide what the file remaining in the working copy
5978
should look like. To do this, add the configuration option
5980
change_editor = PROGRAM @new_path @old_path
5982
where @new_path is replaced with the path of the new version of the
5983
file and @old_path is replaced with the path of the old version of
5984
the file. The PROGRAM should save the new file with the desired
5985
contents of the file in the working tree.
5989
takes_args = ['file*']
5994
Option('all', help='Shelve all changes.'),
5996
RegistryOption('writer', 'Method to use for writing diffs.',
5997
bzrlib.option.diff_writer_registry,
5998
value_switches=True, enum_switch=False),
6000
Option('list', help='List shelved changes.'),
6002
help='Destroy removed changes instead of shelving them.'),
6004
_see_also = ['unshelve', 'configuration']
6006
def run(self, revision=None, all=False, file_list=None, message=None,
6007
writer=None, list=False, destroy=False, directory=None):
6009
return self.run_for_list(directory=directory)
6010
from bzrlib.shelf_ui import Shelver
6012
writer = bzrlib.option.diff_writer_registry.get()
6014
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
6015
file_list, message, destroy=destroy, directory=directory)
6020
except errors.UserAbort:
6023
def run_for_list(self, directory=None):
6024
if directory is None:
6026
tree = WorkingTree.open_containing(directory)[0]
6027
self.add_cleanup(tree.lock_read().unlock)
6028
manager = tree.get_shelf_manager()
6029
shelves = manager.active_shelves()
6030
if len(shelves) == 0:
6031
note('No shelved changes.')
6033
for shelf_id in reversed(shelves):
6034
message = manager.get_metadata(shelf_id).get('message')
6036
message = '<no message>'
6037
self.outf.write('%3d: %s\n' % (shelf_id, message))
6041
class cmd_unshelve(Command):
6042
__doc__ = """Restore shelved changes.
6044
By default, the most recently shelved changes are restored. However if you
6045
specify a shelf by id those changes will be restored instead. This works
6046
best when the changes don't depend on each other.
6049
takes_args = ['shelf_id?']
6052
RegistryOption.from_kwargs(
6053
'action', help="The action to perform.",
6054
enum_switch=False, value_switches=True,
6055
apply="Apply changes and remove from the shelf.",
6056
dry_run="Show changes, but do not apply or remove them.",
6057
preview="Instead of unshelving the changes, show the diff that "
6058
"would result from unshelving.",
6059
delete_only="Delete changes without applying them.",
6060
keep="Apply changes but don't delete them.",
6063
_see_also = ['shelve']
6065
def run(self, shelf_id=None, action='apply', directory=u'.'):
6066
from bzrlib.shelf_ui import Unshelver
6067
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
6071
unshelver.tree.unlock()
6074
class cmd_clean_tree(Command):
6075
__doc__ = """Remove unwanted files from working tree.
6077
By default, only unknown files, not ignored files, are deleted. Versioned
6078
files are never deleted.
6080
Another class is 'detritus', which includes files emitted by bzr during
6081
normal operations and selftests. (The value of these files decreases with
6084
If no options are specified, unknown files are deleted. Otherwise, option
6085
flags are respected, and may be combined.
6087
To check what clean-tree will do, use --dry-run.
6089
takes_options = ['directory',
6090
Option('ignored', help='Delete all ignored files.'),
6091
Option('detritus', help='Delete conflict files, merge and revert'
6092
' backups, and failed selftest dirs.'),
6094
help='Delete files unknown to bzr (default).'),
6095
Option('dry-run', help='Show files to delete instead of'
6097
Option('force', help='Do not prompt before deleting.')]
6098
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
6099
force=False, directory=u'.'):
6100
from bzrlib.clean_tree import clean_tree
6101
if not (unknown or ignored or detritus):
6105
clean_tree(directory, unknown=unknown, ignored=ignored,
6106
detritus=detritus, dry_run=dry_run, no_prompt=force)
6109
class cmd_reference(Command):
6110
__doc__ = """list, view and set branch locations for nested trees.
6112
If no arguments are provided, lists the branch locations for nested trees.
6113
If one argument is provided, display the branch location for that tree.
6114
If two arguments are provided, set the branch location for that tree.
6119
takes_args = ['path?', 'location?']
6121
def run(self, path=None, location=None):
6123
if path is not None:
6125
tree, branch, relpath =(
6126
bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
6127
if path is not None:
6130
tree = branch.basis_tree()
6132
info = branch._get_all_reference_info().iteritems()
6133
self._display_reference_info(tree, branch, info)
6135
file_id = tree.path2id(path)
6137
raise errors.NotVersionedError(path)
6138
if location is None:
6139
info = [(file_id, branch.get_reference_info(file_id))]
6140
self._display_reference_info(tree, branch, info)
6142
branch.set_reference_info(file_id, path, location)
6144
def _display_reference_info(self, tree, branch, info):
6146
for file_id, (path, location) in info:
6148
path = tree.id2path(file_id)
6149
except errors.NoSuchId:
6151
ref_list.append((path, location))
6152
for path, location in sorted(ref_list):
6153
self.outf.write('%s %s\n' % (path, location))
6156
def _register_lazy_builtins():
6157
# register lazy builtins from other modules; called at startup and should
6158
# be only called once.
6159
for (name, aliases, module_name) in [
6160
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6161
('cmd_config', [], 'bzrlib.config'),
6162
('cmd_dpush', [], 'bzrlib.foreign'),
6163
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6164
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6165
('cmd_conflicts', [], 'bzrlib.conflicts'),
6166
('cmd_sign_my_commits', [], 'bzrlib.sign_my_commits'),
6167
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6169
builtin_command_registry.register_lazy(name, aliases, module_name)