13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""builtin bzr commands"""
20
from StringIO import StringIO
21
22
from bzrlib.lazy_import import lazy_import
22
23
lazy_import(globals(), """
28
31
from bzrlib import (
35
config as _mod_config,
40
42
merge as _mod_merge,
45
revision as _mod_revision,
54
54
from bzrlib.branch import Branch
55
from bzrlib.bundle.apply_bundle import install_bundle, merge_bundle
55
56
from bzrlib.conflicts import ConflictList
56
from bzrlib.transport import memory
57
from bzrlib.revisionspec import RevisionSpec, RevisionInfo
57
from bzrlib.revisionspec import RevisionSpec
58
58
from bzrlib.smtp_connection import SMTPConnection
59
59
from bzrlib.workingtree import WorkingTree
62
from bzrlib.commands import (
64
builtin_command_registry,
67
from bzrlib.option import (
74
from bzrlib.trace import mutter, note, warning, is_quiet, get_verbosity_level
80
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
81
def tree_files(file_list, default_branch=u'.', canonicalize=True,
83
return internal_tree_files(file_list, default_branch, canonicalize,
87
def tree_files_for_add(file_list):
89
Return a tree and list of absolute paths from a file list.
91
Similar to tree_files, but add handles files a bit differently, so it a
92
custom implementation. In particular, MutableTreeTree.smart_add expects
93
absolute paths, which it immediately converts to relative paths.
95
# FIXME Would be nice to just return the relative paths like
96
# internal_tree_files does, but there are a large number of unit tests
97
# that assume the current interface to mutabletree.smart_add
99
tree, relpath = WorkingTree.open_containing(file_list[0])
100
if tree.supports_views():
101
view_files = tree.views.lookup_view()
103
for filename in file_list:
104
if not osutils.is_inside_any(view_files, filename):
105
raise errors.FileOutsideView(filename, view_files)
106
file_list = file_list[:]
107
file_list[0] = tree.abspath(relpath)
109
tree = WorkingTree.open_containing(u'.')[0]
110
if tree.supports_views():
111
view_files = tree.views.lookup_view()
113
file_list = view_files
114
view_str = views.view_display_str(view_files)
115
note("Ignoring files outside view. View is %s" % view_str)
116
return tree, file_list
119
def _get_one_revision(command_name, revisions):
120
if revisions is None:
122
if len(revisions) != 1:
123
raise errors.BzrCommandError(
124
'bzr %s --revision takes exactly one revision identifier' % (
129
def _get_one_revision_tree(command_name, revisions, branch=None, tree=None):
130
"""Get a revision tree. Not suitable for commands that change the tree.
132
Specifically, the basis tree in dirstate trees is coupled to the dirstate
133
and doing a commit/uncommit/pull will at best fail due to changing the
136
If tree is passed in, it should be already locked, for lifetime management
137
of the trees internal cached state.
141
if revisions is None:
143
rev_tree = tree.basis_tree()
145
rev_tree = branch.basis_tree()
147
revision = _get_one_revision(command_name, revisions)
148
rev_tree = revision.as_tree(branch)
62
from bzrlib.commands import Command, display_command
63
from bzrlib.option import ListOption, Option, RegistryOption
64
from bzrlib.progress import DummyProgress, ProgressPhase
65
from bzrlib.trace import mutter, note, log_error, warning, is_quiet, info
68
def tree_files(file_list, default_branch=u'.'):
70
return internal_tree_files(file_list, default_branch)
71
except errors.FileInWrongBranch, e:
72
raise errors.BzrCommandError("%s is not in the same branch as %s" %
73
(e.path, file_list[0]))
152
76
# XXX: Bad function name; should possibly also be a class method of
153
77
# WorkingTree rather than a function.
154
@symbol_versioning.deprecated_function(symbol_versioning.deprecated_in((2, 3, 0)))
155
def internal_tree_files(file_list, default_branch=u'.', canonicalize=True,
78
def internal_tree_files(file_list, default_branch=u'.'):
157
79
"""Convert command-line paths to a WorkingTree and relative paths.
159
Deprecated: use WorkingTree.open_containing_paths instead.
161
81
This is typically used for command-line processors that take one or
162
82
more filenames, and infer the workingtree that contains them.
164
84
The filenames given are not required to exist.
166
:param file_list: Filenames to convert.
86
:param file_list: Filenames to convert.
168
88
:param default_branch: Fallback tree path to use if file_list is empty or
171
:param apply_view: if True and a view is set, apply it or check that
172
specified files are within it
174
91
:return: workingtree, [relative_paths]
176
return WorkingTree.open_containing_paths(
177
file_list, default_directory='.',
182
def _get_view_info_for_change_reporter(tree):
183
"""Get the view information from a tree for change reporting."""
93
if file_list is None or len(file_list) == 0:
94
return WorkingTree.open_containing(default_branch)[0], file_list
95
tree = WorkingTree.open_containing(osutils.realpath(file_list[0]))[0]
97
for filename in file_list:
99
new_list.append(tree.relpath(osutils.dereference_path(filename)))
100
except errors.PathNotChild:
101
raise errors.FileInWrongBranch(tree.branch, filename)
102
return tree, new_list
105
@symbol_versioning.deprecated_function(symbol_versioning.zero_fifteen)
106
def get_format_type(typestring):
107
"""Parse and return a format specifier."""
108
# Have to use BzrDirMetaFormat1 directly, so that
109
# RepositoryFormat.set_default_format works
110
if typestring == "default":
111
return bzrdir.BzrDirMetaFormat1()
186
current_view = tree.views.get_view_info()[0]
187
if current_view is not None:
188
view_info = (current_view, tree.views.lookup_view())
189
except errors.ViewsNotSupported:
194
def _open_directory_or_containing_tree_or_branch(filename, directory):
195
"""Open the tree or branch containing the specified file, unless
196
the --directory option is used to specify a different branch."""
197
if directory is not None:
198
return (None, Branch.open(directory), filename)
199
return bzrdir.BzrDir.open_containing_tree_or_branch(filename)
113
return bzrdir.format_registry.make_bzrdir(typestring)
115
msg = 'Unknown bzr format "%s". See "bzr help formats".' % typestring
116
raise errors.BzrCommandError(msg)
202
119
# TODO: Make sure no commands unconditionally use the working directory as a
233
150
Not versioned and not matching an ignore pattern.
235
Additionally for directories, symlinks and files with a changed
236
executable bit, Bazaar indicates their type using a trailing
237
character: '/', '@' or '*' respectively. These decorations can be
238
disabled using the '--no-classify' option.
240
152
To see ignored files use 'bzr ignored'. For details on the
241
153
changes to file texts, use 'bzr diff'.
243
Note that --short or -S gives status flags for each item, similar
244
to Subversion's status command. To get output similar to svn -q,
155
--short gives a status flags for each item, similar to the SVN's status
158
Column 1: versioning / renames
164
P Entry for a pending merge (not a file)
173
* The execute bit was changed
247
175
If no arguments are specified, the status of the entire working
248
176
directory is shown. Otherwise, only the status of the specified
249
177
files or directories is reported. If a directory is given, status
250
178
is reported for everything inside that directory.
252
Before merges are committed, the pending merge tip revisions are
253
shown. To see all pending merge revisions, use the -v option.
254
To skip the display of pending merge information altogether, use
255
the no-pending option or specify a file/directory.
257
To compare the working directory to a specific revision, pass a
258
single revision to the revision argument.
260
To see which files have changed in a specific revision, or between
261
two revisions, pass a revision range to the revision argument.
262
This will produce the same results as calling 'bzr diff --summarize'.
180
If a revision argument is given, the status is calculated against
181
that revision, or between two revisions if two are provided.
265
184
# TODO: --no-recurse, --recurse options
267
186
takes_args = ['file*']
268
takes_options = ['show-ids', 'revision', 'change', 'verbose',
269
Option('short', help='Use short status indicators.',
271
Option('versioned', help='Only show versioned files.',
273
Option('no-pending', help='Don\'t show pending merges.',
275
Option('no-classify',
276
help='Do not mark object type using indicator.',
187
takes_options = ['show-ids', 'revision',
188
Option('short', help='Give short SVN-style status lines'),
189
Option('versioned', help='Only show versioned files')]
279
190
aliases = ['st', 'stat']
281
192
encoding_type = 'replace'
282
_see_also = ['diff', 'revert', 'status-flags']
193
_see_also = ['diff', 'revert']
285
196
def run(self, show_ids=False, file_list=None, revision=None, short=False,
286
versioned=False, no_pending=False, verbose=False,
288
198
from bzrlib.status import show_tree_status
290
if revision and len(revision) > 2:
291
raise errors.BzrCommandError('bzr status --revision takes exactly'
292
' one or two revision specifiers')
294
tree, relfile_list = WorkingTree.open_containing_paths(file_list)
295
# Avoid asking for specific files when that is not needed.
296
if relfile_list == ['']:
298
# Don't disable pending merges for full trees other than '.'.
299
if file_list == ['.']:
301
# A specific path within a tree was given.
302
elif relfile_list is not None:
200
tree, file_list = tree_files(file_list)
304
202
show_tree_status(tree, show_ids=show_ids,
305
specific_files=relfile_list, revision=revision,
306
to_file=self.outf, short=short, versioned=versioned,
307
show_pending=(not no_pending), verbose=verbose,
308
classify=not no_classify)
203
specific_files=file_list, revision=revision,
204
to_file=self.outf, short=short, versioned=versioned)
311
207
class cmd_cat_revision(Command):
312
__doc__ = """Write out metadata for a revision.
208
"""Write out metadata for a revision.
314
210
The revision to print can either be specified by a specific
315
211
revision identifier, or you can use --revision.
319
215
takes_args = ['revision_id?']
320
takes_options = ['directory', 'revision']
216
takes_options = ['revision']
321
217
# cat-revision is more for frontends so should be exact
322
218
encoding = 'strict'
324
def print_revision(self, revisions, revid):
325
stream = revisions.get_record_stream([(revid,)], 'unordered', True)
326
record = stream.next()
327
if record.storage_kind == 'absent':
328
raise errors.NoSuchRevision(revisions, revid)
329
revtext = record.get_bytes_as('fulltext')
330
self.outf.write(revtext.decode('utf-8'))
333
def run(self, revision_id=None, revision=None, directory=u'.'):
221
def run(self, revision_id=None, revision=None):
223
revision_id = osutils.safe_revision_id(revision_id, warn=False)
334
224
if revision_id is not None and revision is not None:
335
225
raise errors.BzrCommandError('You can only supply one of'
336
226
' revision_id or --revision')
337
227
if revision_id is None and revision is None:
338
228
raise errors.BzrCommandError('You must supply either'
339
229
' --revision or a revision_id')
341
b = bzrdir.BzrDir.open_containing_tree_or_branch(directory)[1]
343
revisions = b.repository.revisions
344
if revisions is None:
345
raise errors.BzrCommandError('Repository %r does not support '
346
'access to raw revision texts')
348
b.repository.lock_read()
350
# TODO: jam 20060112 should cat-revision always output utf-8?
351
if revision_id is not None:
352
revision_id = osutils.safe_revision_id(revision_id, warn=False)
354
self.print_revision(revisions, revision_id)
355
except errors.NoSuchRevision:
356
msg = "The repository %s contains no revision %s." % (
357
b.repository.base, revision_id)
358
raise errors.BzrCommandError(msg)
359
elif revision is not None:
362
raise errors.BzrCommandError(
363
'You cannot specify a NULL revision.')
364
rev_id = rev.as_revision_id(b)
365
self.print_revision(revisions, rev_id)
367
b.repository.unlock()
370
class cmd_dump_btree(Command):
371
__doc__ = """Dump the contents of a btree index file to stdout.
373
PATH is a btree index file, it can be any URL. This includes things like
374
.bzr/repository/pack-names, or .bzr/repository/indices/a34b3a...ca4a4.iix
376
By default, the tuples stored in the index file will be displayed. With
377
--raw, we will uncompress the pages, but otherwise display the raw bytes
381
# TODO: Do we want to dump the internal nodes as well?
382
# TODO: It would be nice to be able to dump the un-parsed information,
383
# rather than only going through iter_all_entries. However, this is
384
# good enough for a start
386
encoding_type = 'exact'
387
takes_args = ['path']
388
takes_options = [Option('raw', help='Write the uncompressed bytes out,'
389
' rather than the parsed tuples.'),
392
def run(self, path, raw=False):
393
dirname, basename = osutils.split(path)
394
t = transport.get_transport(dirname)
396
self._dump_raw_bytes(t, basename)
398
self._dump_entries(t, basename)
400
def _get_index_and_bytes(self, trans, basename):
401
"""Create a BTreeGraphIndex and raw bytes."""
402
bt = btree_index.BTreeGraphIndex(trans, basename, None)
403
bytes = trans.get_bytes(basename)
404
bt._file = cStringIO.StringIO(bytes)
405
bt._size = len(bytes)
408
def _dump_raw_bytes(self, trans, basename):
411
# We need to parse at least the root node.
412
# This is because the first page of every row starts with an
413
# uncompressed header.
414
bt, bytes = self._get_index_and_bytes(trans, basename)
415
for page_idx, page_start in enumerate(xrange(0, len(bytes),
416
btree_index._PAGE_SIZE)):
417
page_end = min(page_start + btree_index._PAGE_SIZE, len(bytes))
418
page_bytes = bytes[page_start:page_end]
420
self.outf.write('Root node:\n')
421
header_end, data = bt._parse_header_from_bytes(page_bytes)
422
self.outf.write(page_bytes[:header_end])
424
self.outf.write('\nPage %d\n' % (page_idx,))
425
if len(page_bytes) == 0:
426
self.outf.write('(empty)\n');
428
decomp_bytes = zlib.decompress(page_bytes)
429
self.outf.write(decomp_bytes)
430
self.outf.write('\n')
432
def _dump_entries(self, trans, basename):
434
st = trans.stat(basename)
435
except errors.TransportNotPossible:
436
# We can't stat, so we'll fake it because we have to do the 'get()'
438
bt, _ = self._get_index_and_bytes(trans, basename)
440
bt = btree_index.BTreeGraphIndex(trans, basename, st.st_size)
441
for node in bt.iter_all_entries():
442
# Node is made up of:
443
# (index, key, value, [references])
447
refs_as_tuples = None
449
refs_as_tuples = static_tuple.as_tuples(refs)
450
as_tuple = (tuple(node[1]), node[2], refs_as_tuples)
451
self.outf.write('%s\n' % (as_tuple,))
230
b = WorkingTree.open_containing(u'.')[0].branch
232
# TODO: jam 20060112 should cat-revision always output utf-8?
233
if revision_id is not None:
234
self.outf.write(b.repository.get_revision_xml(revision_id).decode('utf-8'))
235
elif revision is not None:
238
raise errors.BzrCommandError('You cannot specify a NULL'
240
revno, rev_id = rev.in_history(b)
241
self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
454
244
class cmd_remove_tree(Command):
455
__doc__ = """Remove the working tree from a given branch/checkout.
245
"""Remove the working tree from a given branch/checkout.
457
247
Since a lightweight checkout is little more than a working tree
458
248
this will refuse to run against one.
460
250
To re-create the working tree, use "bzr checkout".
462
252
_see_also = ['checkout', 'working-trees']
463
takes_args = ['location*']
466
help='Remove the working tree even if it has '
467
'uncommitted or shelved changes.'),
470
def run(self, location_list, force=False):
471
if not location_list:
474
for location in location_list:
475
d = bzrdir.BzrDir.open(location)
478
working = d.open_workingtree()
479
except errors.NoWorkingTree:
480
raise errors.BzrCommandError("No working tree to remove")
481
except errors.NotLocalUrl:
482
raise errors.BzrCommandError("You cannot remove the working tree"
485
if (working.has_changes()):
486
raise errors.UncommittedChanges(working)
487
if working.get_shelf_manager().last_shelf() is not None:
488
raise errors.ShelvedChanges(working)
490
if working.user_url != working.branch.user_url:
491
raise errors.BzrCommandError("You cannot remove the working tree"
492
" from a lightweight checkout")
494
d.destroy_workingtree()
497
class cmd_repair_workingtree(Command):
498
__doc__ = """Reset the working tree state file.
500
This is not meant to be used normally, but more as a way to recover from
501
filesystem corruption, etc. This rebuilds the working inventory back to a
502
'known good' state. Any new modifications (adding a file, renaming, etc)
503
will be lost, though modified files will still be detected as such.
505
Most users will want something more like "bzr revert" or "bzr update"
506
unless the state file has become corrupted.
508
By default this attempts to recover the current state by looking at the
509
headers of the state file. If the state file is too corrupted to even do
510
that, you can supply --revision to force the state of the tree.
513
takes_options = ['revision', 'directory',
515
help='Reset the tree even if it doesn\'t appear to be'
520
def run(self, revision=None, directory='.', force=False):
521
tree, _ = WorkingTree.open_containing(directory)
522
self.add_cleanup(tree.lock_tree_write().unlock)
526
except errors.BzrError:
527
pass # There seems to be a real error here, so we'll reset
530
raise errors.BzrCommandError(
531
'The tree does not appear to be corrupt. You probably'
532
' want "bzr revert" instead. Use "--force" if you are'
533
' sure you want to reset the working tree.')
537
revision_ids = [r.as_revision_id(tree.branch) for r in revision]
254
takes_args = ['location?']
256
def run(self, location='.'):
257
d = bzrdir.BzrDir.open(location)
539
tree.reset_state(revision_ids)
540
except errors.BzrError, e:
541
if revision_ids is None:
542
extra = (', the header appears corrupt, try passing -r -1'
543
' to set the state to the last commit')
546
raise errors.BzrCommandError('failed to reset the tree state'
260
working = d.open_workingtree()
261
except errors.NoWorkingTree:
262
raise errors.BzrCommandError("No working tree to remove")
263
except errors.NotLocalUrl:
264
raise errors.BzrCommandError("You cannot remove the working tree of a "
267
working_path = working.bzrdir.root_transport.base
268
branch_path = working.branch.bzrdir.root_transport.base
269
if working_path != branch_path:
270
raise errors.BzrCommandError("You cannot remove the working tree from "
271
"a lightweight checkout")
273
d.destroy_workingtree()
550
276
class cmd_revno(Command):
551
__doc__ = """Show current revision number.
277
"""Show current revision number.
553
279
This is equal to the number of revisions on this branch.
556
282
_see_also = ['info']
557
283
takes_args = ['location?']
559
Option('tree', help='Show revno of working tree'),
563
def run(self, tree=False, location=u'.'):
566
wt = WorkingTree.open_containing(location)[0]
567
self.add_cleanup(wt.lock_read().unlock)
568
except (errors.NoWorkingTree, errors.NotLocalUrl):
569
raise errors.NoWorkingTree(location)
570
revid = wt.last_revision()
572
revno_t = wt.branch.revision_id_to_dotted_revno(revid)
573
except errors.NoSuchRevision:
575
revno = ".".join(str(n) for n in revno_t)
577
b = Branch.open_containing(location)[0]
578
self.add_cleanup(b.lock_read().unlock)
581
self.outf.write(str(revno) + '\n')
286
def run(self, location=u'.'):
287
self.outf.write(str(Branch.open_containing(location)[0].revno()))
288
self.outf.write('\n')
584
291
class cmd_revision_info(Command):
585
__doc__ = """Show revision number and revision id for a given revision identifier.
292
"""Show revision number and revision id for a given revision identifier.
588
295
takes_args = ['revision_info*']
591
custom_help('directory',
592
help='Branch to examine, '
593
'rather than the one containing the working directory.'),
594
Option('tree', help='Show revno of working tree'),
296
takes_options = ['revision']
598
def run(self, revision=None, directory=u'.', tree=False,
599
revision_info_list=[]):
299
def run(self, revision=None, revision_info_list=[]):
602
wt = WorkingTree.open_containing(directory)[0]
604
self.add_cleanup(wt.lock_read().unlock)
605
except (errors.NoWorkingTree, errors.NotLocalUrl):
607
b = Branch.open_containing(directory)[0]
608
self.add_cleanup(b.lock_read().unlock)
610
302
if revision is not None:
611
revision_ids.extend(rev.as_revision_id(b) for rev in revision)
303
revs.extend(revision)
612
304
if revision_info_list is not None:
613
for rev_str in revision_info_list:
614
rev_spec = RevisionSpec.from_string(rev_str)
615
revision_ids.append(rev_spec.as_revision_id(b))
616
# No arguments supplied, default to the last revision
617
if len(revision_ids) == 0:
620
raise errors.NoWorkingTree(directory)
621
revision_ids.append(wt.last_revision())
305
for rev in revision_info_list:
306
revs.append(RevisionSpec.from_string(rev))
308
b = Branch.open_containing(u'.')[0]
311
revs.append(RevisionSpec.from_string('-1'))
314
revinfo = rev.in_history(b)
315
if revinfo.revno is None:
316
dotted_map = b.get_revision_id_to_revno_map()
317
revno = '.'.join(str(i) for i in dotted_map[revinfo.rev_id])
318
print '%s %s' % (revno, revinfo.rev_id)
623
revision_ids.append(b.last_revision())
627
for revision_id in revision_ids:
629
dotted_revno = b.revision_id_to_dotted_revno(revision_id)
630
revno = '.'.join(str(i) for i in dotted_revno)
631
except errors.NoSuchRevision:
633
maxlen = max(maxlen, len(revno))
634
revinfos.append([revno, revision_id])
638
self.outf.write('%*s %s\n' % (maxlen, ri[0], ri[1]))
320
print '%4d %s' % (revinfo.revno, revinfo.rev_id)
641
323
class cmd_add(Command):
642
__doc__ = """Add specified files or directories.
324
"""Add specified files or directories.
644
326
In non-recursive mode, all the named items are added, regardless
645
327
of whether they were previously ignored. A warning is given if
848
525
takes_args = ['names*']
849
takes_options = [Option("after", help="Move only the bzr identifier"
850
" of the file, because the file has already been moved."),
851
Option('auto', help='Automatically guess renames.'),
852
Option('dry-run', help='Avoid making changes when guessing renames.'),
526
takes_options = [Option("after", help="move only the bzr identifier"
527
" of the file (file has already been moved). Use this flag if"
528
" bzr is not able to detect this itself.")]
854
529
aliases = ['move', 'rename']
855
530
encoding_type = 'replace'
857
def run(self, names_list, after=False, auto=False, dry_run=False):
859
return self.run_auto(names_list, after, dry_run)
861
raise errors.BzrCommandError('--dry-run requires --auto.')
532
def run(self, names_list, after=False):
862
533
if names_list is None:
864
536
if len(names_list) < 2:
865
537
raise errors.BzrCommandError("missing file argument")
866
tree, rel_names = WorkingTree.open_containing_paths(names_list, canonicalize=False)
867
self.add_cleanup(tree.lock_tree_write().unlock)
868
self._run(tree, names_list, rel_names, after)
870
def run_auto(self, names_list, after, dry_run):
871
if names_list is not None and len(names_list) > 1:
872
raise errors.BzrCommandError('Only one path may be specified to'
875
raise errors.BzrCommandError('--after cannot be specified with'
877
work_tree, file_list = WorkingTree.open_containing_paths(
878
names_list, default_directory='.')
879
self.add_cleanup(work_tree.lock_tree_write().unlock)
880
rename_map.RenameMap.guess_renames(work_tree, dry_run)
882
def _run(self, tree, names_list, rel_names, after):
883
into_existing = osutils.isdir(names_list[-1])
884
if into_existing and len(names_list) == 2:
886
# a. case-insensitive filesystem and change case of dir
887
# b. move directory after the fact (if the source used to be
888
# a directory, but now doesn't exist in the working tree
889
# and the target is an existing directory, just rename it)
890
if (not tree.case_sensitive
891
and rel_names[0].lower() == rel_names[1].lower()):
892
into_existing = False
895
# 'fix' the case of a potential 'from'
896
from_id = tree.path2id(
897
tree.get_canonical_inventory_path(rel_names[0]))
898
if (not osutils.lexists(names_list[0]) and
899
from_id and inv.get_file_kind(from_id) == "directory"):
900
into_existing = False
538
tree, rel_names = tree_files(names_list)
540
if os.path.isdir(names_list[-1]):
903
541
# move into existing directory
904
# All entries reference existing inventory items, so fix them up
905
# for cicp file-systems.
906
rel_names = tree.get_canonical_inventory_paths(rel_names)
907
for src, dest in tree.move(rel_names[:-1], rel_names[-1], after=after):
909
self.outf.write("%s => %s\n" % (src, dest))
542
for pair in tree.move(rel_names[:-1], rel_names[-1], after=after):
543
self.outf.write("%s => %s\n" % pair)
911
545
if len(names_list) != 2:
912
546
raise errors.BzrCommandError('to mv multiple files the'
913
547
' destination must be a versioned'
916
# for cicp file-systems: the src references an existing inventory
918
src = tree.get_canonical_inventory_path(rel_names[0])
919
# Find the canonical version of the destination: In all cases, the
920
# parent of the target must be in the inventory, so we fetch the
921
# canonical version from there (we do not always *use* the
922
# canonicalized tail portion - we may be attempting to rename the
924
canon_dest = tree.get_canonical_inventory_path(rel_names[1])
925
dest_parent = osutils.dirname(canon_dest)
926
spec_tail = osutils.basename(rel_names[1])
927
# For a CICP file-system, we need to avoid creating 2 inventory
928
# entries that differ only by case. So regardless of the case
929
# we *want* to use (ie, specified by the user or the file-system),
930
# we must always choose to use the case of any existing inventory
931
# items. The only exception to this is when we are attempting a
932
# case-only rename (ie, canonical versions of src and dest are
934
dest_id = tree.path2id(canon_dest)
935
if dest_id is None or tree.path2id(src) == dest_id:
936
# No existing item we care about, so work out what case we
937
# are actually going to use.
939
# If 'after' is specified, the tail must refer to a file on disk.
941
dest_parent_fq = osutils.pathjoin(tree.basedir, dest_parent)
943
# pathjoin with an empty tail adds a slash, which breaks
945
dest_parent_fq = tree.basedir
947
dest_tail = osutils.canonical_relpath(
949
osutils.pathjoin(dest_parent_fq, spec_tail))
951
# not 'after', so case as specified is used
952
dest_tail = spec_tail
954
# Use the existing item so 'mv' fails with AlreadyVersioned.
955
dest_tail = os.path.basename(canon_dest)
956
dest = osutils.pathjoin(dest_parent, dest_tail)
957
mutter("attempting to move %s => %s", src, dest)
958
tree.rename_one(src, dest, after=after)
960
self.outf.write("%s => %s\n" % (src, dest))
549
tree.rename_one(rel_names[0], rel_names[1], after=after)
550
self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1]))
963
553
class cmd_pull(Command):
964
__doc__ = """Turn this branch into a mirror of another branch.
554
"""Turn this branch into a mirror of another branch.
966
By default, this command only works on branches that have not diverged.
967
Branches are considered diverged if the destination branch's most recent
968
commit is one that has not been merged (directly or indirectly) into the
556
This command only works on branches that have not diverged. Branches are
557
considered diverged if the destination branch's most recent commit is one
558
that has not been merged (directly or indirectly) into the parent.
971
560
If branches have diverged, you can use 'bzr merge' to integrate the changes
972
561
from one into the other. Once one branch has merged, the other should
973
562
be able to pull it again.
975
If you want to replace your local changes and just want your branch to
976
match the remote one, use pull --overwrite. This will work even if the two
977
branches have diverged.
979
If there is no default location set, the first pull will set it (use
980
--no-remember to avoid setting it). After that, you can omit the
981
location to use the default. To change the default, use --remember. The
982
value will only be saved if the remote location can be accessed.
984
Note: The location can be specified either in the form of a branch,
985
or in the form of a path to a file containing a merge directive generated
564
If you want to forget your local changes and just update your branch to
565
match the remote one, use pull --overwrite.
567
If there is no default location set, the first pull will set it. After
568
that, you can omit the location to use the default. To change the
569
default, use --remember. The value will only be saved if the remote
570
location can be accessed.
989
_see_also = ['push', 'update', 'status-flags', 'send']
990
takes_options = ['remember', 'overwrite', 'revision',
991
custom_help('verbose',
992
help='Show logs of pulled revisions.'),
993
custom_help('directory',
994
help='Branch to pull into, '
995
'rather than the one containing the working directory.'),
997
help="Perform a local pull in a bound "
998
"branch. Local pulls are not applied to "
573
_see_also = ['push', 'update']
574
takes_options = ['remember', 'overwrite', 'revision', 'verbose',
576
help='branch to pull into, '
577
'rather than the one containing the working directory',
1002
help="Show base revision text in conflicts.")
1004
582
takes_args = ['location?']
1005
583
encoding_type = 'replace'
1007
def run(self, location=None, remember=None, overwrite=False,
585
def run(self, location=None, remember=False, overwrite=False,
1008
586
revision=None, verbose=False,
1009
directory=None, local=False,
588
from bzrlib.tag import _merge_tags_if_possible
1011
589
# FIXME: too much stuff is in the command class
1012
590
revision_id = None
1013
591
mergeable = None
1108
667
If branches have diverged, you can use 'bzr push --overwrite' to replace
1109
668
the other branch completely, discarding its unmerged changes.
1111
670
If you want to ensure you have the different changes in the other branch,
1112
671
do a merge (see bzr help merge) from the other branch, and commit that.
1113
672
After that you will be able to do a push without '--overwrite'.
1115
If there is no default push location set, the first push will set it (use
1116
--no-remember to avoid setting it). After that, you can omit the
1117
location to use the default. To change the default, use --remember. The
1118
value will only be saved if the remote location can be accessed.
674
If there is no default push location set, the first push will set it.
675
After that, you can omit the location to use the default. To change the
676
default, use --remember. The value will only be saved if the remote
677
location can be accessed.
1121
680
_see_also = ['pull', 'update', 'working-trees']
1122
takes_options = ['remember', 'overwrite', 'verbose', 'revision',
681
takes_options = ['remember', 'overwrite', 'verbose',
1123
682
Option('create-prefix',
1124
683
help='Create the path leading up to the branch '
1125
'if it does not already exist.'),
1126
custom_help('directory',
1127
help='Branch to push from, '
1128
'rather than the one containing the working directory.'),
684
'if it does not already exist'),
686
help='branch to push from, '
687
'rather than the one containing the working directory',
1129
691
Option('use-existing-dir',
1130
692
help='By default push will fail if the target'
1131
693
' directory exists, but does not already'
1132
' have a control directory. This flag will'
694
' have a control directory. This flag will'
1133
695
' allow push to proceed.'),
1135
help='Create a stacked branch that references the public location '
1136
'of the parent branch.'),
1137
Option('stacked-on',
1138
help='Create a stacked branch that refers to another branch '
1139
'for the commit history. Only the work not present in the '
1140
'referenced branch is included in the branch created.',
1143
help='Refuse to push if there are uncommitted changes in'
1144
' the working tree, --no-strict disables the check.'),
1146
help="Don't populate the working tree, even for protocols"
1147
" that support it."),
1149
697
takes_args = ['location?']
1150
698
encoding_type = 'replace'
1152
def run(self, location=None, remember=None, overwrite=False,
1153
create_prefix=False, verbose=False, revision=None,
1154
use_existing_dir=False, directory=None, stacked_on=None,
1155
stacked=False, strict=None, no_tree=False):
1156
from bzrlib.push import _show_push_branch
700
def run(self, location=None, remember=False, overwrite=False,
701
create_prefix=False, verbose=False,
702
use_existing_dir=False,
704
# FIXME: Way too big! Put this into a function called from the
1158
706
if directory is None:
1160
# Get the source branch
1162
_unused) = bzrdir.BzrDir.open_containing_tree_or_branch(directory)
1163
# Get the tip's revision_id
1164
revision = _get_one_revision('push', revision)
1165
if revision is not None:
1166
revision_id = revision.in_history(br_from).rev_id
1169
if tree is not None and revision_id is None:
1170
tree.check_changed_or_out_of_date(
1171
strict, 'push_strict',
1172
more_error='Use --no-strict to force the push.',
1173
more_warning='Uncommitted changes will not be pushed.')
1174
# Get the stacked_on branch, if any
1175
if stacked_on is not None:
1176
stacked_on = urlutils.normalize_url(stacked_on)
1178
parent_url = br_from.get_parent()
1180
parent = Branch.open(parent_url)
1181
stacked_on = parent.get_public_branch()
1183
# I considered excluding non-http url's here, thus forcing
1184
# 'public' branches only, but that only works for some
1185
# users, so it's best to just depend on the user spotting an
1186
# error by the feedback given to them. RBC 20080227.
1187
stacked_on = parent_url
1189
raise errors.BzrCommandError(
1190
"Could not determine branch to refer to.")
1192
# Get the destination location
708
br_from = Branch.open_containing(directory)[0]
709
stored_loc = br_from.get_push_location()
1193
710
if location is None:
1194
stored_loc = br_from.get_push_location()
1195
711
if stored_loc is None:
1196
raise errors.BzrCommandError(
1197
"No push location known or specified.")
712
raise errors.BzrCommandError("No push location known or specified.")
1199
714
display_url = urlutils.unescape_for_display(stored_loc,
1200
715
self.outf.encoding)
1201
note("Using saved push location: %s" % display_url)
716
self.outf.write("Using saved location: %s\n" % display_url)
1202
717
location = stored_loc
1204
_show_push_branch(br_from, revision_id, location, self.outf,
1205
verbose=verbose, overwrite=overwrite, remember=remember,
1206
stacked_on=stacked_on, create_prefix=create_prefix,
1207
use_existing_dir=use_existing_dir, no_tree=no_tree)
719
to_transport = transport.get_transport(location)
721
br_to = repository_to = dir_to = None
723
dir_to = bzrdir.BzrDir.open_from_transport(to_transport)
724
except errors.NotBranchError:
725
pass # Didn't find anything
727
# If we can open a branch, use its direct repository, otherwise see
728
# if there is a repository without a branch.
730
br_to = dir_to.open_branch()
731
except errors.NotBranchError:
732
# Didn't find a branch, can we find a repository?
734
repository_to = dir_to.find_repository()
735
except errors.NoRepositoryPresent:
738
# Found a branch, so we must have found a repository
739
repository_to = br_to.repository
743
# The destination doesn't exist; create it.
744
# XXX: Refactor the create_prefix/no_create_prefix code into a
745
# common helper function
747
to_transport.mkdir('.')
748
except errors.FileExists:
749
if not use_existing_dir:
750
raise errors.BzrCommandError("Target directory %s"
751
" already exists, but does not have a valid .bzr"
752
" directory. Supply --use-existing-dir to push"
753
" there anyway." % location)
754
except errors.NoSuchFile:
755
if not create_prefix:
756
raise errors.BzrCommandError("Parent directory of %s"
758
"\nYou may supply --create-prefix to create all"
759
" leading parent directories."
762
_create_prefix(to_transport)
764
# Now the target directory exists, but doesn't have a .bzr
765
# directory. So we need to create it, along with any work to create
766
# all of the dependent branches, etc.
767
dir_to = br_from.bzrdir.clone_on_transport(to_transport,
768
revision_id=br_from.last_revision())
769
br_to = dir_to.open_branch()
770
# TODO: Some more useful message about what was copied
771
note('Created new branch.')
772
# We successfully created the target, remember it
773
if br_from.get_push_location() is None or remember:
774
br_from.set_push_location(br_to.base)
775
elif repository_to is None:
776
# we have a bzrdir but no branch or repository
777
# XXX: Figure out what to do other than complain.
778
raise errors.BzrCommandError("At %s you have a valid .bzr control"
779
" directory, but not a branch or repository. This is an"
780
" unsupported configuration. Please move the target directory"
781
" out of the way and try again."
784
# We have a repository but no branch, copy the revisions, and then
786
last_revision_id = br_from.last_revision()
787
repository_to.fetch(br_from.repository,
788
revision_id=last_revision_id)
789
br_to = br_from.clone(dir_to, revision_id=last_revision_id)
790
note('Created new branch.')
791
if br_from.get_push_location() is None or remember:
792
br_from.set_push_location(br_to.base)
793
else: # We have a valid to branch
794
# We were able to connect to the remote location, so remember it
795
# we don't need to successfully push because of possible divergence.
796
if br_from.get_push_location() is None or remember:
797
br_from.set_push_location(br_to.base)
798
old_rh = br_to.revision_history()
801
tree_to = dir_to.open_workingtree()
802
except errors.NotLocalUrl:
803
warning("This transport does not update the working "
804
"tree of: %s. See 'bzr help working-trees' for "
805
"more information." % br_to.base)
806
push_result = br_from.push(br_to, overwrite)
807
except errors.NoWorkingTree:
808
push_result = br_from.push(br_to, overwrite)
812
push_result = br_from.push(tree_to.branch, overwrite)
816
except errors.DivergedBranches:
817
raise errors.BzrCommandError('These branches have diverged.'
818
' Try using "merge" and then "push".')
819
if push_result is not None:
820
push_result.report(self.outf)
822
new_rh = br_to.revision_history()
825
from bzrlib.log import show_changed_revisions
826
show_changed_revisions(br_to, old_rh, new_rh,
829
# we probably did a clone rather than a push, so a message was
1210
834
class cmd_branch(Command):
1211
__doc__ = """Create a new branch that is a copy of an existing branch.
835
"""Create a new copy of a branch.
1213
837
If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
1214
838
be used. In other words, "branch ../foo/bar" will attempt to create ./bar.
1220
844
To retrieve the branch as of a particular revision, supply the --revision
1221
845
parameter, as in "branch foo/bar -r 5".
1223
The synonyms 'clone' and 'get' for this command are deprecated.
1226
848
_see_also = ['checkout']
1227
849
takes_args = ['from_location', 'to_location?']
1228
takes_options = ['revision',
1229
Option('hardlink', help='Hard-link working tree files where possible.'),
1230
Option('files-from', type=str,
1231
help="Get file contents from this tree."),
1233
help="Create a branch without a working-tree."),
1235
help="Switch the checkout in the current directory "
1236
"to the new branch."),
1238
help='Create a stacked branch referring to the source branch. '
1239
'The new branch will depend on the availability of the source '
1240
'branch for all operations.'),
1241
Option('standalone',
1242
help='Do not use a shared repository, even if available.'),
1243
Option('use-existing-dir',
1244
help='By default branch will fail if the target'
1245
' directory exists, but does not already'
1246
' have a control directory. This flag will'
1247
' allow branch to proceed.'),
1249
help="Bind new branch to from location."),
850
takes_options = ['revision']
1251
851
aliases = ['get', 'clone']
1253
def run(self, from_location, to_location=None, revision=None,
1254
hardlink=False, stacked=False, standalone=False, no_tree=False,
1255
use_existing_dir=False, switch=False, bind=False,
1257
from bzrlib import switch as _mod_switch
853
def run(self, from_location, to_location=None, revision=None):
1258
854
from bzrlib.tag import _merge_tags_if_possible
1259
if self.invoked_as in ['get', 'clone']:
1260
ui.ui_factory.show_user_warning(
1261
'deprecated_command',
1262
deprecated_name=self.invoked_as,
1263
recommended_name='branch',
1264
deprecated_in_version='2.4')
1265
accelerator_tree, br_from = bzrdir.BzrDir.open_tree_or_branch(
1267
if not (hardlink or files_from):
1268
# accelerator_tree is usually slower because you have to read N
1269
# files (no readahead, lots of seeks, etc), but allow the user to
1270
# explicitly request it
1271
accelerator_tree = None
1272
if files_from is not None and files_from != from_location:
1273
accelerator_tree = WorkingTree.open(files_from)
1274
revision = _get_one_revision('branch', revision)
1275
self.add_cleanup(br_from.lock_read().unlock)
1276
if revision is not None:
1277
revision_id = revision.as_revision_id(br_from)
1279
# FIXME - wt.last_revision, fallback to branch, fall back to
1280
# None or perhaps NULL_REVISION to mean copy nothing
1282
revision_id = br_from.last_revision()
1283
if to_location is None:
1284
to_location = urlutils.derive_to_location(from_location)
1285
to_transport = transport.get_transport(to_location)
1287
to_transport.mkdir('.')
1288
except errors.FileExists:
1289
if not use_existing_dir:
1290
raise errors.BzrCommandError('Target directory "%s" '
1291
'already exists.' % to_location)
1294
bzrdir.BzrDir.open_from_transport(to_transport)
1295
except errors.NotBranchError:
1298
raise errors.AlreadyBranchError(to_location)
1299
except errors.NoSuchFile:
1300
raise errors.BzrCommandError('Parent of "%s" does not exist.'
1303
# preserve whatever source format we have.
1304
dir = br_from.bzrdir.sprout(to_transport.base, revision_id,
1305
possible_transports=[to_transport],
1306
accelerator_tree=accelerator_tree,
1307
hardlink=hardlink, stacked=stacked,
1308
force_new_repo=standalone,
1309
create_tree_if_local=not no_tree,
1310
source_branch=br_from)
1311
branch = dir.open_branch()
1312
except errors.NoSuchRevision:
1313
to_transport.delete_tree('.')
1314
msg = "The branch %s has no revision %s." % (from_location,
1316
raise errors.BzrCommandError(msg)
1317
_merge_tags_if_possible(br_from, branch)
1318
# If the source branch is stacked, the new branch may
1319
# be stacked whether we asked for that explicitly or not.
1320
# We therefore need a try/except here and not just 'if stacked:'
1322
note('Created new stacked branch referring to %s.' %
1323
branch.get_stacked_on_url())
1324
except (errors.NotStacked, errors.UnstackableBranchFormat,
1325
errors.UnstackableRepositoryFormat), e:
857
elif len(revision) > 1:
858
raise errors.BzrCommandError(
859
'bzr branch --revision takes exactly 1 revision value')
861
br_from = Branch.open(from_location)
864
if len(revision) == 1 and revision[0] is not None:
865
revision_id = revision[0].in_history(br_from)[1]
867
# FIXME - wt.last_revision, fallback to branch, fall back to
868
# None or perhaps NULL_REVISION to mean copy nothing
870
revision_id = br_from.last_revision()
871
if to_location is None:
872
to_location = urlutils.derive_to_location(from_location)
875
name = os.path.basename(to_location) + '\n'
877
to_transport = transport.get_transport(to_location)
879
to_transport.mkdir('.')
880
except errors.FileExists:
881
raise errors.BzrCommandError('Target directory "%s" already'
882
' exists.' % to_location)
883
except errors.NoSuchFile:
884
raise errors.BzrCommandError('Parent of "%s" does not exist.'
887
# preserve whatever source format we have.
888
dir = br_from.bzrdir.sprout(to_transport.base, revision_id)
889
branch = dir.open_branch()
890
except errors.NoSuchRevision:
891
to_transport.delete_tree('.')
892
msg = "The branch %s has no revision %s." % (from_location, revision[0])
893
raise errors.BzrCommandError(msg)
895
branch.control_files.put_utf8('branch-name', name)
896
_merge_tags_if_possible(br_from, branch)
1326
897
note('Branched %d revision(s).' % branch.revno())
1328
# Bind to the parent
1329
parent_branch = Branch.open(from_location)
1330
branch.bind(parent_branch)
1331
note('New branch bound to %s' % from_location)
1333
# Switch to the new branch
1334
wt, _ = WorkingTree.open_containing('.')
1335
_mod_switch.switch(wt.bzrdir, branch)
1336
note('Switched to branch: %s',
1337
urlutils.unescape_for_display(branch.base, 'utf-8'))
1340
class cmd_branches(Command):
1341
__doc__ = """List the branches available at the current location.
1343
This command will print the names of all the branches at the current location.
1346
takes_args = ['location?']
1348
def run(self, location="."):
1349
dir = bzrdir.BzrDir.open_containing(location)[0]
1350
for branch in dir.list_branches():
1351
if branch.name is None:
1352
self.outf.write(" (default)\n")
1354
self.outf.write(" %s\n" % branch.name.encode(self.outf.encoding))
1357
902
class cmd_checkout(Command):
1358
__doc__ = """Create a new checkout of an existing branch.
903
"""Create a new checkout of an existing branch.
1360
905
If BRANCH_LOCATION is omitted, checkout will reconstitute a working tree for
1361
906
the branch found in '.'. This is useful if you have removed the working tree
1362
907
or if it was never created - i.e. if you pushed the branch to its current
1363
908
location using SFTP.
1365
910
If the TO_LOCATION is omitted, the last component of the BRANCH_LOCATION will
1366
911
be used. In other words, "checkout ../foo/bar" will attempt to create ./bar.
1367
912
If the BRANCH_LOCATION has no / or path separator embedded, the TO_LOCATION
1440
986
@display_command
1441
987
def run(self, dir=u'.'):
1442
988
tree = WorkingTree.open_containing(dir)[0]
1443
self.add_cleanup(tree.lock_read().unlock)
1444
new_inv = tree.inventory
1445
old_tree = tree.basis_tree()
1446
self.add_cleanup(old_tree.lock_read().unlock)
1447
old_inv = old_tree.inventory
1449
iterator = tree.iter_changes(old_tree, include_unchanged=True)
1450
for f, paths, c, v, p, n, k, e in iterator:
1451
if paths[0] == paths[1]:
1455
renames.append(paths)
1457
for old_name, new_name in renames:
1458
self.outf.write("%s => %s\n" % (old_name, new_name))
991
new_inv = tree.inventory
992
old_tree = tree.basis_tree()
995
old_inv = old_tree.inventory
996
renames = list(_mod_tree.find_renames(old_inv, new_inv))
998
for old_name, new_name in renames:
999
self.outf.write("%s => %s\n" % (old_name, new_name))
1461
1006
class cmd_update(Command):
1462
__doc__ = """Update a tree to have the latest code committed to its branch.
1007
"""Update a tree to have the latest code committed to its branch.
1464
1009
This will perform a merge into the working tree, and may generate
1465
conflicts. If you have any local changes, you will still
1010
conflicts. If you have any local changes, you will still
1466
1011
need to commit them after the update for the update to be complete.
1468
If you want to discard your local changes, you can just do a
1013
If you want to discard your local changes, you can just do a
1469
1014
'bzr revert' instead of 'bzr commit' after the update.
1471
If you want to restore a file that has been removed locally, use
1472
'bzr revert' instead of 'bzr update'.
1474
If the tree's branch is bound to a master branch, it will also update
1475
the branch from the master.
1478
_see_also = ['pull', 'working-trees', 'status-flags']
1017
_see_also = ['pull', 'working-trees']
1479
1018
takes_args = ['dir?']
1480
takes_options = ['revision',
1482
help="Show base revision text in conflicts."),
1484
1019
aliases = ['up']
1486
def run(self, dir='.', revision=None, show_base=None):
1487
if revision is not None and len(revision) != 1:
1488
raise errors.BzrCommandError(
1489
"bzr update --revision takes exactly one revision")
1021
def run(self, dir='.'):
1490
1022
tree = WorkingTree.open_containing(dir)[0]
1491
branch = tree.branch
1492
possible_transports = []
1493
master = branch.get_master_branch(
1494
possible_transports=possible_transports)
1023
master = tree.branch.get_master_branch()
1495
1024
if master is not None:
1496
branch_location = master.base
1497
1025
tree.lock_write()
1499
branch_location = tree.branch.base
1500
1027
tree.lock_tree_write()
1501
self.add_cleanup(tree.unlock)
1502
# get rid of the final '/' and be ready for display
1503
branch_location = urlutils.unescape_for_display(
1504
branch_location.rstrip('/'),
1506
existing_pending_merges = tree.get_parent_ids()[1:]
1510
# may need to fetch data into a heavyweight checkout
1511
# XXX: this may take some time, maybe we should display a
1513
old_tip = branch.update(possible_transports)
1514
if revision is not None:
1515
revision_id = revision[0].as_revision_id(branch)
1517
revision_id = branch.last_revision()
1518
if revision_id == _mod_revision.ensure_null(tree.last_revision()):
1519
revno = branch.revision_id_to_dotted_revno(revision_id)
1520
note("Tree is up to date at revision %s of branch %s" %
1521
('.'.join(map(str, revno)), branch_location))
1523
view_info = _get_view_info_for_change_reporter(tree)
1524
change_reporter = delta._ChangeReporter(
1525
unversioned_filter=tree.is_ignored,
1526
view_info=view_info)
1528
conflicts = tree.update(
1530
possible_transports=possible_transports,
1531
revision=revision_id,
1533
show_base=show_base)
1534
except errors.NoSuchRevision, e:
1535
raise errors.BzrCommandError(
1536
"branch has no revision %s\n"
1537
"bzr update --revision only works"
1538
" for a revision in the branch history"
1540
revno = tree.branch.revision_id_to_dotted_revno(
1541
_mod_revision.ensure_null(tree.last_revision()))
1542
note('Updated to revision %s of branch %s' %
1543
('.'.join(map(str, revno)), branch_location))
1544
parent_ids = tree.get_parent_ids()
1545
if parent_ids[1:] and parent_ids[1:] != existing_pending_merges:
1546
note('Your local commits will now show as pending merges with '
1547
"'bzr status', and can be committed with 'bzr commit'.")
1029
existing_pending_merges = tree.get_parent_ids()[1:]
1030
last_rev = tree.last_revision()
1031
if last_rev == tree.branch.last_revision():
1032
# may be up to date, check master too.
1033
master = tree.branch.get_master_branch()
1034
if master is None or last_rev == master.last_revision():
1035
revno = tree.branch.revision_id_to_revno(last_rev)
1036
note("Tree is up to date at revision %d." % (revno,))
1038
conflicts = tree.update()
1039
revno = tree.branch.revision_id_to_revno(tree.last_revision())
1040
note('Updated to revision %d.' % (revno,))
1041
if tree.get_parent_ids()[1:] != existing_pending_merges:
1042
note('Your local commits will now show as pending merges with '
1043
"'bzr status', and can be committed with 'bzr commit'.")
1554
1052
class cmd_info(Command):
1555
__doc__ = """Show information about a working tree, branch or repository.
1053
"""Show information about a working tree, branch or repository.
1557
1055
This command will show all known locations and formats associated to the
1558
tree, branch or repository.
1560
In verbose mode, statistical information is included with each report.
1561
To see extended statistic information, use a verbosity level of 2 or
1562
higher by specifying the verbose option multiple times, e.g. -vv.
1056
tree, branch or repository. Statistical information is included with
1564
1059
Branches and working trees will also report any missing revisions.
1568
Display information on the format and related locations:
1572
Display the above together with extended format information and
1573
basic statistics (like the number of files in the working tree and
1574
number of revisions in the branch and repository):
1578
Display the above together with number of committers to the branch:
1582
1061
_see_also = ['revno', 'working-trees', 'repositories']
1583
1062
takes_args = ['location?']
1584
1063
takes_options = ['verbose']
1585
encoding_type = 'replace'
1587
1065
@display_command
1588
def run(self, location=None, verbose=False):
1590
noise_level = get_verbosity_level()
1066
def run(self, location=None, verbose=0):
1593
1067
from bzrlib.info import show_bzrdir_info
1594
1068
show_bzrdir_info(bzrdir.BzrDir.open_containing(location)[0],
1595
verbose=noise_level, outfile=self.outf)
1598
1072
class cmd_remove(Command):
1599
__doc__ = """Remove files or directories.
1601
This makes Bazaar stop tracking changes to the specified files. Bazaar will
1602
delete them if they can easily be recovered using revert otherwise they
1603
will be backed up (adding an extention of the form .~#~). If no options or
1604
parameters are given Bazaar will scan for files that are being tracked by
1605
Bazaar but missing in your tree and stop tracking them for you.
1073
"""Remove files or directories.
1075
This makes bzr stop tracking changes to the specified files and
1076
delete them if they can easily be recovered using revert.
1078
You can specify one or more files, and/or --new. If you specify --new,
1079
only 'added' files will be removed. If you specify both, then new files
1080
in the specified directories will be removed. If the directories are
1081
also new, they will also be removed.
1607
1083
takes_args = ['file*']
1608
1084
takes_options = ['verbose',
1609
Option('new', help='Only remove files that have never been committed.'),
1085
Option('new', help='remove newly-added files'),
1610
1086
RegistryOption.from_kwargs('file-deletion-strategy',
1611
'The file deletion mode to be used.',
1087
'The file deletion mode to be used',
1612
1088
title='Deletion Strategy', value_switches=True, enum_switch=False,
1613
safe='Backup changed files (default).',
1614
keep='Delete from bzr but leave the working copy.',
1615
no_backup='Don\'t backup changed files.',
1089
safe='Only delete files if they can be'
1090
' safely recovered (default).',
1091
keep="Don't delete any files.",
1616
1092
force='Delete all the specified files, even if they can not be '
1617
'recovered and even if they are non-empty directories. '
1618
'(deprecated, use no-backup)')]
1619
aliases = ['rm', 'del']
1093
'recovered and even if they are non-empty directories.')]
1620
1095
encoding_type = 'replace'
1622
1097
def run(self, file_list, verbose=False, new=False,
1623
1098
file_deletion_strategy='safe'):
1624
if file_deletion_strategy == 'force':
1625
note("(The --force option is deprecated, rather use --no-backup "
1627
file_deletion_strategy = 'no-backup'
1629
tree, file_list = WorkingTree.open_containing_paths(file_list)
1099
tree, file_list = tree_files(file_list)
1631
1101
if file_list is not None:
1632
file_list = [f for f in file_list]
1102
file_list = [f for f in file_list if f != '']
1104
raise errors.BzrCommandError('Specify one or more files to'
1105
' remove, or use --new.')
1634
self.add_cleanup(tree.lock_write().unlock)
1635
# Heuristics should probably all move into tree.remove_smart or
1638
1108
added = tree.changes_from(tree.basis_tree(),
1639
1109
specific_files=file_list).added
1640
1110
file_list = sorted([f[0] for f in added], reverse=True)
1641
1111
if len(file_list) == 0:
1642
1112
raise errors.BzrCommandError('No matching files.')
1643
elif file_list is None:
1644
# missing files show up in iter_changes(basis) as
1645
# versioned-with-no-kind.
1647
for change in tree.iter_changes(tree.basis_tree()):
1648
# Find paths in the working tree that have no kind:
1649
if change[1][1] is not None and change[6][1] is None:
1650
missing.append(change[1][1])
1651
file_list = sorted(missing, reverse=True)
1652
file_deletion_strategy = 'keep'
1653
1113
tree.remove(file_list, verbose=verbose, to_file=self.outf,
1654
1114
keep_files=file_deletion_strategy=='keep',
1655
force=(file_deletion_strategy=='no-backup'))
1115
force=file_deletion_strategy=='force')
1658
1118
class cmd_file_id(Command):
1659
__doc__ = """Print file_id of a particular file or directory.
1119
"""Print file_id of a particular file or directory.
1661
1121
The file_id is assigned when the file is first added and remains the
1662
1122
same through all revisions where the file exists, even when it is
2217
1579
raise errors.BzrCommandError(msg)
2220
def _parse_levels(s):
2224
msg = "The levels argument must be an integer."
2225
raise errors.BzrCommandError(msg)
2228
1582
class cmd_log(Command):
2229
__doc__ = """Show historical log for a branch or subset of a branch.
2231
log is bzr's default tool for exploring the history of a branch.
2232
The branch to use is taken from the first parameter. If no parameters
2233
are given, the branch containing the working directory is logged.
2234
Here are some simple examples::
2236
bzr log log the current branch
2237
bzr log foo.py log a file in its branch
2238
bzr log http://server/branch log a branch on a server
2240
The filtering, ordering and information shown for each revision can
2241
be controlled as explained below. By default, all revisions are
2242
shown sorted (topologically) so that newer revisions appear before
2243
older ones and descendants always appear before ancestors. If displayed,
2244
merged revisions are shown indented under the revision in which they
2249
The log format controls how information about each revision is
2250
displayed. The standard log formats are called ``long``, ``short``
2251
and ``line``. The default is long. See ``bzr help log-formats``
2252
for more details on log formats.
2254
The following options can be used to control what information is
2257
-l N display a maximum of N revisions
2258
-n N display N levels of revisions (0 for all, 1 for collapsed)
2259
-v display a status summary (delta) for each revision
2260
-p display a diff (patch) for each revision
2261
--show-ids display revision-ids (and file-ids), not just revnos
2263
Note that the default number of levels to display is a function of the
2264
log format. If the -n option is not used, the standard log formats show
2265
just the top level (mainline).
2267
Status summaries are shown using status flags like A, M, etc. To see
2268
the changes explained using words like ``added`` and ``modified``
2269
instead, use the -vv option.
2273
To display revisions from oldest to newest, use the --forward option.
2274
In most cases, using this option will have little impact on the total
2275
time taken to produce a log, though --forward does not incrementally
2276
display revisions like --reverse does when it can.
2278
:Revision filtering:
2280
The -r option can be used to specify what revision or range of revisions
2281
to filter against. The various forms are shown below::
2283
-rX display revision X
2284
-rX.. display revision X and later
2285
-r..Y display up to and including revision Y
2286
-rX..Y display from X to Y inclusive
2288
See ``bzr help revisionspec`` for details on how to specify X and Y.
2289
Some common examples are given below::
2291
-r-1 show just the tip
2292
-r-10.. show the last 10 mainline revisions
2293
-rsubmit:.. show what's new on this branch
2294
-rancestor:path.. show changes since the common ancestor of this
2295
branch and the one at location path
2296
-rdate:yesterday.. show changes since yesterday
2298
When logging a range of revisions using -rX..Y, log starts at
2299
revision Y and searches back in history through the primary
2300
("left-hand") parents until it finds X. When logging just the
2301
top level (using -n1), an error is reported if X is not found
2302
along the way. If multi-level logging is used (-n0), X may be
2303
a nested merge revision and the log will be truncated accordingly.
2307
If parameters are given and the first one is not a branch, the log
2308
will be filtered to show only those revisions that changed the
2309
nominated files or directories.
2311
Filenames are interpreted within their historical context. To log a
2312
deleted file, specify a revision range so that the file existed at
2313
the end or start of the range.
2315
Historical context is also important when interpreting pathnames of
2316
renamed files/directories. Consider the following example:
2318
* revision 1: add tutorial.txt
2319
* revision 2: modify tutorial.txt
2320
* revision 3: rename tutorial.txt to guide.txt; add tutorial.txt
2324
* ``bzr log guide.txt`` will log the file added in revision 1
2326
* ``bzr log tutorial.txt`` will log the new file added in revision 3
2328
* ``bzr log -r2 -p tutorial.txt`` will show the changes made to
2329
the original file in revision 2.
2331
* ``bzr log -r2 -p guide.txt`` will display an error message as there
2332
was no file called guide.txt in revision 2.
2334
Renames are always followed by log. By design, there is no need to
2335
explicitly ask for this (and no way to stop logging a file back
2336
until it was last renamed).
2340
The --match option can be used for finding revisions that match a
2341
regular expression in a commit message, committer, author or bug.
2342
Specifying the option several times will match any of the supplied
2343
expressions. --match-author, --match-bugs, --match-committer and
2344
--match-message can be used to only match a specific field.
2348
GUI tools and IDEs are often better at exploring history than command
2349
line tools: you may prefer qlog or viz from qbzr or bzr-gtk, the
2350
bzr-explorer shell, or the Loggerhead web interface. See the Plugin
2351
Guide <http://doc.bazaar.canonical.com/plugins/en/> and
2352
<http://wiki.bazaar.canonical.com/IDEIntegration>.
2354
You may find it useful to add the aliases below to ``bazaar.conf``::
2358
top = log -l10 --line
2361
``bzr tip`` will then show the latest revision while ``bzr top``
2362
will show the last 10 mainline revisions. To see the details of a
2363
particular revision X, ``bzr show -rX``.
2365
If you are interested in looking deeper into a particular merge X,
2366
use ``bzr log -n0 -rX``.
2368
``bzr log -v`` on a branch with lots of history is currently
2369
very slow. A fix for this issue is currently under development.
2370
With or without that fix, it is recommended that a revision range
2371
be given when using the -v option.
2373
bzr has a generic full-text matching plugin, bzr-search, that can be
2374
used to find revisions matching user names, commit messages, etc.
2375
Among other features, this plugin can find all revisions containing
2376
a list of words but not others.
2378
When exploring non-mainline history on large projects with deep
2379
history, the performance of log can be greatly improved by installing
2380
the historycache plugin. This plugin buffers historical information
2381
trading disk space for faster speed.
1583
"""Show log of a branch, file, or directory.
1585
By default show the log of the branch containing the working directory.
1587
To request a range of logs, you can use the command -r begin..end
1588
-r revision requests a specific revision, -r ..end or -r begin.. are
1594
bzr log -r -10.. http://server/branch
2383
takes_args = ['file*']
2384
_see_also = ['log-formats', 'revisionspec']
2387
help='Show from oldest to newest.'),
2389
custom_help('verbose',
2390
help='Show files changed in each revision.'),
2394
type=bzrlib.option._parse_revision_str,
2396
help='Show just the specified revision.'
2397
' See also "help revisionspec".'),
2399
RegistryOption('authors',
2400
'What names to list as authors - first, all or committer.',
2402
lazy_registry=('bzrlib.log', 'author_list_registry'),
2406
help='Number of levels to display - 0 for all, 1 for flat.',
2408
type=_parse_levels),
2410
help='Show revisions whose message matches this '
2411
'regular expression.',
2416
help='Limit the output to the first N revisions.',
2421
help='Show changes made in each revision as a patch.'),
2422
Option('include-merges',
2423
help='Show merged revisions like --levels 0 does.'),
2424
Option('exclude-common-ancestry',
2425
help='Display only the revisions that are not part'
2426
' of both ancestries (require -rX..Y)'
2428
Option('signatures',
2429
help='Show digital signature validity'),
2432
help='Show revisions whose properties match this '
2435
ListOption('match-message',
2436
help='Show revisions whose message matches this '
2439
ListOption('match-committer',
2440
help='Show revisions whose committer matches this '
2443
ListOption('match-author',
2444
help='Show revisions whose authors match this '
2447
ListOption('match-bugs',
2448
help='Show revisions whose bugs match this '
1597
# TODO: Make --revision support uuid: and hash: [future tag:] notation.
1599
takes_args = ['location?']
1600
takes_options = [Option('forward',
1601
help='show from oldest to newest'),
1605
help='show files changed in each revision'),
1606
'show-ids', 'revision',
1610
help='show revisions whose message matches this regexp',
1613
help='limit the output to the first N revisions',
2452
1616
encoding_type = 'replace'
2454
1618
@display_command
2455
def run(self, file_list=None, timezone='original',
1619
def run(self, location=None, timezone='original',
2457
1621
show_ids=False,
2461
1624
log_format=None,
2466
include_merges=False,
2468
exclude_common_ancestry=False,
2472
match_committer=None,
2476
from bzrlib.log import (
2478
make_log_request_dict,
2479
_get_info_for_log_files,
1627
from bzrlib.log import show_log
1628
assert message is None or isinstance(message, basestring), \
1629
"invalid message argument %r" % message
2481
1630
direction = (forward and 'forward') or 'reverse'
2482
if (exclude_common_ancestry
2483
and (revision is None or len(revision) != 2)):
2484
raise errors.BzrCommandError(
2485
'--exclude-common-ancestry requires -r with two revisions')
2490
raise errors.BzrCommandError(
2491
'--levels and --include-merges are mutually exclusive')
2493
if change is not None:
2495
raise errors.RangeInChangeOption()
2496
if revision is not None:
2497
raise errors.BzrCommandError(
2498
'--revision and --change are mutually exclusive')
2503
filter_by_dir = False
2505
# find the file ids to log and check for directory filtering
2506
b, file_info_list, rev1, rev2 = _get_info_for_log_files(
2507
revision, file_list, self.add_cleanup)
2508
for relpath, file_id, kind in file_info_list:
1635
# find the file id to log:
1637
tree, b, fp = bzrdir.BzrDir.open_containing_tree_or_branch(
1641
tree = b.basis_tree()
1642
file_id = tree.path2id(fp)
2509
1643
if file_id is None:
2510
1644
raise errors.BzrCommandError(
2511
"Path unknown at end or start of revision range: %s" %
2513
# If the relpath is the top of the tree, we log everything
2518
file_ids.append(file_id)
2519
filter_by_dir = filter_by_dir or (
2520
kind in ['directory', 'tree-reference'])
1645
"Path does not have any revision history: %s" %
2523
# FIXME ? log the current subdir only RBC 20060203
1649
# FIXME ? log the current subdir only RBC 20060203
2524
1650
if revision is not None \
2525
1651
and len(revision) > 0 and revision[0].get_branch():
2526
1652
location = revision[0].get_branch()
2729
1776
if path is None:
2733
1781
raise errors.BzrCommandError('cannot specify both --from-root'
2736
tree, branch, relpath = \
2737
_open_directory_or_containing_tree_or_branch(fs_path, directory)
2739
# Calculate the prefix to use
1785
tree, branch, relpath = bzrdir.BzrDir.open_containing_tree_or_branch(
2743
prefix = relpath + '/'
2744
elif fs_path != '.' and not fs_path.endswith('/'):
2745
prefix = fs_path + '/'
2747
if revision is not None or tree is None:
2748
tree = _get_one_revision_tree('ls', revision, branch=branch)
2751
if isinstance(tree, WorkingTree) and tree.supports_views():
2752
view_files = tree.views.lookup_view()
2755
view_str = views.view_display_str(view_files)
2756
note("Ignoring files outside view. View is %s" % view_str)
2758
self.add_cleanup(tree.lock_read().unlock)
2759
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
2760
from_dir=relpath, recursive=recursive):
2761
# Apply additional masking
2762
if not all and not selection[fc]:
2764
if kind is not None and fkind != kind:
2769
fullpath = osutils.pathjoin(relpath, fp)
2772
views.check_path_in_view(tree, fullpath)
2773
except errors.FileOutsideView:
2778
fp = osutils.pathjoin(prefix, fp)
2779
kindch = entry.kind_character()
2780
outstring = fp + kindch
2781
ui.ui_factory.clear_term()
2783
outstring = '%-8s %s' % (fc, outstring)
2784
if show_ids and fid is not None:
2785
outstring = "%-50s %s" % (outstring, fid)
2786
self.outf.write(outstring + '\n')
2788
self.outf.write(fp + '\0')
2791
self.outf.write(fid)
2792
self.outf.write('\0')
2800
self.outf.write('%-50s %s\n' % (outstring, my_id))
2802
self.outf.write(outstring + '\n')
1791
if revision is not None:
1792
tree = branch.repository.revision_tree(
1793
revision[0].in_history(branch).rev_id)
1795
tree = branch.basis_tree()
1799
for fp, fc, fkind, fid, entry in tree.list_files(include_root=False):
1800
if fp.startswith(relpath):
1801
fp = osutils.pathjoin(prefix, fp[len(relpath):])
1802
if non_recursive and '/' in fp:
1804
if not all and not selection[fc]:
1806
if kind is not None and fkind != kind:
1809
kindch = entry.kind_character()
1810
outstring = '%-8s %s%s' % (fc, fp, kindch)
1811
if show_ids and fid is not None:
1812
outstring = "%-50s %s" % (outstring, fid)
1813
self.outf.write(outstring + '\n')
1815
self.outf.write(fp + '\0')
1818
self.outf.write(fid)
1819
self.outf.write('\0')
1827
self.outf.write('%-50s %s\n' % (fp, my_id))
1829
self.outf.write(fp + '\n')
2805
1834
class cmd_unknowns(Command):
2806
__doc__ = """List unknown files.
1835
"""List unknown files.
2810
1839
_see_also = ['ls']
2811
takes_options = ['directory']
2813
1841
@display_command
2814
def run(self, directory=u'.'):
2815
for f in WorkingTree.open_containing(directory)[0].unknowns():
1843
for f in WorkingTree.open_containing(u'.')[0].unknowns():
2816
1844
self.outf.write(osutils.quotefn(f) + '\n')
2819
1847
class cmd_ignore(Command):
2820
__doc__ = """Ignore specified files or patterns.
2822
See ``bzr help patterns`` for details on the syntax of patterns.
2824
If a .bzrignore file does not exist, the ignore command
2825
will create one and add the specified files or patterns to the newly
2826
created file. The ignore command will also automatically add the
2827
.bzrignore file to be versioned. Creating a .bzrignore file without
2828
the use of the ignore command will require an explicit add command.
1848
"""Ignore specified files or patterns.
2830
1850
To remove patterns from the ignore list, edit the .bzrignore file.
2831
After adding, editing or deleting that file either indirectly by
2832
using this command or directly by using an editor, be sure to commit
2835
Bazaar also supports a global ignore file ~/.bazaar/ignore. On Windows
2836
the global ignore file can be found in the application data directory as
2837
C:\\Documents and Settings\\<user>\\Application Data\\Bazaar\\2.0\\ignore.
2838
Global ignores are not touched by this command. The global ignore file
2839
can be edited directly using an editor.
2841
Patterns prefixed with '!' are exceptions to ignore patterns and take
2842
precedence over regular ignores. Such exceptions are used to specify
2843
files that should be versioned which would otherwise be ignored.
2845
Patterns prefixed with '!!' act as regular ignore patterns, but have
2846
precedence over the '!' exception patterns.
2850
* Ignore patterns containing shell wildcards must be quoted from
2853
* Ignore patterns starting with "#" act as comments in the ignore file.
2854
To ignore patterns that begin with that character, use the "RE:" prefix.
2857
Ignore the top level Makefile::
2859
bzr ignore ./Makefile
2861
Ignore .class files in all directories...::
2863
bzr ignore "*.class"
2865
...but do not ignore "special.class"::
2867
bzr ignore "!special.class"
2869
Ignore files whose name begins with the "#" character::
2873
Ignore .o files under the lib directory::
2875
bzr ignore "lib/**/*.o"
2877
Ignore .o files under the lib directory::
2879
bzr ignore "RE:lib/.*\.o"
2881
Ignore everything but the "debian" toplevel directory::
2883
bzr ignore "RE:(?!debian/).*"
2885
Ignore everything except the "local" toplevel directory,
2886
but always ignore autosave files ending in ~, even under local/::
2889
bzr ignore "!./local"
1852
Trailing slashes on patterns are ignored.
1853
If the pattern contains a slash or is a regular expression, it is compared
1854
to the whole path from the branch root. Otherwise, it is compared to only
1855
the last component of the path. To match a file only in the root
1856
directory, prepend './'.
1858
Ignore patterns specifying absolute paths are not allowed.
1860
Ignore patterns may include globbing wildcards such as:
1861
? - Matches any single character except '/'
1862
* - Matches 0 or more characters except '/'
1863
/**/ - Matches 0 or more directories in a path
1864
[a-z] - Matches a single character from within a group of characters
1866
Ignore patterns may also be Python regular expressions.
1867
Regular expression ignore patterns are identified by a 'RE:' prefix
1868
followed by the regular expression. Regular expression ignore patterns
1869
may not include named or numbered groups.
1871
Note: ignore patterns containing shell wildcards must be quoted from
1875
bzr ignore ./Makefile
1876
bzr ignore '*.class'
1877
bzr ignore 'lib/**/*.o'
1878
bzr ignore 'RE:lib/.*\.o'
2893
_see_also = ['status', 'ignored', 'patterns']
1881
_see_also = ['status', 'ignored']
2894
1882
takes_args = ['name_pattern*']
2895
takes_options = ['directory',
2896
Option('default-rules',
2897
help='Display the default ignore rules that bzr uses.')
2900
def run(self, name_pattern_list=None, default_rules=None,
2902
from bzrlib import ignores
2903
if default_rules is not None:
2904
# dump the default rules and exit
2905
for pattern in ignores.USER_DEFAULTS:
2906
self.outf.write("%s\n" % pattern)
1884
Option('old-default-rules',
1885
help='Out the ignore rules bzr < 0.9 always used.')
1888
def run(self, name_pattern_list=None, old_default_rules=None):
1889
from bzrlib.atomicfile import AtomicFile
1890
if old_default_rules is not None:
1891
# dump the rules and exit
1892
for pattern in ignores.OLD_DEFAULTS:
2908
1895
if not name_pattern_list:
2909
1896
raise errors.BzrCommandError("ignore requires at least one "
2910
"NAME_PATTERN or --default-rules.")
2911
name_pattern_list = [globbing.normalize_pattern(p)
1897
"NAME_PATTERN or --old-default-rules")
1898
name_pattern_list = [globbing.normalize_pattern(p)
2912
1899
for p in name_pattern_list]
2914
for p in name_pattern_list:
2915
if not globbing.Globster.is_pattern_valid(p):
2916
bad_patterns += ('\n %s' % p)
2918
msg = ('Invalid ignore pattern(s) found. %s' % bad_patterns)
2919
ui.ui_factory.show_error(msg)
2920
raise errors.InvalidPattern('')
2921
1900
for name_pattern in name_pattern_list:
2922
if (name_pattern[0] == '/' or
1901
if (name_pattern[0] == '/' or
2923
1902
(len(name_pattern) > 1 and name_pattern[1] == ':')):
2924
1903
raise errors.BzrCommandError(
2925
1904
"NAME_PATTERN should not be an absolute path")
2926
tree, relpath = WorkingTree.open_containing(directory)
2927
ignores.tree_ignores_add_patterns(tree, name_pattern_list)
2928
ignored = globbing.Globster(name_pattern_list)
2930
self.add_cleanup(tree.lock_read().unlock)
2931
for entry in tree.list_files():
2935
if ignored.match(filename):
2936
matches.append(filename)
2937
if len(matches) > 0:
2938
self.outf.write("Warning: the following files are version controlled and"
2939
" match your ignore pattern:\n%s"
2940
"\nThese files will continue to be version controlled"
2941
" unless you 'bzr remove' them.\n" % ("\n".join(matches),))
1905
tree, relpath = WorkingTree.open_containing(u'.')
1906
ifn = tree.abspath('.bzrignore')
1907
if os.path.exists(ifn):
1910
igns = f.read().decode('utf-8')
1916
# TODO: If the file already uses crlf-style termination, maybe
1917
# we should use that for the newly added lines?
1919
if igns and igns[-1] != '\n':
1921
for name_pattern in name_pattern_list:
1922
igns += name_pattern + '\n'
1924
f = AtomicFile(ifn, 'wb')
1926
f.write(igns.encode('utf-8'))
1931
if not tree.path2id('.bzrignore'):
1932
tree.add(['.bzrignore'])
2944
1935
class cmd_ignored(Command):
2945
__doc__ = """List ignored files and the patterns that matched them.
2947
List all the ignored files and the ignore pattern that caused the file to
2950
Alternatively, to list just the files::
1936
"""List ignored files and the patterns that matched them.
2955
encoding_type = 'replace'
2956
_see_also = ['ignore', 'ls']
2957
takes_options = ['directory']
1939
_see_also = ['ignore']
2959
1940
@display_command
2960
def run(self, directory=u'.'):
2961
tree = WorkingTree.open_containing(directory)[0]
2962
self.add_cleanup(tree.lock_read().unlock)
2963
for path, file_class, kind, file_id, entry in tree.list_files():
2964
if file_class != 'I':
2966
## XXX: Slightly inefficient since this was already calculated
2967
pat = tree.is_ignored(path)
2968
self.outf.write('%-50s %s\n' % (path, pat))
1942
tree = WorkingTree.open_containing(u'.')[0]
1945
for path, file_class, kind, file_id, entry in tree.list_files():
1946
if file_class != 'I':
1948
## XXX: Slightly inefficient since this was already calculated
1949
pat = tree.is_ignored(path)
1950
print '%-50s %s' % (path, pat)
2971
1955
class cmd_lookup_revision(Command):
2972
__doc__ = """Lookup the revision-id from a revision-number
1956
"""Lookup the revision-id from a revision-number
2975
1959
bzr lookup-revision 33
2978
1962
takes_args = ['revno']
2979
takes_options = ['directory']
2981
1964
@display_command
2982
def run(self, revno, directory=u'.'):
1965
def run(self, revno):
2984
1967
revno = int(revno)
2985
1968
except ValueError:
2986
raise errors.BzrCommandError("not a valid revision-number: %r"
2988
revid = WorkingTree.open_containing(directory)[0].branch.get_rev_id(revno)
2989
self.outf.write("%s\n" % revid)
1969
raise errors.BzrCommandError("not a valid revision-number: %r" % revno)
1971
print WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
2992
1974
class cmd_export(Command):
2993
__doc__ = """Export current or past revision to a destination directory or archive.
1975
"""Export current or past revision to a destination directory or archive.
2995
1977
If no revision is specified this exports the last committed revision.
3008
1990
Note: Export of tree with non-ASCII filenames to zip is not supported.
3010
================= =========================
3011
Supported formats Autodetected by extension
3012
================= =========================
1992
Supported formats Autodetected by extension
1993
----------------- -------------------------
3015
1996
tbz2 .tar.bz2, .tbz2
3016
1997
tgz .tar.gz, .tgz
3018
================= =========================
3021
takes_args = ['dest', 'branch_or_subdir?']
3022
takes_options = ['directory',
3024
help="Type of file to export to.",
3027
Option('filters', help='Apply content filters to export the '
3028
'convenient form.'),
3031
help="Name of the root directory inside the exported file."),
3032
Option('per-file-timestamps',
3033
help='Set modification time of files to that of the last '
3034
'revision in which it was changed.'),
3036
def run(self, dest, branch_or_subdir=None, revision=None, format=None,
3037
root=None, filters=False, per_file_timestamps=False, directory=u'.'):
2000
takes_args = ['dest', 'branch?']
2001
takes_options = ['revision', 'format', 'root']
2002
def run(self, dest, branch=None, revision=None, format=None, root=None):
3038
2003
from bzrlib.export import export
3040
if branch_or_subdir is None:
3041
tree = WorkingTree.open_containing(directory)[0]
2006
tree = WorkingTree.open_containing(u'.')[0]
3042
2007
b = tree.branch
3045
b, subdir = Branch.open_containing(branch_or_subdir)
3048
rev_tree = _get_one_revision_tree('export', revision, branch=b, tree=tree)
2009
b = Branch.open(branch)
2011
if revision is None:
2012
# should be tree.last_revision FIXME
2013
rev_id = b.last_revision()
2015
if len(revision) != 1:
2016
raise errors.BzrCommandError('bzr export --revision takes exactly 1 argument')
2017
rev_id = revision[0].in_history(b).rev_id
2018
t = b.repository.revision_tree(rev_id)
3050
export(rev_tree, dest, format, root, subdir, filtered=filters,
3051
per_file_timestamps=per_file_timestamps)
2020
export(t, dest, format, root)
3052
2021
except errors.NoSuchExportFormat, e:
3053
2022
raise errors.BzrCommandError('Unsupported export format: %s' % e.format)
3056
2025
class cmd_cat(Command):
3057
__doc__ = """Write the contents of a file as of a given revision to standard output.
2026
"""Write the contents of a file as of a given revision to standard output.
3059
2028
If no revision is nominated, the last revision is used.
3061
2030
Note: Take care to redirect standard output when using this command on a
3065
2034
_see_also = ['ls']
3066
takes_options = ['directory',
3067
Option('name-from-revision', help='The path name in the old tree.'),
3068
Option('filters', help='Apply content filters to display the '
3069
'convenience form.'),
2035
takes_options = ['revision', 'name-from-revision']
3072
2036
takes_args = ['filename']
3073
2037
encoding_type = 'exact'
3075
2039
@display_command
3076
def run(self, filename, revision=None, name_from_revision=False,
3077
filters=False, directory=None):
2040
def run(self, filename, revision=None, name_from_revision=False):
3078
2041
if revision is not None and len(revision) != 1:
3079
2042
raise errors.BzrCommandError("bzr cat --revision takes exactly"
3080
" one revision specifier")
3081
tree, branch, relpath = \
3082
_open_directory_or_containing_tree_or_branch(filename, directory)
3083
self.add_cleanup(branch.lock_read().unlock)
3084
return self._run(tree, branch, relpath, filename, revision,
3085
name_from_revision, filters)
3087
def _run(self, tree, b, relpath, filename, revision, name_from_revision,
2047
tree, b, relpath = \
2048
bzrdir.BzrDir.open_containing_tree_or_branch(filename)
2049
except errors.NotBranchError:
2052
if revision is not None and revision[0].get_branch() is not None:
2053
b = Branch.open(revision[0].get_branch())
3089
2054
if tree is None:
3090
2055
tree = b.basis_tree()
3091
rev_tree = _get_one_revision_tree('cat', revision, branch=b)
3092
self.add_cleanup(rev_tree.lock_read().unlock)
2056
if revision is None:
2057
revision_id = b.last_revision()
2059
revision_id = revision[0].in_history(b).rev_id
2061
cur_file_id = tree.path2id(relpath)
2062
rev_tree = b.repository.revision_tree(revision_id)
3094
2063
old_file_id = rev_tree.path2id(relpath)
3096
# TODO: Split out this code to something that generically finds the
3097
# best id for a path across one or more trees; it's like
3098
# find_ids_across_trees but restricted to find just one. -- mbp
3100
2065
if name_from_revision:
3101
# Try in revision if requested
3102
2066
if old_file_id is None:
3103
raise errors.BzrCommandError(
3104
"%r is not present in revision %s" % (
3105
filename, rev_tree.get_revision_id()))
3107
actual_file_id = old_file_id
3109
cur_file_id = tree.path2id(relpath)
3110
if cur_file_id is not None and rev_tree.has_id(cur_file_id):
3111
actual_file_id = cur_file_id
3112
elif old_file_id is not None:
3113
actual_file_id = old_file_id
3115
raise errors.BzrCommandError(
3116
"%r is not present in revision %s" % (
3117
filename, rev_tree.get_revision_id()))
3119
from bzrlib.filter_tree import ContentFilterTree
3120
filter_tree = ContentFilterTree(rev_tree,
3121
rev_tree._content_filter_stack)
3122
content = filter_tree.get_file_text(actual_file_id)
3124
content = rev_tree.get_file_text(actual_file_id)
3126
self.outf.write(content)
2067
raise errors.BzrCommandError("%r is not present in revision %s"
2068
% (filename, revision_id))
2070
rev_tree.print_file(old_file_id)
2071
elif cur_file_id is not None:
2072
rev_tree.print_file(cur_file_id)
2073
elif old_file_id is not None:
2074
rev_tree.print_file(old_file_id)
2076
raise errors.BzrCommandError("%r is not present in revision %s" %
2077
(filename, revision_id))
3129
2080
class cmd_local_time_offset(Command):
3130
__doc__ = """Show the offset in seconds from GMT to local time."""
2081
"""Show the offset in seconds from GMT to local time."""
3132
2083
@display_command
3134
self.outf.write("%s\n" % osutils.local_time_offset())
2085
print osutils.local_time_offset()
3138
2089
class cmd_commit(Command):
3139
__doc__ = """Commit changes into a new revision.
3141
An explanatory message needs to be given for each commit. This is
3142
often done by using the --message option (getting the message from the
3143
command line) or by using the --file option (getting the message from
3144
a file). If neither of these options is given, an editor is opened for
3145
the user to enter the message. To see the changed files in the
3146
boilerplate text loaded into the editor, use the --show-diff option.
3148
By default, the entire tree is committed and the person doing the
3149
commit is assumed to be the author. These defaults can be overridden
3154
If selected files are specified, only changes to those files are
3155
committed. If a directory is specified then the directory and
3156
everything within it is committed.
3158
When excludes are given, they take precedence over selected files.
3159
For example, to commit only changes within foo, but not changes
3162
bzr commit foo -x foo/bar
3164
A selective commit after a merge is not yet supported.
3168
If the author of the change is not the same person as the committer,
3169
you can specify the author's name using the --author option. The
3170
name should be in the same format as a committer-id, e.g.
3171
"John Doe <jdoe@example.com>". If there is more than one author of
3172
the change you can specify the option multiple times, once for each
3177
A common mistake is to forget to add a new file or directory before
3178
running the commit command. The --strict option checks for unknown
3179
files and aborts the commit if any are found. More advanced pre-commit
3180
checks can be implemented by defining hooks. See ``bzr help hooks``
3185
If you accidentially commit the wrong changes or make a spelling
3186
mistake in the commit message say, you can use the uncommit command
3187
to undo it. See ``bzr help uncommit`` for details.
3189
Hooks can also be configured to run after a commit. This allows you
3190
to trigger updates to external systems like bug trackers. The --fixes
3191
option can be used to record the association between a revision and
3192
one or more bugs. See ``bzr help bugs`` for details.
2090
"""Commit changes into a new revision.
2092
If no arguments are given, the entire tree is committed.
2094
If selected files are specified, only changes to those files are
2095
committed. If a directory is specified then the directory and everything
2096
within it is committed.
2098
A selected-file commit may fail in some cases where the committed
2099
tree would be invalid. Consider::
2104
bzr commit foo -m "committing foo"
2105
bzr mv foo/bar foo/baz
2108
bzr commit foo/bar -m "committing bar but not baz"
2110
In the example above, the last commit will fail by design. This gives
2111
the user the opportunity to decide whether they want to commit the
2112
rename at the same time, separately first, or not at all. (As a general
2113
rule, when in doubt, Bazaar has a policy of Doing the Safe Thing.)
2115
Note: A selected-file commit after a merge is not yet supported.
3195
_see_also = ['add', 'bugs', 'hooks', 'uncommit']
2117
# TODO: Run hooks on tree to-be-committed, and after commit.
2119
# TODO: Strict commit that fails if there are deleted files.
2120
# (what does "deleted files" mean ??)
2122
# TODO: Give better message for -s, --summary, used by tla people
2124
# XXX: verbose currently does nothing
2126
_see_also = ['bugs', 'uncommit']
3196
2127
takes_args = ['selected*']
3198
ListOption('exclude', type=str, short_name='x',
3199
help="Do not consider changes made to a given path."),
3200
Option('message', type=unicode,
3202
help="Description of the new revision."),
3205
help='Commit even if nothing has changed.'),
3206
Option('file', type=str,
3209
help='Take commit message from this file.'),
3211
help="Refuse to commit if there are unknown "
3212
"files in the working tree."),
3213
Option('commit-time', type=str,
3214
help="Manually set a commit time using commit date "
3215
"format, e.g. '2009-10-10 08:00:00 +0100'."),
3216
ListOption('fixes', type=str,
3217
help="Mark a bug as being fixed by this revision "
3218
"(see \"bzr help bugs\")."),
3219
ListOption('author', type=unicode,
3220
help="Set the author's name, if it's different "
3221
"from the committer."),
3223
help="Perform a local commit in a bound "
3224
"branch. Local commits are not pushed to "
3225
"the master branch until a normal commit "
3228
Option('show-diff', short_name='p',
3229
help='When no message is supplied, show the diff along'
3230
' with the status summary in the message editor.'),
3232
help='When committing to a foreign version control '
3233
'system do not push data that can not be natively '
2128
takes_options = ['message', 'verbose',
2130
help='commit even if nothing has changed'),
2131
Option('file', type=str,
2134
help='file containing commit message'),
2136
help="refuse to commit if there are unknown "
2137
"files in the working tree."),
2138
ListOption('fixes', type=str,
2139
help="mark a bug as being fixed by this "
2142
help="perform a local only commit in a bound "
2143
"branch. Such commits are not pushed to "
2144
"the master branch until a normal commit "
3236
2148
aliases = ['ci', 'checkin']
3238
def _iter_bug_fix_urls(self, fixes, branch):
3239
default_bugtracker = None
2150
def _get_bug_fix_properties(self, fixes, branch):
3240
2152
# Configure the properties for bug fixing attributes.
3241
2153
for fixed_bug in fixes:
3242
2154
tokens = fixed_bug.split(':')
3243
if len(tokens) == 1:
3244
if default_bugtracker is None:
3245
branch_config = branch.get_config()
3246
default_bugtracker = branch_config.get_user_option(
3248
if default_bugtracker is None:
3249
raise errors.BzrCommandError(
3250
"No tracker specified for bug %s. Use the form "
3251
"'tracker:id' or specify a default bug tracker "
3252
"using the `bugtracker` option.\nSee "
3253
"\"bzr help bugs\" for more information on this "
3254
"feature. Commit refused." % fixed_bug)
3255
tag = default_bugtracker
3257
elif len(tokens) != 2:
2155
if len(tokens) != 2:
3258
2156
raise errors.BzrCommandError(
3259
"Invalid bug %s. Must be in the form of 'tracker:id'. "
3260
"See \"bzr help bugs\" for more information on this "
3261
"feature.\nCommit refused." % fixed_bug)
3263
tag, bug_id = tokens
2157
"Invalid bug %s. Must be in the form of 'tag:id'. "
2158
"Commit refused." % fixed_bug)
2159
tag, bug_id = tokens
3265
yield bugtracker.get_bug_url(tag, branch, bug_id)
2161
bug_url = bugtracker.get_bug_url(tag, branch, bug_id)
3266
2162
except errors.UnknownBugTrackerAbbreviation:
3267
2163
raise errors.BzrCommandError(
3268
2164
'Unrecognized bug %s. Commit refused.' % fixed_bug)
3269
except errors.MalformedBugIdentifier, e:
3270
raise errors.BzrCommandError(
3271
"%s\nCommit refused." % (str(e),))
3273
def run(self, message=None, file=None, verbose=False, selected_list=None,
3274
unchanged=False, strict=False, local=False, fixes=None,
3275
author=None, show_diff=False, exclude=None, commit_time=None,
3277
from bzrlib.errors import (
3282
from bzrlib.msgeditor import (
3283
edit_commit_message_encoded,
3284
generate_commit_message_template,
3285
make_commit_message_template_encoded,
3289
commit_stamp = offset = None
3290
if commit_time is not None:
3292
commit_stamp, offset = timestamp.parse_patch_date(commit_time)
3293
except ValueError, e:
3294
raise errors.BzrCommandError(
3295
"Could not parse --commit-time: " + str(e))
2165
except errors.MalformedBugIdentifier:
2166
raise errors.BzrCommandError(
2167
"Invalid bug identifier for %s. Commit refused."
2169
properties.append('%s fixed' % bug_url)
2170
return '\n'.join(properties)
2172
def run(self, message=None, file=None, verbose=True, selected_list=None,
2173
unchanged=False, strict=False, local=False, fixes=None):
2174
from bzrlib.commit import (NullCommitReporter, ReportCommitToLog)
2175
from bzrlib.errors import (PointlessCommit, ConflictsInTree,
2177
from bzrlib.msgeditor import edit_commit_message, \
2178
make_commit_message_template
2180
# TODO: Need a blackbox test for invoking the external editor; may be
2181
# slightly problematic to run this cross-platform.
2183
# TODO: do more checks that the commit will succeed before
2184
# spending the user's valuable time typing a commit message.
3297
2186
properties = {}
3299
tree, selected_list = WorkingTree.open_containing_paths(selected_list)
2188
tree, selected_list = tree_files(selected_list)
3300
2189
if selected_list == ['']:
3301
2190
# workaround - commit of root of tree should be exactly the same
3302
2191
# as just default commit in that tree, and succeed even though
3303
2192
# selected-file merge commit is not done yet
3304
2193
selected_list = []
3308
bug_property = bugtracker.encode_fixes_bug_urls(
3309
self._iter_bug_fix_urls(fixes, tree.branch))
2195
bug_property = self._get_bug_fix_properties(fixes, tree.branch)
3310
2196
if bug_property:
3311
2197
properties['bugs'] = bug_property
3313
2199
if local and not tree.branch.get_bound_location():
3314
2200
raise errors.LocalRequiresBoundBranch()
3316
if message is not None:
3318
file_exists = osutils.lexists(message)
3319
except UnicodeError:
3320
# The commit message contains unicode characters that can't be
3321
# represented in the filesystem encoding, so that can't be a
3326
'The commit message is a file name: "%(f)s".\n'
3327
'(use --file "%(f)s" to take commit message from that file)'
3329
ui.ui_factory.show_warning(warning_msg)
3331
message = message.replace('\r\n', '\n')
3332
message = message.replace('\r', '\n')
3334
raise errors.BzrCommandError(
3335
"please specify either --message or --file")
3337
2202
def get_message(commit_obj):
3338
2203
"""Callback to get commit message"""
3342
my_message = f.read().decode(osutils.get_user_encoding())
3345
elif message is not None:
3346
my_message = message
3348
# No message supplied: make one up.
3349
# text is the status of the tree
3350
text = make_commit_message_template_encoded(tree,
3351
selected_list, diff=show_diff,
3352
output_encoding=osutils.get_user_encoding())
3353
# start_message is the template generated from hooks
3354
# XXX: Warning - looks like hooks return unicode,
3355
# make_commit_message_template_encoded returns user encoding.
3356
# We probably want to be using edit_commit_message instead to
3358
my_message = set_commit_message(commit_obj)
3359
if my_message is None:
3360
start_message = generate_commit_message_template(commit_obj)
3361
my_message = edit_commit_message_encoded(text,
3362
start_message=start_message)
2204
my_message = message
2205
if my_message is None and not file:
2206
template = make_commit_message_template(tree, selected_list)
2207
my_message = edit_commit_message(template)
3363
2208
if my_message is None:
3364
2209
raise errors.BzrCommandError("please specify a commit"
3365
2210
" message with either --message or --file")
3366
if my_message == "":
3367
raise errors.BzrCommandError("Empty commit message specified."
3368
" Please specify a commit message with either"
3369
" --message or --file or leave a blank message"
3370
" with --message \"\".")
2211
elif my_message and file:
2212
raise errors.BzrCommandError(
2213
"please specify either --message or --file")
2215
my_message = codecs.open(file, 'rt',
2216
bzrlib.user_encoding).read()
2217
if my_message == "":
2218
raise errors.BzrCommandError("empty commit message specified")
3371
2219
return my_message
3373
# The API permits a commit with a filter of [] to mean 'select nothing'
3374
# but the command line should not do that.
3375
if not selected_list:
3376
selected_list = None
2222
reporter = ReportCommitToLog()
2224
reporter = NullCommitReporter()
3378
2227
tree.commit(message_callback=get_message,
3379
2228
specific_files=selected_list,
3380
2229
allow_pointless=unchanged, strict=strict, local=local,
3381
reporter=None, verbose=verbose, revprops=properties,
3382
authors=author, timestamp=commit_stamp,
3384
exclude=tree.safe_relpath_files(exclude),
2230
reporter=reporter, revprops=properties)
3386
2231
except PointlessCommit:
3387
raise errors.BzrCommandError("No changes to commit."
3388
" Please 'bzr add' the files you want to commit, or use"
3389
" --unchanged to force an empty commit.")
2232
# FIXME: This should really happen before the file is read in;
2233
# perhaps prepare the commit; get the message; then actually commit
2234
raise errors.BzrCommandError("no changes to commit."
2235
" use --unchanged to commit anyhow")
3390
2236
except ConflictsInTree:
3391
2237
raise errors.BzrCommandError('Conflicts detected in working '
3392
2238
'tree. Use "bzr conflicts" to list, "bzr resolve FILE" to'
3395
2241
raise errors.BzrCommandError("Commit refused because there are"
3396
2242
" unknown files in the working tree.")
3397
2243
except errors.BoundBranchOutOfDate, e:
3398
e.extra_help = ("\n"
3399
'To commit to master branch, run update and then commit.\n'
3400
'You can also pass --local to commit to continue working '
2244
raise errors.BzrCommandError(str(e) + "\n"
2245
'To commit to master branch, run update and then commit.\n'
2246
'You can also pass --local to commit to continue working '
3405
2250
class cmd_check(Command):
3406
__doc__ = """Validate working tree structure, branch consistency and repository history.
3408
This command checks various invariants about branch and repository storage
3409
to detect data corruption or bzr bugs.
3411
The working tree and branch checks will only give output if a problem is
3412
detected. The output fields of the repository check are:
3415
This is just the number of revisions checked. It doesn't
3419
This is just the number of versionedfiles checked. It
3420
doesn't indicate a problem.
3422
unreferenced ancestors
3423
Texts that are ancestors of other texts, but
3424
are not properly referenced by the revision ancestry. This is a
3425
subtle problem that Bazaar can work around.
3428
This is the total number of unique file contents
3429
seen in the checked revisions. It does not indicate a problem.
3432
This is the total number of repeated texts seen
3433
in the checked revisions. Texts can be repeated when their file
3434
entries are modified, but the file contents are not. It does not
3437
If no restrictions are specified, all Bazaar data that is found at the given
3438
location will be checked.
3442
Check the tree and branch at 'foo'::
3444
bzr check --tree --branch foo
3446
Check only the repository at 'bar'::
3448
bzr check --repo bar
3450
Check everything at 'baz'::
2251
"""Validate consistency of branch history.
2253
This command checks various invariants about the branch storage to
2254
detect data corruption or bzr bugs.
3455
2257
_see_also = ['reconcile']
3456
takes_args = ['path?']
3457
takes_options = ['verbose',
3458
Option('branch', help="Check the branch related to the"
3459
" current directory."),
3460
Option('repo', help="Check the repository related to the"
3461
" current directory."),
3462
Option('tree', help="Check the working tree related to"
3463
" the current directory.")]
2258
takes_args = ['branch?']
2259
takes_options = ['verbose']
3465
def run(self, path=None, verbose=False, branch=False, repo=False,
3467
from bzrlib.check import check_dwim
3470
if not branch and not repo and not tree:
3471
branch = repo = tree = True
3472
check_dwim(path, verbose, do_branch=branch, do_repo=repo, do_tree=tree)
2261
def run(self, branch=None, verbose=False):
2262
from bzrlib.check import check
2264
tree = WorkingTree.open_containing()[0]
2265
branch = tree.branch
2267
branch = Branch.open(branch)
2268
check(branch, verbose)
3475
2271
class cmd_upgrade(Command):
3476
__doc__ = """Upgrade a repository, branch or working tree to a newer format.
3478
When the default format has changed after a major new release of
3479
Bazaar, you may be informed during certain operations that you
3480
should upgrade. Upgrading to a newer format may improve performance
3481
or make new features available. It may however limit interoperability
3482
with older repositories or with older versions of Bazaar.
3484
If you wish to upgrade to a particular format rather than the
3485
current default, that can be specified using the --format option.
3486
As a consequence, you can use the upgrade command this way to
3487
"downgrade" to an earlier format, though some conversions are
3488
a one way process (e.g. changing from the 1.x default to the
3489
2.x default) so downgrading is not always possible.
3491
A backup.bzr.~#~ directory is created at the start of the conversion
3492
process (where # is a number). By default, this is left there on
3493
completion. If the conversion fails, delete the new .bzr directory
3494
and rename this one back in its place. Use the --clean option to ask
3495
for the backup.bzr directory to be removed on successful conversion.
3496
Alternatively, you can delete it by hand if everything looks good
3499
If the location given is a shared repository, dependent branches
3500
are also converted provided the repository converts successfully.
3501
If the conversion of a branch fails, remaining branches are still
3504
For more information on upgrades, see the Bazaar Upgrade Guide,
3505
http://doc.bazaar.canonical.com/latest/en/upgrade-guide/.
2272
"""Upgrade branch storage to current format.
2274
The check command or bzr developers may sometimes advise you to run
2275
this command. When the default format has changed you may also be warned
2276
during other operations to upgrade.
3508
_see_also = ['check', 'reconcile', 'formats']
2279
_see_also = ['check']
3509
2280
takes_args = ['url?']
3510
2281
takes_options = [
3511
RegistryOption('format',
3512
help='Upgrade to a specific format. See "bzr help'
3513
' formats" for details.',
3514
lazy_registry=('bzrlib.bzrdir', 'format_registry'),
3515
converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
3516
value_switches=True, title='Branch format'),
3518
help='Remove the backup.bzr directory if successful.'),
3520
help="Show what would be done, but don't actually do anything."),
2282
RegistryOption('format',
2283
help='Upgrade to a specific format. See "bzr help'
2284
' formats" for details',
2285
registry=bzrdir.format_registry,
2286
converter=bzrdir.format_registry.make_bzrdir,
2287
value_switches=True, title='Branch format'),
3523
def run(self, url='.', format=None, clean=False, dry_run=False):
2290
def run(self, url='.', format=None):
3524
2291
from bzrlib.upgrade import upgrade
3525
exceptions = upgrade(url, format, clean_up=clean, dry_run=dry_run)
3527
if len(exceptions) == 1:
3528
# Compatibility with historical behavior
2293
format = bzrdir.format_registry.make_bzrdir('default')
2294
upgrade(url, format)
3534
2297
class cmd_whoami(Command):
3535
__doc__ = """Show or set bzr user id.
3538
Show the email of the current user::
3542
Set the current user::
3544
bzr whoami "Frank Chu <fchu@example.com>"
2298
"""Show or set bzr user id.
2302
bzr whoami 'Frank Chu <fchu@example.com>'
3546
takes_options = [ 'directory',
3548
help='Display email address only.'),
2304
takes_options = [ Option('email',
2305
help='display email address only'),
3549
2306
Option('branch',
3550
help='Set identity for the current branch instead of '
2307
help='set identity for the current branch instead of '
3553
2310
takes_args = ['name?']
3554
2311
encoding_type = 'replace'
3556
2313
@display_command
3557
def run(self, email=False, branch=False, name=None, directory=None):
2314
def run(self, email=False, branch=False, name=None):
3558
2315
if name is None:
3559
if directory is None:
3560
# use branch if we're inside one; otherwise global config
3562
c = Branch.open_containing(u'.')[0].get_config()
3563
except errors.NotBranchError:
3564
c = _mod_config.GlobalConfig()
3566
c = Branch.open(directory).get_config()
2316
# use branch if we're inside one; otherwise global config
2318
c = Branch.open_containing('.')[0].get_config()
2319
except errors.NotBranchError:
2320
c = config.GlobalConfig()
3568
2322
self.outf.write(c.user_email() + '\n')
3570
2324
self.outf.write(c.username() + '\n')
3574
raise errors.BzrCommandError("--email can only be used to display existing "
3577
2327
# display a warning if an email address isn't included in the given name.
3579
_mod_config.extract_email_address(name)
2329
config.extract_email_address(name)
3580
2330
except errors.NoEmailInUsername, e:
3581
2331
warning('"%s" does not seem to contain an email address. '
3582
2332
'This is allowed, but not recommended.', name)
3584
2334
# use global config unless --branch given
3586
if directory is None:
3587
c = Branch.open_containing(u'.')[0].get_config()
3589
c = Branch.open(directory).get_config()
2336
c = Branch.open_containing('.')[0].get_config()
3591
c = _mod_config.GlobalConfig()
2338
c = config.GlobalConfig()
3592
2339
c.set_user_option('email', name)
3595
2342
class cmd_nick(Command):
3596
__doc__ = """Print or set the branch nickname.
3598
If unset, the tree root directory name is used as the nickname.
3599
To print the current nickname, execute with no argument.
3601
Bound branches use the nickname of its master branch unless it is set
2343
"""Print or set the branch nickname.
2345
If unset, the tree root directory name is used as the nickname
2346
To print the current nickname, execute with no argument.
3605
2349
_see_also = ['info']
3606
2350
takes_args = ['nickname?']
3607
takes_options = ['directory']
3608
def run(self, nickname=None, directory=u'.'):
3609
branch = Branch.open_containing(directory)[0]
2351
def run(self, nickname=None):
2352
branch = Branch.open_containing(u'.')[0]
3610
2353
if nickname is None:
3611
2354
self.printme(branch)
3757
2425
takes_args = ['testspecs*']
3758
2426
takes_options = ['verbose',
3760
help='Stop when one test fails.',
2428
help='stop when one test fails',
3761
2429
short_name='1',
2431
Option('keep-output',
2432
help='keep output directories when tests fail'),
3763
2433
Option('transport',
3764
2434
help='Use a different transport by default '
3765
2435
'throughout the test suite.',
3766
2436
type=get_transport_type),
3768
help='Run the benchmarks rather than selftests.',
2437
Option('benchmark', help='run the bzr benchmarks.'),
3770
2438
Option('lsprof-timed',
3771
help='Generate lsprof output for benchmarked'
2439
help='generate lsprof output for benchmarked'
3772
2440
' sections of code.'),
3773
Option('lsprof-tests',
3774
help='Generate lsprof output for each test.'),
2441
Option('cache-dir', type=str,
2442
help='a directory to cache intermediate'
2443
' benchmark steps'),
2444
Option('clean-output',
2445
help='clean temporary tests directories'
2446
' without running tests'),
3775
2447
Option('first',
3776
help='Run all tests, but run specified tests first.',
2448
help='run all tests, but run specified tests first',
3777
2449
short_name='f',
2451
Option('numbered-dirs',
2452
help='use numbered dirs for TestCaseInTempDir'),
3779
2453
Option('list-only',
3780
help='List the tests instead of running them.'),
3781
RegistryOption('parallel',
3782
help="Run the test suite in parallel.",
3783
lazy_registry=('bzrlib.tests', 'parallel_registry'),
3784
value_switches=False,
2454
help='list the tests instead of running them'),
3786
2455
Option('randomize', type=str, argname="SEED",
3787
help='Randomize the order of tests using the given'
3788
' seed or "now" for the current time.'),
3789
ListOption('exclude', type=str, argname="PATTERN",
3791
help='Exclude tests that match this regular'
3794
help='Output test progress via subunit.'),
3795
Option('strict', help='Fail on missing dependencies or '
3797
Option('load-list', type=str, argname='TESTLISTFILE',
3798
help='Load a test id list from a text file.'),
3799
ListOption('debugflag', type=str, short_name='E',
3800
help='Turn on a selftest debug flag.'),
3801
ListOption('starting-with', type=str, argname='TESTID',
3802
param_name='starting_with', short_name='s',
3804
'Load only the tests starting with TESTID.'),
3806
help="By default we disable fsync and fdatasync"
3807
" while running the test suite.")
2456
help='randomize the order of tests using the given'
2457
' seed or "now" for the current time'),
2458
Option('exclude', type=str, argname="PATTERN",
2460
help='exclude tests that match this regular'
3809
2463
encoding_type = 'replace'
3812
Command.__init__(self)
3813
self.additional_selftest_args = {}
3815
def run(self, testspecs_list=None, verbose=False, one=False,
3816
transport=None, benchmark=None,
3818
first=False, list_only=False,
3819
randomize=None, exclude=None, strict=False,
3820
load_list=None, debugflag=None, starting_with=None, subunit=False,
3821
parallel=None, lsprof_tests=False,
3823
from bzrlib import tests
2465
def run(self, testspecs_list=None, verbose=None, one=False,
2466
keep_output=False, transport=None, benchmark=None,
2467
lsprof_timed=None, cache_dir=None, clean_output=False,
2468
first=False, numbered_dirs=None, list_only=False,
2469
randomize=None, exclude=None):
2471
from bzrlib.tests import selftest
2472
import bzrlib.benchmarks as benchmarks
2473
from bzrlib.benchmarks import tree_creator
2476
from bzrlib.tests import clean_selftest_output
2477
clean_selftest_output()
2480
warning("notice: selftest --keep-output "
2481
"is no longer supported; "
2482
"test output is always removed")
2484
if numbered_dirs is None and sys.platform == 'win32':
2485
numbered_dirs = True
2487
if cache_dir is not None:
2488
tree_creator.TreeCreator.CACHE_ROOT = osutils.abspath(cache_dir)
2489
print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
2490
print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
3825
2492
if testspecs_list is not None:
3826
2493
pattern = '|'.join(testspecs_list)
3831
from bzrlib.tests import SubUnitBzrRunner
3833
raise errors.BzrCommandError("subunit not available. subunit "
3834
"needs to be installed to use --subunit.")
3835
self.additional_selftest_args['runner_class'] = SubUnitBzrRunner
3836
# On Windows, disable automatic conversion of '\n' to '\r\n' in
3837
# stdout, which would corrupt the subunit stream.
3838
# FIXME: This has been fixed in subunit trunk (>0.0.5) so the
3839
# following code can be deleted when it's sufficiently deployed
3840
# -- vila/mgz 20100514
3841
if (sys.platform == "win32"
3842
and getattr(sys.stdout, 'fileno', None) is not None):
3844
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
3846
self.additional_selftest_args.setdefault(
3847
'suite_decorators', []).append(parallel)
3849
raise errors.BzrCommandError(
3850
"--benchmark is no longer supported from bzr 2.2; "
3851
"use bzr-usertest instead")
3852
test_suite_factory = None
3854
exclude_pattern = None
2497
test_suite_factory = benchmarks.test_suite
2500
# TODO: should possibly lock the history file...
2501
benchfile = open(".perf_history", "at", buffering=1)
3856
exclude_pattern = '(' + '|'.join(exclude) + ')'
3858
self._disable_fsync()
3859
selftest_kwargs = {"verbose": verbose,
3861
"stop_on_failure": one,
3862
"transport": transport,
3863
"test_suite_factory": test_suite_factory,
3864
"lsprof_timed": lsprof_timed,
3865
"lsprof_tests": lsprof_tests,
3866
"matching_tests_first": first,
3867
"list_only": list_only,
3868
"random_seed": randomize,
3869
"exclude_pattern": exclude_pattern,
3871
"load_list": load_list,
3872
"debug_flags": debugflag,
3873
"starting_with": starting_with
3875
selftest_kwargs.update(self.additional_selftest_args)
3877
# Make deprecation warnings visible, unless -Werror is set
3878
cleanup = symbol_versioning.activate_deprecation_warnings(
2503
test_suite_factory = None
3881
result = tests.selftest(**selftest_kwargs)
2508
result = selftest(verbose=verbose,
2510
stop_on_failure=one,
2511
transport=transport,
2512
test_suite_factory=test_suite_factory,
2513
lsprof_timed=lsprof_timed,
2514
bench_history=benchfile,
2515
matching_tests_first=first,
2516
numbered_dirs=numbered_dirs,
2517
list_only=list_only,
2518
random_seed=randomize,
2519
exclude_pattern=exclude
2522
if benchfile is not None:
2525
info('tests passed')
2527
info('tests failed')
3884
2528
return int(not result)
3886
def _disable_fsync(self):
3887
"""Change the 'os' functionality to not synchronize."""
3888
self._orig_fsync = getattr(os, 'fsync', None)
3889
if self._orig_fsync is not None:
3890
os.fsync = lambda filedes: None
3891
self._orig_fdatasync = getattr(os, 'fdatasync', None)
3892
if self._orig_fdatasync is not None:
3893
os.fdatasync = lambda filedes: None
3896
2531
class cmd_version(Command):
3897
__doc__ = """Show version of bzr."""
3899
encoding_type = 'replace'
3901
Option("short", help="Print just the version number."),
2532
"""Show version of bzr."""
3904
2534
@display_command
3905
def run(self, short=False):
3906
2536
from bzrlib.version import show_version
3908
self.outf.write(bzrlib.version_string + '\n')
3910
show_version(to_file=self.outf)
3913
2540
class cmd_rocks(Command):
3914
__doc__ = """Statement of optimism."""
2541
"""Statement of optimism."""
3918
2545
@display_command
3920
self.outf.write("It sure does!\n")
2547
print "It sure does!"
3923
2550
class cmd_find_merge_base(Command):
3924
__doc__ = """Find and print a base revision for merging two branches."""
2551
"""Find and print a base revision for merging two branches."""
3925
2552
# TODO: Options to specify revisions on either side, as if
3926
2553
# merging only part of the history.
3927
2554
takes_args = ['branch', 'other']
3930
2557
@display_command
3931
2558
def run(self, branch, other):
3932
from bzrlib.revision import ensure_null
2559
from bzrlib.revision import ensure_null, MultipleRevisionSources
3934
2561
branch1 = Branch.open_containing(branch)[0]
3935
2562
branch2 = Branch.open_containing(other)[0]
3936
self.add_cleanup(branch1.lock_read().unlock)
3937
self.add_cleanup(branch2.lock_read().unlock)
3938
2564
last1 = ensure_null(branch1.last_revision())
3939
2565
last2 = ensure_null(branch2.last_revision())
3941
2567
graph = branch1.repository.get_graph(branch2.repository)
3942
2568
base_rev_id = graph.find_unique_lca(last1, last2)
3944
self.outf.write('merge base is revision %s\n' % base_rev_id)
2570
print 'merge base is revision %s' % base_rev_id
3947
2573
class cmd_merge(Command):
3948
__doc__ = """Perform a three-way merge.
3950
The source of the merge can be specified either in the form of a branch,
3951
or in the form of a path to a file containing a merge directive generated
3952
with bzr send. If neither is specified, the default is the upstream branch
3953
or the branch most recently merged using --remember. The source of the
3954
merge may also be specified in the form of a path to a file in another
3955
branch: in this case, only the modifications to that file are merged into
3956
the current working tree.
3958
When merging from a branch, by default bzr will try to merge in all new
3959
work from the other branch, automatically determining an appropriate base
3960
revision. If this fails, you may need to give an explicit base.
3962
To pick a different ending revision, pass "--revision OTHER". bzr will
3963
try to merge in all new work up to and including revision OTHER.
3965
If you specify two values, "--revision BASE..OTHER", only revisions BASE
3966
through OTHER, excluding BASE but including OTHER, will be merged. If this
3967
causes some revisions to be skipped, i.e. if the destination branch does
3968
not already contain revision BASE, such a merge is commonly referred to as
3969
a "cherrypick". Unlike a normal merge, Bazaar does not currently track
3970
cherrypicks. The changes look like a normal commit, and the history of the
3971
changes from the other branch is not stored in the commit.
3973
Revision numbers are always relative to the source branch.
2574
"""Perform a three-way merge.
2576
The branch is the branch you will merge from. By default, it will merge
2577
the latest revision. If you specify a revision, that revision will be
2578
merged. If you specify two revisions, the first will be used as a BASE,
2579
and the second one as OTHER. Revision numbers are always relative to the
2582
By default, bzr will try to merge in all new work from the other
2583
branch, automatically determining an appropriate base. If this
2584
fails, you may need to give an explicit base.
3975
2586
Merge will do its best to combine the changes in two branches, but there
3976
2587
are some kinds of problems only a human can fix. When it encounters those,
3977
2588
it will mark a conflict. A conflict means that you need to fix something,
3980
2591
Use bzr resolve when you have fixed a problem. See also bzr conflicts.
3982
If there is no default branch set, the first merge will set it (use
3983
--no-remember to avoid setting it). After that, you can omit the branch
3984
to use the default. To change the default, use --remember. The value will
3985
only be saved if the remote location can be accessed.
2593
If there is no default branch set, the first merge will set it. After
2594
that, you can omit the branch to use the default. To change the
2595
default, use --remember. The value will only be saved if the remote
2596
location can be accessed.
3987
2598
The results of the merge are placed into the destination working
3988
2599
directory, where they can be reviewed (with bzr diff), tested, and then
3989
2600
committed to record the result of the merge.
2604
To merge the latest revision from bzr.dev:
2605
bzr merge ../bzr.dev
2607
To merge changes up to and including revision 82 from bzr.dev:
2608
bzr merge -r 82 ../bzr.dev
2610
To merge the changes introduced by 82, without previous changes:
2611
bzr merge -r 81..82 ../bzr.dev
3991
2613
merge refuses to run if there are any uncommitted changes, unless
3992
--force is given. If --force is given, then the changes from the source
3993
will be merged with the current working tree, including any uncommitted
3994
changes in the tree. The --force option can also be used to create a
3995
merge revision which has more than two parents.
3997
If one would like to merge changes from the working tree of the other
3998
branch without merging any committed revisions, the --uncommitted option
4001
To select only some changes to merge, use "merge -i", which will prompt
4002
you to apply each diff hunk and file change, similar to "shelve".
4005
To merge all new revisions from bzr.dev::
4007
bzr merge ../bzr.dev
4009
To merge changes up to and including revision 82 from bzr.dev::
4011
bzr merge -r 82 ../bzr.dev
4013
To merge the changes introduced by 82, without previous changes::
4015
bzr merge -r 81..82 ../bzr.dev
4017
To apply a merge directive contained in /tmp/merge::
4019
bzr merge /tmp/merge
4021
To create a merge revision with three parents from two branches
4022
feature1a and feature1b:
4024
bzr merge ../feature1a
4025
bzr merge ../feature1b --force
4026
bzr commit -m 'revision with three parents'
4029
encoding_type = 'exact'
4030
_see_also = ['update', 'remerge', 'status-flags', 'send']
4031
takes_args = ['location?']
4036
help='Merge even if the destination tree has uncommitted changes.'),
2617
_see_also = ['update', 'remerge']
2618
takes_args = ['branch?']
2619
takes_options = ['revision', 'force', 'merge-type', 'reprocess', 'remember',
4040
2620
Option('show-base', help="Show base revision text in "
4042
2622
Option('uncommitted', help='Apply uncommitted changes'
4043
' from a working copy, instead of branch changes.'),
2623
' from a working copy, instead of branch changes'),
4044
2624
Option('pull', help='If the destination is already'
4045
2625
' completely merged into the source, pull from the'
4046
' source rather than merging. When this happens,'
2626
' source rather than merging. When this happens,'
4047
2627
' you do not need to commit the result.'),
4048
custom_help('directory',
4049
help='Branch to merge into, '
4050
'rather than the one containing the working directory.'),
4051
Option('preview', help='Instead of merging, show a diff of the'
4053
Option('interactive', help='Select changes interactively.',
2629
help='Branch to merge into, '
2630
'rather than the one containing the working directory',
4057
def run(self, location=None, revision=None, force=False,
4058
merge_type=None, show_base=False, reprocess=None, remember=None,
2636
def run(self, branch=None, revision=None, force=False, merge_type=None,
2637
show_base=False, reprocess=False, remember=False,
4059
2638
uncommitted=False, pull=False,
4060
2639
directory=None,
2641
from bzrlib.tag import _merge_tags_if_possible
2642
other_revision_id = None
4064
2643
if merge_type is None:
4065
2644
merge_type = _mod_merge.Merge3Merger
4067
2646
if directory is None: directory = u'.'
4068
possible_transports = []
4070
allow_pending = True
4071
verified = 'inapplicable'
2647
# XXX: jam 20070225 WorkingTree should be locked before you extract its
2648
# inventory. Because merge is a mutating operation, it really
2649
# should be a lock_write() for the whole cmd_merge operation.
2650
# However, cmd_merge open's its own tree in _merge_helper, which
2651
# means if we lock here, the later lock_write() will always block.
2652
# Either the merge helper code should be updated to take a tree,
2653
# (What about tree.merge_from_branch?)
4073
2654
tree = WorkingTree.open_containing(directory)[0]
4074
if tree.branch.revno() == 0:
4075
raise errors.BzrCommandError('Merging into empty branches not currently supported, '
4076
'https://bugs.launchpad.net/bzr/+bug/308562')
4079
basis_tree = tree.revision_tree(tree.last_revision())
4080
except errors.NoSuchRevision:
4081
basis_tree = tree.basis_tree()
4083
# die as quickly as possible if there are uncommitted changes
4085
if tree.has_changes():
4086
raise errors.UncommittedChanges(tree)
4088
view_info = _get_view_info_for_change_reporter(tree)
4089
2655
change_reporter = delta._ChangeReporter(
4090
unversioned_filter=tree.is_ignored, view_info=view_info)
4091
pb = ui.ui_factory.nested_progress_bar()
4092
self.add_cleanup(pb.finished)
4093
self.add_cleanup(tree.lock_write().unlock)
4094
if location is not None:
2656
unversioned_filter=tree.is_ignored)
2658
if branch is not None:
4096
mergeable = bundle.read_mergeable_from_url(location,
4097
possible_transports=possible_transports)
2660
mergeable = bundle.read_mergeable_from_url(
4098
2662
except errors.NotABundle:
2663
pass # Continue on considering this url a Branch
4102
raise errors.BzrCommandError('Cannot use --uncommitted'
4103
' with bundles or merge directives.')
4105
2665
if revision is not None:
4106
2666
raise errors.BzrCommandError(
4107
2667
'Cannot use -r with merge directives or bundles')
4108
merger, verified = _mod_merge.Merger.from_mergeable(tree,
4111
if merger is None and uncommitted:
4112
if revision is not None and len(revision) > 0:
2668
other_revision_id = mergeable.install_revisions(
2669
tree.branch.repository)
2670
revision = [RevisionSpec.from_string(
2671
'revid:' + other_revision_id)]
2673
if revision is None \
2674
or len(revision) < 1 or revision[0].needs_branch():
2675
branch = self._get_remembered_parent(tree, branch, 'Merging from')
2677
if revision is None or len(revision) < 1:
2680
other = [branch, None]
2683
other = [branch, -1]
2684
other_branch, path = Branch.open_containing(branch)
4113
2687
raise errors.BzrCommandError('Cannot use --uncommitted and'
4114
' --revision at the same time.')
4115
merger = self.get_merger_from_uncommitted(tree, location, None)
4116
allow_pending = False
4119
merger, allow_pending = self._get_merger_from_branch(tree,
4120
location, revision, remember, possible_transports, None)
4122
merger.merge_type = merge_type
4123
merger.reprocess = reprocess
4124
merger.show_base = show_base
4125
self.sanity_check_merger(merger)
4126
if (merger.base_rev_id == merger.other_rev_id and
4127
merger.other_rev_id is not None):
4128
# check if location is a nonexistent file (and not a branch) to
4129
# disambiguate the 'Nothing to do'
4130
if merger.interesting_files:
4131
if not merger.other_tree.has_filename(
4132
merger.interesting_files[0]):
4133
note("merger: " + str(merger))
4134
raise errors.PathsDoNotExist([location])
4135
note('Nothing to do.')
4137
if pull and not preview:
4138
if merger.interesting_files is not None:
4139
raise errors.BzrCommandError('Cannot pull individual files')
4140
if (merger.base_rev_id == tree.last_revision()):
4141
result = tree.pull(merger.other_branch, False,
4142
merger.other_rev_id)
4143
result.report(self.outf)
2688
' --revision at the same time.')
2689
branch = revision[0].get_branch() or branch
2690
if len(revision) == 1:
2692
if other_revision_id is not None:
2697
other_branch, path = Branch.open_containing(branch)
2698
revno = revision[0].in_history(other_branch).revno
2699
other = [branch, revno]
2701
assert len(revision) == 2
2702
if None in revision:
2703
raise errors.BzrCommandError(
2704
"Merge doesn't permit empty revision specifier.")
2705
base_branch, path = Branch.open_containing(branch)
2706
branch1 = revision[1].get_branch() or branch
2707
other_branch, path1 = Branch.open_containing(branch1)
2708
if revision[0].get_branch() is not None:
2709
# then path was obtained from it, and is None.
2712
base = [branch, revision[0].in_history(base_branch).revno]
2713
other = [branch1, revision[1].in_history(other_branch).revno]
2715
if ((tree.branch.get_parent() is None or remember) and
2716
other_branch is not None):
2717
tree.branch.set_parent(other_branch.base)
2719
# pull tags now... it's a bit inconsistent to do it ahead of copying
2720
# the history but that's done inside the merge code
2721
if other_branch is not None:
2722
_merge_tags_if_possible(other_branch, tree.branch)
2725
interesting_files = [path]
2727
interesting_files = None
2728
pb = ui.ui_factory.nested_progress_bar()
2731
conflict_count = _merge_helper(
2732
other, base, other_rev_id=other_revision_id,
2733
check_clean=(not force),
2734
merge_type=merge_type,
2735
reprocess=reprocess,
2736
show_base=show_base,
2739
pb=pb, file_list=interesting_files,
2740
change_reporter=change_reporter)
2743
if conflict_count != 0:
4145
if merger.this_basis is None:
4146
raise errors.BzrCommandError(
4147
"This branch has no commits."
4148
" (perhaps you would prefer 'bzr pull')")
4150
return self._do_preview(merger)
4152
return self._do_interactive(merger)
4154
return self._do_merge(merger, change_reporter, allow_pending,
4157
def _get_preview(self, merger):
4158
tree_merger = merger.make_merger()
4159
tt = tree_merger.make_preview_transform()
4160
self.add_cleanup(tt.finalize)
4161
result_tree = tt.get_preview_tree()
4164
def _do_preview(self, merger):
4165
from bzrlib.diff import show_diff_trees
4166
result_tree = self._get_preview(merger)
4167
path_encoding = osutils.get_diff_header_encoding()
4168
show_diff_trees(merger.this_tree, result_tree, self.outf,
4169
old_label='', new_label='',
4170
path_encoding=path_encoding)
4172
def _do_merge(self, merger, change_reporter, allow_pending, verified):
4173
merger.change_reporter = change_reporter
4174
conflict_count = merger.do_merge()
4176
merger.set_pending()
4177
if verified == 'failed':
4178
warning('Preview patch does not match changes')
4179
if conflict_count != 0:
4184
def _do_interactive(self, merger):
4185
"""Perform an interactive merge.
4187
This works by generating a preview tree of the merge, then using
4188
Shelver to selectively remove the differences between the working tree
4189
and the preview tree.
4191
from bzrlib import shelf_ui
4192
result_tree = self._get_preview(merger)
4193
writer = bzrlib.option.diff_writer_registry.get()
4194
shelver = shelf_ui.Shelver(merger.this_tree, result_tree, destroy=True,
4195
reporter=shelf_ui.ApplyReporter(),
4196
diff_writer=writer(sys.stdout))
4202
def sanity_check_merger(self, merger):
4203
if (merger.show_base and
4204
not merger.merge_type is _mod_merge.Merge3Merger):
4205
raise errors.BzrCommandError("Show-base is not supported for this"
4206
" merge type. %s" % merger.merge_type)
4207
if merger.reprocess is None:
4208
if merger.show_base:
4209
merger.reprocess = False
4211
# Use reprocess if the merger supports it
4212
merger.reprocess = merger.merge_type.supports_reprocess
4213
if merger.reprocess and not merger.merge_type.supports_reprocess:
4214
raise errors.BzrCommandError("Conflict reduction is not supported"
4215
" for merge type %s." %
4217
if merger.reprocess and merger.show_base:
4218
raise errors.BzrCommandError("Cannot do conflict reduction and"
4221
def _get_merger_from_branch(self, tree, location, revision, remember,
4222
possible_transports, pb):
4223
"""Produce a merger from a location, assuming it refers to a branch."""
4224
from bzrlib.tag import _merge_tags_if_possible
4225
# find the branch locations
4226
other_loc, user_location = self._select_branch_location(tree, location,
4228
if revision is not None and len(revision) == 2:
4229
base_loc, _unused = self._select_branch_location(tree,
4230
location, revision, 0)
4232
base_loc = other_loc
4234
other_branch, other_path = Branch.open_containing(other_loc,
4235
possible_transports)
4236
if base_loc == other_loc:
4237
base_branch = other_branch
4239
base_branch, base_path = Branch.open_containing(base_loc,
4240
possible_transports)
4241
# Find the revision ids
4242
other_revision_id = None
4243
base_revision_id = None
4244
if revision is not None:
4245
if len(revision) >= 1:
4246
other_revision_id = revision[-1].as_revision_id(other_branch)
4247
if len(revision) == 2:
4248
base_revision_id = revision[0].as_revision_id(base_branch)
4249
if other_revision_id is None:
4250
other_revision_id = _mod_revision.ensure_null(
4251
other_branch.last_revision())
4252
# Remember where we merge from. We need to remember if:
4253
# - user specify a location (and we don't merge from the parent
4255
# - user ask to remember or there is no previous location set to merge
4256
# from and user didn't ask to *not* remember
4257
if (user_location is not None
4259
or (remember is None
4260
and tree.branch.get_submit_branch() is None)))):
4261
tree.branch.set_submit_branch(other_branch.base)
4262
# Merge tags (but don't set them in the master branch yet, the user
4263
# might revert this merge). Commit will propagate them.
4264
_merge_tags_if_possible(other_branch, tree.branch, ignore_master=True)
4265
merger = _mod_merge.Merger.from_revision_ids(pb, tree,
4266
other_revision_id, base_revision_id, other_branch, base_branch)
4267
if other_path != '':
4268
allow_pending = False
4269
merger.interesting_files = [other_path]
4271
allow_pending = True
4272
return merger, allow_pending
4274
def get_merger_from_uncommitted(self, tree, location, pb):
4275
"""Get a merger for uncommitted changes.
4277
:param tree: The tree the merger should apply to.
4278
:param location: The location containing uncommitted changes.
4279
:param pb: The progress bar to use for showing progress.
4281
location = self._select_branch_location(tree, location)[0]
4282
other_tree, other_path = WorkingTree.open_containing(location)
4283
merger = _mod_merge.Merger.from_uncommitted(tree, other_tree, pb)
4284
if other_path != '':
4285
merger.interesting_files = [other_path]
4288
def _select_branch_location(self, tree, user_location, revision=None,
4290
"""Select a branch location, according to possible inputs.
4292
If provided, branches from ``revision`` are preferred. (Both
4293
``revision`` and ``index`` must be supplied.)
4295
Otherwise, the ``location`` parameter is used. If it is None, then the
4296
``submit`` or ``parent`` location is used, and a note is printed.
4298
:param tree: The working tree to select a branch for merging into
4299
:param location: The location entered by the user
4300
:param revision: The revision parameter to the command
4301
:param index: The index to use for the revision parameter. Negative
4302
indices are permitted.
4303
:return: (selected_location, user_location). The default location
4304
will be the user-entered location.
4306
if (revision is not None and index is not None
4307
and revision[index] is not None):
4308
branch = revision[index].get_branch()
4309
if branch is not None:
4310
return branch, branch
4311
if user_location is None:
4312
location = self._get_remembered(tree, 'Merging from')
4314
location = user_location
4315
return location, user_location
4317
def _get_remembered(self, tree, verb_string):
2747
except errors.AmbiguousBase, e:
2748
m = ("sorry, bzr can't determine the right merge base yet\n"
2749
"candidates are:\n "
2750
+ "\n ".join(e.bases)
2752
"please specify an explicit base with -r,\n"
2753
"and (if you want) report this to the bzr developers\n")
2756
# TODO: move up to common parent; this isn't merge-specific anymore.
2757
def _get_remembered_parent(self, tree, supplied_location, verb_string):
4318
2758
"""Use tree.branch's parent if none was supplied.
4320
2760
Report if the remembered location was used.
4322
stored_location = tree.branch.get_submit_branch()
4323
stored_location_type = "submit"
4324
if stored_location is None:
4325
stored_location = tree.branch.get_parent()
4326
stored_location_type = "parent"
2762
if supplied_location is not None:
2763
return supplied_location
2764
stored_location = tree.branch.get_parent()
4327
2765
mutter("%s", stored_location)
4328
2766
if stored_location is None:
4329
2767
raise errors.BzrCommandError("No location specified or remembered")
4330
display_url = urlutils.unescape_for_display(stored_location, 'utf-8')
4331
note(u"%s remembered %s location %s", verb_string,
4332
stored_location_type, display_url)
2768
display_url = urlutils.unescape_for_display(stored_location, self.outf.encoding)
2769
self.outf.write("%s remembered location %s\n" % (verb_string, display_url))
4333
2770
return stored_location
4336
2773
class cmd_remerge(Command):
4337
__doc__ = """Redo a merge.
4339
2776
Use this if you want to try a different merge technique while resolving
4340
conflicts. Some merge techniques are better than others, and remerge
2777
conflicts. Some merge techniques are better than others, and remerge
4341
2778
lets you try different ones on different files.
4343
2780
The options for remerge have the same meaning and defaults as the ones for
4344
2781
merge. The difference is that remerge can (only) be run when there is a
4345
2782
pending merge, and it lets you specify particular files.
2786
$ bzr remerge --show-base
4348
2787
Re-do the merge of all conflicted files, and show the base text in
4349
conflict regions, in addition to the usual THIS and OTHER texts::
4351
bzr remerge --show-base
2788
conflict regions, in addition to the usual THIS and OTHER texts.
2790
$ bzr remerge --merge-type weave --reprocess foobar
4353
2791
Re-do the merge of "foobar", using the weave merge algorithm, with
4354
additional processing to reduce the size of conflict regions::
4356
bzr remerge --merge-type weave --reprocess foobar
2792
additional processing to reduce the size of conflict regions.
4358
2794
takes_args = ['file*']
4363
help="Show base revision text in conflicts."),
2795
takes_options = ['merge-type', 'reprocess',
2796
Option('show-base', help="Show base revision text in "
4366
2799
def run(self, file_list=None, merge_type=None, show_base=False,
4367
2800
reprocess=False):
4368
from bzrlib.conflicts import restore
4369
2801
if merge_type is None:
4370
2802
merge_type = _mod_merge.Merge3Merger
4371
tree, file_list = WorkingTree.open_containing_paths(file_list)
4372
self.add_cleanup(tree.lock_write().unlock)
4373
parents = tree.get_parent_ids()
4374
if len(parents) != 2:
4375
raise errors.BzrCommandError("Sorry, remerge only works after normal"
4376
" merges. Not cherrypicking or"
4378
repository = tree.branch.repository
4379
interesting_ids = None
4381
conflicts = tree.conflicts()
4382
if file_list is not None:
4383
interesting_ids = set()
4384
for filename in file_list:
4385
file_id = tree.path2id(filename)
4387
raise errors.NotVersionedError(filename)
4388
interesting_ids.add(file_id)
4389
if tree.kind(file_id) != "directory":
4392
for name, ie in tree.inventory.iter_entries(file_id):
4393
interesting_ids.add(ie.file_id)
4394
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
4396
# Remerge only supports resolving contents conflicts
4397
allowed_conflicts = ('text conflict', 'contents conflict')
4398
restore_files = [c.path for c in conflicts
4399
if c.typestring in allowed_conflicts]
4400
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
4401
tree.set_conflicts(ConflictList(new_conflicts))
4402
if file_list is not None:
4403
restore_files = file_list
4404
for filename in restore_files:
4406
restore(tree.abspath(filename))
4407
except errors.NotConflicted:
4409
# Disable pending merges, because the file texts we are remerging
4410
# have not had those merges performed. If we use the wrong parents
4411
# list, we imply that the working tree text has seen and rejected
4412
# all the changes from the other tree, when in fact those changes
4413
# have not yet been seen.
4414
tree.set_parent_ids(parents[:1])
2803
tree, file_list = tree_files(file_list)
4416
merger = _mod_merge.Merger.from_revision_ids(None, tree, parents[1])
4417
merger.interesting_ids = interesting_ids
4418
merger.merge_type = merge_type
4419
merger.show_base = show_base
4420
merger.reprocess = reprocess
4421
conflicts = merger.do_merge()
2806
parents = tree.get_parent_ids()
2807
if len(parents) != 2:
2808
raise errors.BzrCommandError("Sorry, remerge only works after normal"
2809
" merges. Not cherrypicking or"
2811
repository = tree.branch.repository
2812
graph = repository.get_graph()
2813
base_revision = graph.find_unique_lca(parents[0], parents[1])
2814
base_tree = repository.revision_tree(base_revision)
2815
other_tree = repository.revision_tree(parents[1])
2816
interesting_ids = None
2818
conflicts = tree.conflicts()
2819
if file_list is not None:
2820
interesting_ids = set()
2821
for filename in file_list:
2822
file_id = tree.path2id(filename)
2824
raise errors.NotVersionedError(filename)
2825
interesting_ids.add(file_id)
2826
if tree.kind(file_id) != "directory":
2829
for name, ie in tree.inventory.iter_entries(file_id):
2830
interesting_ids.add(ie.file_id)
2831
new_conflicts = conflicts.select_conflicts(tree, file_list)[0]
2833
# Remerge only supports resolving contents conflicts
2834
allowed_conflicts = ('text conflict', 'contents conflict')
2835
restore_files = [c.path for c in conflicts
2836
if c.typestring in allowed_conflicts]
2837
_mod_merge.transform_tree(tree, tree.basis_tree(), interesting_ids)
2838
tree.set_conflicts(ConflictList(new_conflicts))
2839
if file_list is not None:
2840
restore_files = file_list
2841
for filename in restore_files:
2843
restore(tree.abspath(filename))
2844
except errors.NotConflicted:
2846
conflicts = _mod_merge.merge_inner(
2847
tree.branch, other_tree, base_tree,
2849
interesting_ids=interesting_ids,
2850
other_rev_id=parents[1],
2851
merge_type=merge_type,
2852
show_base=show_base,
2853
reprocess=reprocess)
4423
tree.set_parent_ids(parents)
4424
2856
if conflicts > 0:
4531
2939
class cmd_shell_complete(Command):
4532
__doc__ = """Show appropriate completions for context.
2940
"""Show appropriate completions for context.
4534
2942
For a list of all available commands, say 'bzr shell-complete'.
4536
2944
takes_args = ['context?']
4537
2945
aliases = ['s-c']
4540
2948
@display_command
4541
2949
def run(self, context=None):
4542
2950
import shellcomplete
4543
2951
shellcomplete.shellcomplete(context)
2954
class cmd_fetch(Command):
2955
"""Copy in history from another branch but don't merge it.
2957
This is an internal method used for pull and merge.
2960
takes_args = ['from_branch', 'to_branch']
2961
def run(self, from_branch, to_branch):
2962
from bzrlib.fetch import Fetcher
2963
from_b = Branch.open(from_branch)
2964
to_b = Branch.open(to_branch)
2965
Fetcher(to_b, from_b)
4546
2968
class cmd_missing(Command):
4547
__doc__ = """Show unmerged/unpulled revisions between two branches.
2969
"""Show unmerged/unpulled revisions between two branches.
4549
2971
OTHER_BRANCH may be local or remote.
4551
To filter on a range of revisions, you can use the command -r begin..end
4552
-r revision requests a specific revision, -r ..end or -r begin.. are
4556
1 - some missing revisions
4557
0 - no missing revisions
4561
Determine the missing revisions between this and the branch at the
4562
remembered pull location::
4566
Determine the missing revisions between this and another branch::
4568
bzr missing http://server/branch
4570
Determine the missing revisions up to a specific revision on the other
4573
bzr missing -r ..-10
4575
Determine the missing revisions up to a specific revision on this
4578
bzr missing --my-revision ..-10
4581
2974
_see_also = ['merge', 'pull']
4582
2975
takes_args = ['other_branch?']
4585
Option('reverse', 'Reverse the order of revisions.'),
4587
'Display changes in the local branch only.'),
4588
Option('this' , 'Same as --mine-only.'),
4589
Option('theirs-only',
4590
'Display changes in the remote branch only.'),
4591
Option('other', 'Same as --theirs-only.'),
4595
custom_help('revision',
4596
help='Filter on other branch revisions (inclusive). '
4597
'See "help revisionspec" for details.'),
4598
Option('my-revision',
4599
type=_parse_revision_str,
4600
help='Filter on local branch revisions (inclusive). '
4601
'See "help revisionspec" for details.'),
4602
Option('include-merges',
4603
'Show all revisions in addition to the mainline ones.'),
2976
takes_options = [Option('reverse', 'Reverse the order of revisions'),
2978
'Display changes in the local branch only'),
2979
Option('this' , 'same as --mine-only'),
2980
Option('theirs-only',
2981
'Display changes in the remote branch only'),
2982
Option('other', 'same as --theirs-only'),
4605
2987
encoding_type = 'replace'
4607
2989
@display_command
4608
2990
def run(self, other_branch=None, reverse=False, mine_only=False,
4610
log_format=None, long=False, short=False, line=False,
4611
show_ids=False, verbose=False, this=False, other=False,
4612
include_merges=False, revision=None, my_revision=None,
2991
theirs_only=False, log_format=None, long=False, short=False, line=False,
2992
show_ids=False, verbose=False, this=False, other=False):
4614
2993
from bzrlib.missing import find_unmerged, iter_log_revisions
2994
from bzrlib.log import log_formatter
4623
# TODO: We should probably check that we don't have mine-only and
4624
# theirs-only set, but it gets complicated because we also have
4625
# this and other which could be used.
4632
local_branch = Branch.open_containing(directory)[0]
4633
self.add_cleanup(local_branch.lock_read().unlock)
3001
local_branch = Branch.open_containing(u".")[0]
4635
3002
parent = local_branch.get_parent()
4636
3003
if other_branch is None:
4637
3004
other_branch = parent
4638
3005
if other_branch is None:
4639
raise errors.BzrCommandError("No peer location known"
3006
raise errors.BzrCommandError("No peer location known or specified.")
4641
3007
display_url = urlutils.unescape_for_display(parent,
4642
3008
self.outf.encoding)
4643
message("Using saved parent location: "
4644
+ display_url + "\n")
3009
print "Using last location: " + display_url
4646
3011
remote_branch = Branch.open(other_branch)
4647
3012
if remote_branch.base == local_branch.base:
4648
3013
remote_branch = local_branch
4650
self.add_cleanup(remote_branch.lock_read().unlock)
4652
local_revid_range = _revision_range_to_revid_range(
4653
_get_revision_range(my_revision, local_branch,
4656
remote_revid_range = _revision_range_to_revid_range(
4657
_get_revision_range(revision,
4658
remote_branch, self.name()))
4660
local_extra, remote_extra = find_unmerged(
4661
local_branch, remote_branch, restrict,
4662
backward=not reverse,
4663
include_merges=include_merges,
4664
local_revid_range=local_revid_range,
4665
remote_revid_range=remote_revid_range)
4667
if log_format is None:
4668
registry = log.log_formatter_registry
4669
log_format = registry.get_default(local_branch)
4670
lf = log_format(to_file=self.outf,
4672
show_timezone='original')
4675
if local_extra and not theirs_only:
4676
message("You have %d extra revision(s):\n" %
4678
for revision in iter_log_revisions(local_extra,
4679
local_branch.repository,
4681
lf.log_revision(revision)
4682
printed_local = True
4685
printed_local = False
4687
if remote_extra and not mine_only:
4688
if printed_local is True:
4690
message("You are missing %d revision(s):\n" %
4692
for revision in iter_log_revisions(remote_extra,
4693
remote_branch.repository,
4695
lf.log_revision(revision)
4698
if mine_only and not local_extra:
4699
# We checked local, and found nothing extra
4700
message('This branch has no new revisions.\n')
4701
elif theirs_only and not remote_extra:
4702
# We checked remote, and found nothing extra
4703
message('Other branch has no new revisions.\n')
4704
elif not (mine_only or theirs_only or local_extra or
4706
# We checked both branches, and neither one had extra
4708
message("Branches are up to date.\n")
3014
local_branch.lock_read()
3016
remote_branch.lock_read()
3018
local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
3019
if (log_format is None):
3020
log_format = log.log_formatter_registry.get_default(
3022
lf = log_format(to_file=self.outf,
3024
show_timezone='original')
3025
if reverse is False:
3026
local_extra.reverse()
3027
remote_extra.reverse()
3028
if local_extra and not theirs_only:
3029
print "You have %d extra revision(s):" % len(local_extra)
3030
for revision in iter_log_revisions(local_extra,
3031
local_branch.repository,
3033
lf.log_revision(revision)
3034
printed_local = True
3036
printed_local = False
3037
if remote_extra and not mine_only:
3038
if printed_local is True:
3040
print "You are missing %d revision(s):" % len(remote_extra)
3041
for revision in iter_log_revisions(remote_extra,
3042
remote_branch.repository,
3044
lf.log_revision(revision)
3045
if not remote_extra and not local_extra:
3047
print "Branches are up to date."
3051
remote_branch.unlock()
3053
local_branch.unlock()
4710
3054
if not status_code and parent is None and other_branch is not None:
4711
self.add_cleanup(local_branch.lock_write().unlock)
4712
# handle race conditions - a parent might be set while we run.
4713
if local_branch.get_parent() is None:
4714
local_branch.set_parent(remote_branch.base)
3055
local_branch.lock_write()
3057
# handle race conditions - a parent might be set while we run.
3058
if local_branch.get_parent() is None:
3059
local_branch.set_parent(remote_branch.base)
3061
local_branch.unlock()
4715
3062
return status_code
4718
class cmd_pack(Command):
4719
__doc__ = """Compress the data within a repository.
4721
This operation compresses the data within a bazaar repository. As
4722
bazaar supports automatic packing of repository, this operation is
4723
normally not required to be done manually.
4725
During the pack operation, bazaar takes a backup of existing repository
4726
data, i.e. pack files. This backup is eventually removed by bazaar
4727
automatically when it is safe to do so. To save disk space by removing
4728
the backed up pack files, the --clean-obsolete-packs option may be
4731
Warning: If you use --clean-obsolete-packs and your machine crashes
4732
during or immediately after repacking, you may be left with a state
4733
where the deletion has been written to disk but the new packs have not
4734
been. In this case the repository may be unusable.
4737
_see_also = ['repositories']
4738
takes_args = ['branch_or_repo?']
4740
Option('clean-obsolete-packs', 'Delete obsolete packs to save disk space.'),
4743
def run(self, branch_or_repo='.', clean_obsolete_packs=False):
4744
dir = bzrdir.BzrDir.open_containing(branch_or_repo)[0]
4746
branch = dir.open_branch()
4747
repository = branch.repository
4748
except errors.NotBranchError:
4749
repository = dir.open_repository()
4750
repository.pack(clean_obsolete_packs=clean_obsolete_packs)
4753
3065
class cmd_plugins(Command):
4754
__doc__ = """List the installed plugins.
4756
This command displays the list of installed plugins including
4757
version of plugin and a short description of each.
4759
--verbose shows the path where each plugin is located.
4761
A plugin is an external component for Bazaar that extends the
4762
revision control system, by adding or replacing code in Bazaar.
4763
Plugins can do a variety of things, including overriding commands,
4764
adding new commands, providing additional network transports and
4765
customizing log output.
4767
See the Bazaar Plugin Guide <http://doc.bazaar.canonical.com/plugins/en/>
4768
for further information on plugins including where to find them and how to
4769
install them. Instructions are also provided there on how to write new
4770
plugins using the Python programming language.
4772
takes_options = ['verbose']
4774
3068
@display_command
4775
def run(self, verbose=False):
4776
from bzrlib import plugin
4777
# Don't give writelines a generator as some codecs don't like that
4778
self.outf.writelines(
4779
list(plugin.describe_plugins(show_paths=verbose)))
3070
import bzrlib.plugin
3071
from inspect import getdoc
3072
for name, plugin in bzrlib.plugin.all_plugins().items():
3073
if getattr(plugin, '__path__', None) is not None:
3074
print plugin.__path__[0]
3075
elif getattr(plugin, '__file__', None) is not None:
3076
print plugin.__file__
3082
print '\t', d.split('\n')[0]
4782
3085
class cmd_testament(Command):
4783
__doc__ = """Show testament (signing-form) of a revision."""
4786
Option('long', help='Produce long-format testament.'),
4788
help='Produce a strict-format testament.')]
3086
"""Show testament (signing-form) of a revision."""
3087
takes_options = ['revision',
3088
Option('long', help='Produce long-format testament'),
3089
Option('strict', help='Produce a strict-format'
4789
3091
takes_args = ['branch?']
4790
3092
@display_command
4791
3093
def run(self, branch=u'.', revision=None, long=False, strict=False):
5393
3597
s.send_email(message)
5396
class cmd_send(Command):
5397
__doc__ = """Mail or create a merge-directive for submitting changes.
5399
A merge directive provides many things needed for requesting merges:
5401
* A machine-readable description of the merge to perform
5403
* An optional patch that is a preview of the changes requested
5405
* An optional bundle of revision data, so that the changes can be applied
5406
directly from the merge directive, without retrieving data from a
5409
`bzr send` creates a compact data set that, when applied using bzr
5410
merge, has the same effect as merging from the source branch.
5412
By default the merge directive is self-contained and can be applied to any
5413
branch containing submit_branch in its ancestory without needing access to
5416
If --no-bundle is specified, then Bazaar doesn't send the contents of the
5417
revisions, but only a structured request to merge from the
5418
public_location. In that case the public_branch is needed and it must be
5419
up-to-date and accessible to the recipient. The public_branch is always
5420
included if known, so that people can check it later.
5422
The submit branch defaults to the parent of the source branch, but can be
5423
overridden. Both submit branch and public branch will be remembered in
5424
branch.conf the first time they are used for a particular branch. The
5425
source branch defaults to that containing the working directory, but can
5426
be changed using --from.
5428
Both the submit branch and the public branch follow the usual behavior with
5429
respect to --remember: If there is no default location set, the first send
5430
will set it (use --no-remember to avoid setting it). After that, you can
5431
omit the location to use the default. To change the default, use
5432
--remember. The value will only be saved if the location can be accessed.
5434
In order to calculate those changes, bzr must analyse the submit branch.
5435
Therefore it is most efficient for the submit branch to be a local mirror.
5436
If a public location is known for the submit_branch, that location is used
5437
in the merge directive.
5439
The default behaviour is to send the merge directive by mail, unless -o is
5440
given, in which case it is sent to a file.
5442
Mail is sent using your preferred mail program. This should be transparent
5443
on Windows (it uses MAPI). On Unix, it requires the xdg-email utility.
5444
If the preferred client can't be found (or used), your editor will be used.
5446
To use a specific mail program, set the mail_client configuration option.
5447
(For Thunderbird 1.5, this works around some bugs.) Supported values for
5448
specific clients are "claws", "evolution", "kmail", "mail.app" (MacOS X's
5449
Mail.app), "mutt", and "thunderbird"; generic options are "default",
5450
"editor", "emacsclient", "mapi", and "xdg-email". Plugins may also add
5453
If mail is being sent, a to address is required. This can be supplied
5454
either on the commandline, by setting the submit_to configuration
5455
option in the branch itself or the child_submit_to configuration option
5456
in the submit branch.
5458
Two formats are currently supported: "4" uses revision bundle format 4 and
5459
merge directive format 2. It is significantly faster and smaller than
5460
older formats. It is compatible with Bazaar 0.19 and later. It is the
5461
default. "0.9" uses revision bundle format 0.9 and merge directive
5462
format 1. It is compatible with Bazaar 0.12 - 0.18.
5464
The merge directives created by bzr send may be applied using bzr merge or
5465
bzr pull by specifying a file containing a merge directive as the location.
5467
bzr send makes extensive use of public locations to map local locations into
5468
URLs that can be used by other people. See `bzr help configuration` to
5469
set them, and use `bzr info` to display them.
5472
encoding_type = 'exact'
5474
_see_also = ['merge', 'pull']
5476
takes_args = ['submit_branch?', 'public_branch?']
5480
help='Do not include a bundle in the merge directive.'),
5481
Option('no-patch', help='Do not include a preview patch in the merge'
5484
help='Remember submit and public branch.'),
5486
help='Branch to generate the submission from, '
5487
'rather than the one containing the working directory.',
5490
Option('output', short_name='o',
5491
help='Write merge directive to this file or directory; '
5492
'use - for stdout.',
5495
help='Refuse to send if there are uncommitted changes in'
5496
' the working tree, --no-strict disables the check.'),
5497
Option('mail-to', help='Mail the request to this address.',
5501
Option('body', help='Body for the email.', type=unicode),
5502
RegistryOption('format',
5503
help='Use the specified output format.',
5504
lazy_registry=('bzrlib.send', 'format_registry')),
5507
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5508
no_patch=False, revision=None, remember=None, output=None,
5509
format=None, mail_to=None, message=None, body=None,
5510
strict=None, **kwargs):
5511
from bzrlib.send import send
5512
return send(submit_branch, revision, public_branch, remember,
5513
format, no_bundle, no_patch, output,
5514
kwargs.get('from', '.'), mail_to, message, body,
5519
class cmd_bundle_revisions(cmd_send):
5520
__doc__ = """Create a merge-directive for submitting changes.
5522
A merge directive provides many things needed for requesting merges:
5524
* A machine-readable description of the merge to perform
5526
* An optional patch that is a preview of the changes requested
5528
* An optional bundle of revision data, so that the changes can be applied
5529
directly from the merge directive, without retrieving data from a
5532
If --no-bundle is specified, then public_branch is needed (and must be
5533
up-to-date), so that the receiver can perform the merge using the
5534
public_branch. The public_branch is always included if known, so that
5535
people can check it later.
5537
The submit branch defaults to the parent, but can be overridden. Both
5538
submit branch and public branch will be remembered if supplied.
5540
If a public_branch is known for the submit_branch, that public submit
5541
branch is used in the merge instructions. This means that a local mirror
5542
can be used as your actual submit branch, once you have set public_branch
5545
Two formats are currently supported: "4" uses revision bundle format 4 and
5546
merge directive format 2. It is significantly faster and smaller than
5547
older formats. It is compatible with Bazaar 0.19 and later. It is the
5548
default. "0.9" uses revision bundle format 0.9 and merge directive
5549
format 1. It is compatible with Bazaar 0.12 - 0.18.
5554
help='Do not include a bundle in the merge directive.'),
5555
Option('no-patch', help='Do not include a preview patch in the merge'
5558
help='Remember submit and public branch.'),
5560
help='Branch to generate the submission from, '
5561
'rather than the one containing the working directory.',
5564
Option('output', short_name='o', help='Write directive to this file.',
5567
help='Refuse to bundle revisions if there are uncommitted'
5568
' changes in the working tree, --no-strict disables the check.'),
5570
RegistryOption('format',
5571
help='Use the specified output format.',
5572
lazy_registry=('bzrlib.send', 'format_registry')),
5574
aliases = ['bundle']
5576
_see_also = ['send', 'merge']
5580
def run(self, submit_branch=None, public_branch=None, no_bundle=False,
5581
no_patch=False, revision=None, remember=False, output=None,
5582
format=None, strict=None, **kwargs):
5585
from bzrlib.send import send
5586
return send(submit_branch, revision, public_branch, remember,
5587
format, no_bundle, no_patch, output,
5588
kwargs.get('from', '.'), None, None, None,
5589
self.outf, strict=strict)
5592
3600
class cmd_tag(Command):
5593
__doc__ = """Create, remove or modify a tag naming a revision.
3601
"""Create a tag naming a revision.
5595
3603
Tags give human-meaningful names to revisions. Commands that take a -r
5596
3604
(--revision) option can be given -rtag:X, where X is any previously
5599
3607
Tags are stored in the branch. Tags are copied from one branch to another
5600
3608
along when you branch, push, pull or merge.
5602
It is an error to give a tag name that already exists unless you pass
3610
It is an error to give a tag name that already exists unless you pass
5603
3611
--force, in which case the tag is moved to point to the new revision.
5605
To rename a tag (change the name but keep it on the same revsion), run ``bzr
5606
tag new-name -r tag:old-name`` and then ``bzr tag --delete oldname``.
5608
If no tag name is specified it will be determined through the
5609
'automatic_tag_name' hook. This can e.g. be used to automatically tag
5610
upstream releases by reading configure.ac. See ``bzr help hooks`` for
5614
3614
_see_also = ['commit', 'tags']
5615
takes_args = ['tag_name?']
3615
takes_args = ['tag_name']
5616
3616
takes_options = [
5617
3617
Option('delete',
5618
3618
help='Delete this tag rather than placing it.',
5620
custom_help('directory',
5621
help='Branch in which to place the tag.'),
3621
help='Branch in which to place the tag.',
5622
3625
Option('force',
5623
help='Replace existing tags.',
3626
help='Replace existing tags',
5628
def run(self, tag_name=None,
3631
def run(self, tag_name,
5634
3637
branch, relpath = Branch.open_containing(directory)
5635
self.add_cleanup(branch.lock_write().unlock)
5637
if tag_name is None:
5638
raise errors.BzrCommandError("No tag specified to delete.")
5639
branch.tags.delete_tag(tag_name)
5640
note('Deleted tag %s.' % tag_name)
5643
if len(revision) != 1:
5644
raise errors.BzrCommandError(
5645
"Tags can only be placed on a single revision, "
5647
revision_id = revision[0].as_revision_id(branch)
5649
revision_id = branch.last_revision()
5650
if tag_name is None:
5651
tag_name = branch.automatic_tag_name(revision_id)
5652
if tag_name is None:
5653
raise errors.BzrCommandError(
5654
"Please specify a tag name.")
5656
existing_target = branch.tags.lookup_tag(tag_name)
5657
except errors.NoSuchTag:
5658
existing_target = None
5659
if not force and existing_target not in (None, revision_id):
5660
raise errors.TagAlreadyExists(tag_name)
5661
if existing_target == revision_id:
5662
note('Tag %s already exists for that revision.' % tag_name)
3641
branch.tags.delete_tag(tag_name)
3642
self.outf.write('Deleted tag %s.\n' % tag_name)
3645
if len(revision) != 1:
3646
raise errors.BzrCommandError(
3647
"Tags can only be placed on a single revision, "
3649
revision_id = revision[0].in_history(branch).rev_id
3651
revision_id = branch.last_revision()
3652
if (not force) and branch.tags.has_tag(tag_name):
3653
raise errors.TagAlreadyExists(tag_name)
5664
3654
branch.tags.set_tag(tag_name, revision_id)
5665
if existing_target is None:
5666
note('Created tag %s.' % tag_name)
5668
note('Updated tag %s.' % tag_name)
3655
self.outf.write('Created tag %s.\n' % tag_name)
5671
3660
class cmd_tags(Command):
5672
__doc__ = """List tags.
5674
This command shows a table of tag names and the revisions they reference.
3663
This tag shows a table of tag names and the revisions they reference.
5677
3666
_see_also = ['tag']
5678
3667
takes_options = [
5679
custom_help('directory',
5680
help='Branch whose tags should be displayed.'),
5681
RegistryOption('sort',
5682
'Sort tags by different criteria.', title='Sorting',
5683
lazy_registry=('bzrlib.tag', 'tag_sort_methods')
3669
help='Branch whose tags should be displayed',
5689
3675
@display_command
5690
def run(self, directory='.', sort=None, show_ids=False, revision=None):
5691
from bzrlib.tag import tag_sort_methods
5692
3679
branch, relpath = Branch.open_containing(directory)
5694
tags = branch.tags.get_tag_dict().items()
5698
self.add_cleanup(branch.lock_read().unlock)
5700
graph = branch.repository.get_graph()
5701
rev1, rev2 = _get_revision_range(revision, branch, self.name())
5702
revid1, revid2 = rev1.rev_id, rev2.rev_id
5703
# only show revisions between revid1 and revid2 (inclusive)
5704
tags = [(tag, revid) for tag, revid in tags if
5705
graph.is_between(revid, revid1, revid2)]
5707
sort = tag_sort_methods.get()
5710
# [ (tag, revid), ... ] -> [ (tag, dotted_revno), ... ]
5711
for index, (tag, revid) in enumerate(tags):
5713
revno = branch.revision_id_to_dotted_revno(revid)
5714
if isinstance(revno, tuple):
5715
revno = '.'.join(map(str, revno))
5716
except (errors.NoSuchRevision, errors.GhostRevisionsHaveNoRevno):
5717
# Bad tag data/merges can lead to tagged revisions
5718
# which are not in this branch. Fail gracefully ...
5720
tags[index] = (tag, revno)
5722
for tag, revspec in tags:
5723
self.outf.write('%-20s %s\n' % (tag, revspec))
5726
class cmd_reconfigure(Command):
5727
__doc__ = """Reconfigure the type of a bzr directory.
5729
A target configuration must be specified.
5731
For checkouts, the bind-to location will be auto-detected if not specified.
5732
The order of preference is
5733
1. For a lightweight checkout, the current bound location.
5734
2. For branches that used to be checkouts, the previously-bound location.
5735
3. The push location.
5736
4. The parent location.
5737
If none of these is available, --bind-to must be specified.
5740
_see_also = ['branches', 'checkouts', 'standalone-trees', 'working-trees']
5741
takes_args = ['location?']
5743
RegistryOption.from_kwargs(
5746
help='The relation between branch and tree.',
5747
value_switches=True, enum_switch=False,
5748
branch='Reconfigure to be an unbound branch with no working tree.',
5749
tree='Reconfigure to be an unbound branch with a working tree.',
5750
checkout='Reconfigure to be a bound branch with a working tree.',
5751
lightweight_checkout='Reconfigure to be a lightweight'
5752
' checkout (with no local history).',
5754
RegistryOption.from_kwargs(
5756
title='Repository type',
5757
help='Location fo the repository.',
5758
value_switches=True, enum_switch=False,
5759
standalone='Reconfigure to be a standalone branch '
5760
'(i.e. stop using shared repository).',
5761
use_shared='Reconfigure to use a shared repository.',
5763
RegistryOption.from_kwargs(
5765
title='Trees in Repository',
5766
help='Whether new branches in the repository have trees.',
5767
value_switches=True, enum_switch=False,
5768
with_trees='Reconfigure repository to create '
5769
'working trees on branches by default.',
5770
with_no_trees='Reconfigure repository to not create '
5771
'working trees on branches by default.'
5773
Option('bind-to', help='Branch to bind checkout to.', type=str),
5775
help='Perform reconfiguration even if local changes'
5777
Option('stacked-on',
5778
help='Reconfigure a branch to be stacked on another branch.',
5782
help='Reconfigure a branch to be unstacked. This '
5783
'may require copying substantial data into it.',
5787
def run(self, location=None, bind_to=None, force=False,
5788
tree_type=None, repository_type=None, repository_trees=None,
5789
stacked_on=None, unstacked=None):
5790
directory = bzrdir.BzrDir.open(location)
5791
if stacked_on and unstacked:
5792
raise errors.BzrCommandError("Can't use both --stacked-on and --unstacked")
5793
elif stacked_on is not None:
5794
reconfigure.ReconfigureStackedOn().apply(directory, stacked_on)
5796
reconfigure.ReconfigureUnstacked().apply(directory)
5797
# At the moment you can use --stacked-on and a different
5798
# reconfiguration shape at the same time; there seems no good reason
5800
if (tree_type is None and
5801
repository_type is None and
5802
repository_trees is None):
5803
if stacked_on or unstacked:
5806
raise errors.BzrCommandError('No target configuration '
5808
reconfiguration = None
5809
if tree_type == 'branch':
5810
reconfiguration = reconfigure.Reconfigure.to_branch(directory)
5811
elif tree_type == 'tree':
5812
reconfiguration = reconfigure.Reconfigure.to_tree(directory)
5813
elif tree_type == 'checkout':
5814
reconfiguration = reconfigure.Reconfigure.to_checkout(
5816
elif tree_type == 'lightweight-checkout':
5817
reconfiguration = reconfigure.Reconfigure.to_lightweight_checkout(
5820
reconfiguration.apply(force)
5821
reconfiguration = None
5822
if repository_type == 'use-shared':
5823
reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
5824
elif repository_type == 'standalone':
5825
reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
5827
reconfiguration.apply(force)
5828
reconfiguration = None
5829
if repository_trees == 'with-trees':
5830
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5832
elif repository_trees == 'with-no-trees':
5833
reconfiguration = reconfigure.Reconfigure.set_repository_trees(
5836
reconfiguration.apply(force)
5837
reconfiguration = None
5840
class cmd_switch(Command):
5841
__doc__ = """Set the branch of a checkout and update.
5843
For lightweight checkouts, this changes the branch being referenced.
5844
For heavyweight checkouts, this checks that there are no local commits
5845
versus the current bound branch, then it makes the local branch a mirror
5846
of the new location and binds to it.
5848
In both cases, the working tree is updated and uncommitted changes
5849
are merged. The user can commit or revert these as they desire.
5851
Pending merges need to be committed or reverted before using switch.
5853
The path to the branch to switch to can be specified relative to the parent
5854
directory of the current branch. For example, if you are currently in a
5855
checkout of /path/to/branch, specifying 'newbranch' will find a branch at
5858
Bound branches use the nickname of its master branch unless it is set
5859
locally, in which case switching will update the local nickname to be
5863
takes_args = ['to_location?']
5864
takes_options = ['directory',
5866
help='Switch even if local commits will be lost.'),
5868
Option('create-branch', short_name='b',
5869
help='Create the target branch from this one before'
5870
' switching to it.'),
5873
def run(self, to_location=None, force=False, create_branch=False,
5874
revision=None, directory=u'.'):
5875
from bzrlib import switch
5876
tree_location = directory
5877
revision = _get_one_revision('switch', revision)
5878
control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
5879
if to_location is None:
5880
if revision is None:
5881
raise errors.BzrCommandError('You must supply either a'
5882
' revision or a location')
5883
to_location = tree_location
5885
branch = control_dir.open_branch()
5886
had_explicit_nick = branch.get_config().has_explicit_nickname()
5887
except errors.NotBranchError:
5889
had_explicit_nick = False
5892
raise errors.BzrCommandError('cannot create branch without'
5894
to_location = directory_service.directories.dereference(
5896
if '/' not in to_location and '\\' not in to_location:
5897
# This path is meant to be relative to the existing branch
5898
this_url = self._get_branch_location(control_dir)
5899
to_location = urlutils.join(this_url, '..', to_location)
5900
to_branch = branch.bzrdir.sprout(to_location,
5901
possible_transports=[branch.bzrdir.root_transport],
5902
source_branch=branch).open_branch()
5905
to_branch = Branch.open(to_location)
5906
except errors.NotBranchError:
5907
this_url = self._get_branch_location(control_dir)
5908
to_branch = Branch.open(
5909
urlutils.join(this_url, '..', to_location))
5910
if revision is not None:
5911
revision = revision.as_revision_id(to_branch)
5912
switch.switch(control_dir, to_branch, force, revision_id=revision)
5913
if had_explicit_nick:
5914
branch = control_dir.open_branch() #get the new branch!
5915
branch.nick = to_branch.nick
5916
note('Switched to branch: %s',
5917
urlutils.unescape_for_display(to_branch.base, 'utf-8'))
5919
def _get_branch_location(self, control_dir):
5920
"""Return location of branch for this control dir."""
5922
this_branch = control_dir.open_branch()
5923
# This may be a heavy checkout, where we want the master branch
5924
master_location = this_branch.get_bound_location()
5925
if master_location is not None:
5926
return master_location
5927
# If not, use a local sibling
5928
return this_branch.base
5929
except errors.NotBranchError:
5930
format = control_dir.find_branch_format()
5931
if getattr(format, 'get_reference', None) is not None:
5932
return format.get_reference(control_dir)
5934
return control_dir.root_transport.base
5937
class cmd_view(Command):
5938
__doc__ = """Manage filtered views.
5940
Views provide a mask over the tree so that users can focus on
5941
a subset of a tree when doing their work. After creating a view,
5942
commands that support a list of files - status, diff, commit, etc -
5943
effectively have that list of files implicitly given each time.
5944
An explicit list of files can still be given but those files
5945
must be within the current view.
5947
In most cases, a view has a short life-span: it is created to make
5948
a selected change and is deleted once that change is committed.
5949
At other times, you may wish to create one or more named views
5950
and switch between them.
5952
To disable the current view without deleting it, you can switch to
5953
the pseudo view called ``off``. This can be useful when you need
5954
to see the whole tree for an operation or two (e.g. merge) but
5955
want to switch back to your view after that.
5958
To define the current view::
5960
bzr view file1 dir1 ...
5962
To list the current view::
5966
To delete the current view::
5970
To disable the current view without deleting it::
5972
bzr view --switch off
5974
To define a named view and switch to it::
5976
bzr view --name view-name file1 dir1 ...
5978
To list a named view::
5980
bzr view --name view-name
5982
To delete a named view::
5984
bzr view --name view-name --delete
5986
To switch to a named view::
5988
bzr view --switch view-name
5990
To list all views defined::
5994
To delete all views::
5996
bzr view --delete --all
6000
takes_args = ['file*']
6003
help='Apply list or delete action to all views.',
6006
help='Delete the view.',
6009
help='Name of the view to define, list or delete.',
6013
help='Name of the view to switch to.',
6018
def run(self, file_list,
6024
tree, file_list = WorkingTree.open_containing_paths(file_list,
6026
current_view, view_dict = tree.views.get_view_info()
6031
raise errors.BzrCommandError(
6032
"Both --delete and a file list specified")
6034
raise errors.BzrCommandError(
6035
"Both --delete and --switch specified")
6037
tree.views.set_view_info(None, {})
6038
self.outf.write("Deleted all views.\n")
6040
raise errors.BzrCommandError("No current view to delete")
6042
tree.views.delete_view(name)
6043
self.outf.write("Deleted '%s' view.\n" % name)
6046
raise errors.BzrCommandError(
6047
"Both --switch and a file list specified")
6049
raise errors.BzrCommandError(
6050
"Both --switch and --all specified")
6051
elif switch == 'off':
6052
if current_view is None:
6053
raise errors.BzrCommandError("No current view to disable")
6054
tree.views.set_view_info(None, view_dict)
6055
self.outf.write("Disabled '%s' view.\n" % (current_view))
6057
tree.views.set_view_info(switch, view_dict)
6058
view_str = views.view_display_str(tree.views.lookup_view())
6059
self.outf.write("Using '%s' view: %s\n" % (switch, view_str))
6062
self.outf.write('Views defined:\n')
6063
for view in sorted(view_dict):
6064
if view == current_view:
6068
view_str = views.view_display_str(view_dict[view])
6069
self.outf.write('%s %-20s %s\n' % (active, view, view_str))
6071
self.outf.write('No views defined.\n')
6074
# No name given and no current view set
6077
raise errors.BzrCommandError(
6078
"Cannot change the 'off' pseudo view")
6079
tree.views.set_view(name, sorted(file_list))
6080
view_str = views.view_display_str(tree.views.lookup_view())
6081
self.outf.write("Using '%s' view: %s\n" % (name, view_str))
6085
# No name given and no current view set
6086
self.outf.write('No current view.\n')
6088
view_str = views.view_display_str(tree.views.lookup_view(name))
6089
self.outf.write("'%s' view is: %s\n" % (name, view_str))
6092
class cmd_hooks(Command):
6093
__doc__ = """Show hooks."""
6098
for hook_key in sorted(hooks.known_hooks.keys()):
6099
some_hooks = hooks.known_hooks_key_to_object(hook_key)
6100
self.outf.write("%s:\n" % type(some_hooks).__name__)
6101
for hook_name, hook_point in sorted(some_hooks.items()):
6102
self.outf.write(" %s:\n" % (hook_name,))
6103
found_hooks = list(hook_point)
6105
for hook in found_hooks:
6106
self.outf.write(" %s\n" %
6107
(some_hooks.get_hook_name(hook),))
3680
for tag_name, target in sorted(branch.tags.get_tag_dict().items()):
3681
self.outf.write('%-20s %s\n' % (tag_name, target))
3684
# command-line interpretation helper for merge-related commands
3685
def _merge_helper(other_revision, base_revision,
3686
check_clean=True, ignore_zero=False,
3687
this_dir=None, backup_files=False,
3689
file_list=None, show_base=False, reprocess=False,
3692
change_reporter=None,
3694
"""Merge changes into a tree.
3697
list(path, revno) Base for three-way merge.
3698
If [None, None] then a base will be automatically determined.
3700
list(path, revno) Other revision for three-way merge.
3702
Directory to merge changes into; '.' by default.
3704
If true, this_dir must have no uncommitted changes before the
3706
ignore_zero - If true, suppress the "zero conflicts" message when
3707
there are no conflicts; should be set when doing something we expect
3708
to complete perfectly.
3709
file_list - If supplied, merge only changes to selected files.
3711
All available ancestors of other_revision and base_revision are
3712
automatically pulled into the branch.
3714
The revno may be -1 to indicate the last revision on the branch, which is
3717
This function is intended for use from the command line; programmatic
3718
clients might prefer to call merge.merge_inner(), which has less magic
3721
# Loading it late, so that we don't always have to import bzrlib.merge
3722
if merge_type is None:
3723
merge_type = _mod_merge.Merge3Merger
3724
if this_dir is None:
3726
this_tree = WorkingTree.open_containing(this_dir)[0]
3727
if show_base and not merge_type is _mod_merge.Merge3Merger:
3728
raise errors.BzrCommandError("Show-base is not supported for this merge"
3729
" type. %s" % merge_type)
3730
if reprocess and not merge_type.supports_reprocess:
3731
raise errors.BzrCommandError("Conflict reduction is not supported for merge"
3732
" type %s." % merge_type)
3733
if reprocess and show_base:
3734
raise errors.BzrCommandError("Cannot do conflict reduction and show base.")
3735
# TODO: jam 20070226 We should really lock these trees earlier. However, we
3736
# only want to take out a lock_tree_write() if we don't have to pull
3737
# any ancestry. But merge might fetch ancestry in the middle, in
3738
# which case we would need a lock_write().
3739
# Because we cannot upgrade locks, for now we live with the fact that
3740
# the tree will be locked multiple times during a merge. (Maybe
3741
# read-only some of the time, but it means things will get read
3744
merger = _mod_merge.Merger(this_tree.branch, this_tree=this_tree,
3745
pb=pb, change_reporter=change_reporter)
3746
merger.pp = ProgressPhase("Merge phase", 5, pb)
3747
merger.pp.next_phase()
3748
merger.check_basis(check_clean)
3749
if other_rev_id is not None:
3750
merger.set_other_revision(other_rev_id, this_tree.branch)
3752
merger.set_other(other_revision)
3753
merger.pp.next_phase()
3754
merger.set_base(base_revision)
3755
if merger.base_rev_id == merger.other_rev_id:
3756
note('Nothing to do.')
3758
if file_list is None:
3759
if pull and merger.base_rev_id == merger.this_rev_id:
3760
# FIXME: deduplicate with pull
3761
result = merger.this_tree.pull(merger.this_branch,
3762
False, merger.other_rev_id)
3763
if result.old_revid == result.new_revid:
3764
note('No revisions to pull.')
6109
self.outf.write(" <no hooks installed>\n")
6112
class cmd_remove_branch(Command):
6113
__doc__ = """Remove a branch.
6115
This will remove the branch from the specified location but
6116
will keep any working tree or repository in place.
6120
Remove the branch at repo/trunk::
6122
bzr remove-branch repo/trunk
6126
takes_args = ["location?"]
6128
aliases = ["rmbranch"]
6130
def run(self, location=None):
6131
if location is None:
6133
branch = Branch.open_containing(location)[0]
6134
branch.bzrdir.destroy_branch()
6137
class cmd_shelve(Command):
6138
__doc__ = """Temporarily set aside some changes from the current tree.
6140
Shelve allows you to temporarily put changes you've made "on the shelf",
6141
ie. out of the way, until a later time when you can bring them back from
6142
the shelf with the 'unshelve' command. The changes are stored alongside
6143
your working tree, and so they aren't propagated along with your branch nor
6144
will they survive its deletion.
6146
If shelve --list is specified, previously-shelved changes are listed.
6148
Shelve is intended to help separate several sets of changes that have
6149
been inappropriately mingled. If you just want to get rid of all changes
6150
and you don't need to restore them later, use revert. If you want to
6151
shelve all text changes at once, use shelve --all.
6153
If filenames are specified, only the changes to those files will be
6154
shelved. Other files will be left untouched.
6156
If a revision is specified, changes since that revision will be shelved.
6158
You can put multiple items on the shelf, and by default, 'unshelve' will
6159
restore the most recently shelved changes.
6161
For complicated changes, it is possible to edit the changes in a separate
6162
editor program to decide what the file remaining in the working copy
6163
should look like. To do this, add the configuration option
6165
change_editor = PROGRAM @new_path @old_path
6167
where @new_path is replaced with the path of the new version of the
6168
file and @old_path is replaced with the path of the old version of
6169
the file. The PROGRAM should save the new file with the desired
6170
contents of the file in the working tree.
6174
takes_args = ['file*']
6179
Option('all', help='Shelve all changes.'),
6181
RegistryOption('writer', 'Method to use for writing diffs.',
6182
bzrlib.option.diff_writer_registry,
6183
value_switches=True, enum_switch=False),
6185
Option('list', help='List shelved changes.'),
6187
help='Destroy removed changes instead of shelving them.'),
6189
_see_also = ['unshelve', 'configuration']
6191
def run(self, revision=None, all=False, file_list=None, message=None,
6192
writer=None, list=False, destroy=False, directory=None):
6194
return self.run_for_list(directory=directory)
6195
from bzrlib.shelf_ui import Shelver
6197
writer = bzrlib.option.diff_writer_registry.get()
6199
shelver = Shelver.from_args(writer(sys.stdout), revision, all,
6200
file_list, message, destroy=destroy, directory=directory)
6205
except errors.UserAbort:
6208
def run_for_list(self, directory=None):
6209
if directory is None:
6211
tree = WorkingTree.open_containing(directory)[0]
6212
self.add_cleanup(tree.lock_read().unlock)
6213
manager = tree.get_shelf_manager()
6214
shelves = manager.active_shelves()
6215
if len(shelves) == 0:
6216
note('No shelved changes.')
6218
for shelf_id in reversed(shelves):
6219
message = manager.get_metadata(shelf_id).get('message')
6221
message = '<no message>'
6222
self.outf.write('%3d: %s\n' % (shelf_id, message))
6226
class cmd_unshelve(Command):
6227
__doc__ = """Restore shelved changes.
6229
By default, the most recently shelved changes are restored. However if you
6230
specify a shelf by id those changes will be restored instead. This works
6231
best when the changes don't depend on each other.
6234
takes_args = ['shelf_id?']
6237
RegistryOption.from_kwargs(
6238
'action', help="The action to perform.",
6239
enum_switch=False, value_switches=True,
6240
apply="Apply changes and remove from the shelf.",
6241
dry_run="Show changes, but do not apply or remove them.",
6242
preview="Instead of unshelving the changes, show the diff that "
6243
"would result from unshelving.",
6244
delete_only="Delete changes without applying them.",
6245
keep="Apply changes but don't delete them.",
6248
_see_also = ['shelve']
6250
def run(self, shelf_id=None, action='apply', directory=u'.'):
6251
from bzrlib.shelf_ui import Unshelver
6252
unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
6256
unshelver.tree.unlock()
6259
class cmd_clean_tree(Command):
6260
__doc__ = """Remove unwanted files from working tree.
6262
By default, only unknown files, not ignored files, are deleted. Versioned
6263
files are never deleted.
6265
Another class is 'detritus', which includes files emitted by bzr during
6266
normal operations and selftests. (The value of these files decreases with
6269
If no options are specified, unknown files are deleted. Otherwise, option
6270
flags are respected, and may be combined.
6272
To check what clean-tree will do, use --dry-run.
6274
takes_options = ['directory',
6275
Option('ignored', help='Delete all ignored files.'),
6276
Option('detritus', help='Delete conflict files, merge and revert'
6277
' backups, and failed selftest dirs.'),
6279
help='Delete files unknown to bzr (default).'),
6280
Option('dry-run', help='Show files to delete instead of'
6282
Option('force', help='Do not prompt before deleting.')]
6283
def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
6284
force=False, directory=u'.'):
6285
from bzrlib.clean_tree import clean_tree
6286
if not (unknown or ignored or detritus):
6290
clean_tree(directory, unknown=unknown, ignored=ignored,
6291
detritus=detritus, dry_run=dry_run, no_prompt=force)
6294
class cmd_reference(Command):
6295
__doc__ = """list, view and set branch locations for nested trees.
6297
If no arguments are provided, lists the branch locations for nested trees.
6298
If one argument is provided, display the branch location for that tree.
6299
If two arguments are provided, set the branch location for that tree.
6304
takes_args = ['path?', 'location?']
6306
def run(self, path=None, location=None):
6308
if path is not None:
6310
tree, branch, relpath =(
6311
bzrdir.BzrDir.open_containing_tree_or_branch(branchdir))
6312
if path is not None:
6315
tree = branch.basis_tree()
6317
info = branch._get_all_reference_info().iteritems()
6318
self._display_reference_info(tree, branch, info)
3766
note('Now on revision %d.' % result.new_revno)
3768
merger.backup_files = backup_files
3769
merger.merge_type = merge_type
3770
merger.set_interesting_files(file_list)
3771
merger.show_base = show_base
3772
merger.reprocess = reprocess
3773
conflicts = merger.do_merge()
3774
if file_list is None:
3775
merger.set_pending()
3781
def _create_prefix(cur_transport):
3782
needed = [cur_transport]
3783
# Recurse upwards until we can create a directory successfully
3785
new_transport = cur_transport.clone('..')
3786
if new_transport.base == cur_transport.base:
3787
raise errors.BzrCommandError("Failed to create path"
3791
new_transport.mkdir('.')
3792
except errors.NoSuchFile:
3793
needed.append(new_transport)
3794
cur_transport = new_transport
6320
file_id = tree.path2id(path)
6322
raise errors.NotVersionedError(path)
6323
if location is None:
6324
info = [(file_id, branch.get_reference_info(file_id))]
6325
self._display_reference_info(tree, branch, info)
6327
branch.set_reference_info(file_id, path, location)
6329
def _display_reference_info(self, tree, branch, info):
6331
for file_id, (path, location) in info:
6333
path = tree.id2path(file_id)
6334
except errors.NoSuchId:
6336
ref_list.append((path, location))
6337
for path, location in sorted(ref_list):
6338
self.outf.write('%s %s\n' % (path, location))
6341
class cmd_export_pot(Command):
6342
__doc__ = """Export command helps and error messages in po format."""
6347
from bzrlib.export_pot import export_pot
6348
export_pot(self.outf)
6351
def _register_lazy_builtins():
6352
# register lazy builtins from other modules; called at startup and should
6353
# be only called once.
6354
for (name, aliases, module_name) in [
6355
('cmd_bundle_info', [], 'bzrlib.bundle.commands'),
6356
('cmd_config', [], 'bzrlib.config'),
6357
('cmd_dpush', [], 'bzrlib.foreign'),
6358
('cmd_version_info', [], 'bzrlib.cmd_version_info'),
6359
('cmd_resolve', ['resolved'], 'bzrlib.conflicts'),
6360
('cmd_conflicts', [], 'bzrlib.conflicts'),
6361
('cmd_sign_my_commits', [], 'bzrlib.commit_signature_commands'),
6362
('cmd_verify_signatures', [],
6363
'bzrlib.commit_signature_commands'),
6364
('cmd_test_script', [], 'bzrlib.cmd_test_script'),
6366
builtin_command_registry.register_lazy(name, aliases, module_name)
3798
# Now we only need to create child directories
3800
cur_transport = needed.pop()
3801
cur_transport.ensure_base()
3804
merge = _merge_helper
3807
# these get imported and then picked up by the scan for cmd_*
3808
# TODO: Some more consistent way to split command definitions across files;
3809
# we do need to load at least some information about them to know of
3810
# aliases. ideally we would avoid loading the implementation until the
3811
# details were needed.
3812
from bzrlib.cmd_version_info import cmd_version_info
3813
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore
3814
from bzrlib.bundle.commands import cmd_bundle_revisions
3815
from bzrlib.sign_my_commits import cmd_sign_my_commits
3816
from bzrlib.weave_commands import cmd_versionedfile_list, cmd_weave_join, \
3817
cmd_weave_plan_merge, cmd_weave_merge_text