/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1
# Copyright (C) 2004, 2005 by Canonical Ltd
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
18
import sys
19
import os
20
21
import bzrlib
22
import bzrlib.trace
23
from bzrlib.trace import mutter, note, log_error, warning
1371 by Martin Pool
- raise NotBranchError if format file can't be read
24
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
1441 by Robert Collins
tests passing is a good idea - move the branch open in cmd_branch to ensure this, and remove noise from the test suite
25
from bzrlib.errors import DivergedBranches
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
26
from bzrlib.branch import Branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
27
from bzrlib import BZRDIR
28
from bzrlib.commands import Command
1185.16.43 by Martin Pool
- clean up handling of option objects
29
from bzrlib.option import Option
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
30
from bzrlib.workingtree import WorkingTree
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
31
32
33
class cmd_status(Command):
34
    """Display status summary.
35
36
    This reports on versioned and unknown files, reporting them
37
    grouped by state.  Possible states are:
38
39
    added
40
        Versioned in the working copy but not in the previous revision.
41
42
    removed
43
        Versioned in the previous revision but removed or deleted
44
        in the working copy.
45
46
    renamed
47
        Path of this file changed from the previous revision;
48
        the text may also have changed.  This includes files whose
49
        parent directory was renamed.
50
51
    modified
52
        Text has changed since the previous revision.
53
54
    unchanged
55
        Nothing about this file has changed since the previous revision.
56
        Only shown with --all.
57
58
    unknown
59
        Not versioned and not matching an ignore pattern.
60
61
    To see ignored files use 'bzr ignored'.  For details in the
62
    changes to file texts, use 'bzr diff'.
63
64
    If no arguments are specified, the status of the entire working
65
    directory is shown.  Otherwise, only the status of the specified
66
    files or directories is reported.  If a directory is given, status
67
    is reported for everything inside that directory.
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
68
69
    If a revision argument is given, the status is calculated against
70
    that revision, or between two revisions if two are provided.
1185.3.2 by Martin Pool
- remove -r option from status command because it's not used
71
    """
1185.1.11 by Robert Collins
fixme note for bzr status
72
    # XXX: FIXME: bzr status should accept a -r option to show changes
73
    # relative to a revision, or between revisions
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
74
75
    takes_args = ['file*']
1092.3.4 by Robert Collins
update symlink branch to integration
76
    takes_options = ['all', 'show-ids']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
77
    aliases = ['st', 'stat']
78
    
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
79
    def run(self, all=False, show_ids=False, file_list=None, revision=None):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
80
        if file_list:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
81
            b = Branch.open_containing(file_list[0])
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
82
            tree = WorkingTree(b.base, b)
83
            file_list = [tree.relpath(x) for x in file_list]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
84
            # special case: only one path was given and it's the root
85
            # of the branch
86
            if file_list == ['']:
87
                file_list = None
88
        else:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
89
            b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
90
            
91
        from bzrlib.status import show_status
92
        show_status(b, show_unchanged=all, show_ids=show_ids,
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
93
                    specific_files=file_list, revision=revision)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
94
95
96
class cmd_cat_revision(Command):
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
97
    """Write out metadata for a revision.
98
    
99
    The revision to print can either be specified by a specific
100
    revision identifier, or you can use --revision.
101
    """
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
102
103
    hidden = True
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
104
    takes_args = ['revision_id?']
105
    takes_options = ['revision']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
106
    
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
107
    def run(self, revision_id=None, revision=None):
108
        from bzrlib.revisionspec import RevisionSpec
109
110
        if revision_id is not None and revision is not None:
111
            raise BzrCommandError('You can only supply one of revision_id or --revision')
112
        if revision_id is None and revision is None:
113
            raise BzrCommandError('You must supply either --revision or a revision_id')
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
114
        b = Branch.open_containing('.')
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
115
        if revision_id is not None:
116
            sys.stdout.write(b.get_revision_xml_file(revision_id).read())
117
        elif revision is not None:
118
            for rev in revision:
119
                if rev is None:
120
                    raise BzrCommandError('You cannot specify a NULL revision.')
121
                revno, rev_id = rev.in_history(b)
122
                sys.stdout.write(b.get_revision_xml_file(rev_id).read())
1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
123
    
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
124
125
class cmd_revno(Command):
126
    """Show current revision number.
127
128
    This is equal to the number of revisions on this branch."""
129
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
130
        print Branch.open_containing('.').revno()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
131
1182 by Martin Pool
- more disentangling of xml storage format from objects
132
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
133
class cmd_revision_info(Command):
134
    """Show revision number and revision id for a given revision identifier.
135
    """
136
    hidden = True
137
    takes_args = ['revision_info*']
138
    takes_options = ['revision']
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
139
    def run(self, revision=None, revision_info_list=[]):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
140
        from bzrlib.revisionspec import RevisionSpec
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
141
142
        revs = []
143
        if revision is not None:
144
            revs.extend(revision)
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
145
        if revision_info_list is not None:
146
            for rev in revision_info_list:
147
                revs.append(RevisionSpec(rev))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
148
        if len(revs) == 0:
149
            raise BzrCommandError('You must supply a revision identifier')
150
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
151
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
152
153
        for rev in revs:
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
154
            revinfo = rev.in_history(b)
155
            if revinfo.revno is None:
156
                print '     %s' % revinfo.rev_id
157
            else:
158
                print '%4d %s' % (revinfo.revno, revinfo.rev_id)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
159
160
    
161
class cmd_add(Command):
162
    """Add specified files or directories.
163
164
    In non-recursive mode, all the named items are added, regardless
165
    of whether they were previously ignored.  A warning is given if
166
    any of the named files are already versioned.
167
168
    In recursive mode (the default), files are treated the same way
169
    but the behaviour for directories is different.  Directories that
170
    are already versioned do not give a warning.  All directories,
171
    whether already versioned or not, are searched for files or
172
    subdirectories that are neither versioned or ignored, and these
173
    are added.  This search proceeds recursively into versioned
174
    directories.  If no names are given '.' is assumed.
175
176
    Therefore simply saying 'bzr add' will version all files that
177
    are currently unknown.
178
1185.3.3 by Martin Pool
- patch from mpe to automatically add parent directories
179
    Adding a file whose parent directory is not versioned will
180
    implicitly add the parent, and so on up to the root. This means
181
    you should never need to explictly add a directory, they'll just
182
    get added when you add a file in the directory.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
183
    """
184
    takes_args = ['file*']
1446 by Robert Collins
fixup the verbose-does-nothing for add - add a --quiet instead
185
    takes_options = ['no-recurse', 'quiet']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
186
    
1446 by Robert Collins
fixup the verbose-does-nothing for add - add a --quiet instead
187
    def run(self, file_list, no_recurse=False, quiet=False):
188
        from bzrlib.add import smart_add, add_reporter_print, add_reporter_null
189
        if quiet:
190
            reporter = add_reporter_null
191
        else:
192
            reporter = add_reporter_print
193
        smart_add(file_list, not no_recurse, reporter)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
194
195
196
class cmd_mkdir(Command):
197
    """Create a new versioned directory.
198
199
    This is equivalent to creating the directory and then adding it.
200
    """
201
    takes_args = ['dir+']
202
203
    def run(self, dir_list):
204
        b = None
205
        
206
        for d in dir_list:
207
            os.mkdir(d)
208
            if not b:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
209
                b = Branch.open_containing(d)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
210
            b.add([d])
211
            print 'added', d
212
213
214
class cmd_relpath(Command):
215
    """Show path of a file relative to root"""
216
    takes_args = ['filename']
217
    hidden = True
218
    
219
    def run(self, filename):
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
220
        branch = Branch.open_containing(filename)
221
        print WorkingTree(branch.base, branch).relpath(filename)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
222
223
224
class cmd_inventory(Command):
225
    """Show inventory of the current working copy or a revision."""
226
    takes_options = ['revision', 'show-ids']
227
    
228
    def run(self, revision=None, show_ids=False):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
229
        b = Branch.open_containing('.')
230
        if revision is None:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
231
            inv = b.read_working_inventory()
232
        else:
233
            if len(revision) > 1:
234
                raise BzrCommandError('bzr inventory --revision takes'
235
                    ' exactly one revision identifier')
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
236
            inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
237
238
        for path, entry in inv.entries():
239
            if show_ids:
240
                print '%-50s %s' % (path, entry.file_id)
241
            else:
242
                print path
243
244
245
class cmd_move(Command):
246
    """Move files to a different directory.
247
248
    examples:
249
        bzr move *.txt doc
250
251
    The destination must be a versioned directory in the same branch.
252
    """
253
    takes_args = ['source$', 'dest']
254
    def run(self, source_list, dest):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
255
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
256
257
        # TODO: glob expansion on windows?
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
258
        tree = WorkingTree(b.base, b)
259
        b.move([tree.relpath(s) for s in source_list], tree.relpath(dest))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
260
261
262
class cmd_rename(Command):
263
    """Change the name of an entry.
264
265
    examples:
266
      bzr rename frob.c frobber.c
267
      bzr rename src/frob.c lib/frob.c
268
269
    It is an error if the destination name exists.
270
271
    See also the 'move' command, which moves files into a different
272
    directory without changing their name.
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
273
    """
274
    # TODO: Some way to rename multiple files without invoking 
275
    # bzr for each one?"""
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
276
    takes_args = ['from_name', 'to_name']
277
    
278
    def run(self, from_name, to_name):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
279
        b = Branch.open_containing('.')
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
280
        tree = WorkingTree(b.base, b)
281
        b.rename_one(tree.relpath(from_name), tree.relpath(to_name))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
282
283
284
class cmd_mv(Command):
285
    """Move or rename a file.
286
287
    usage:
288
        bzr mv OLDNAME NEWNAME
289
        bzr mv SOURCE... DESTINATION
290
291
    If the last argument is a versioned directory, all the other names
292
    are moved into it.  Otherwise, there must be exactly two arguments
293
    and the file is changed to a new name, which must not already exist.
294
295
    Files cannot be moved between branches.
296
    """
297
    takes_args = ['names*']
298
    def run(self, names_list):
299
        if len(names_list) < 2:
300
            raise BzrCommandError("missing file argument")
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
301
        b = Branch.open_containing(names_list[0])
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
302
        tree = WorkingTree(b.base, b)
303
        rel_names = [tree.relpath(x) for x in names_list]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
304
        
305
        if os.path.isdir(names_list[-1]):
306
            # move into existing directory
307
            for pair in b.move(rel_names[:-1], rel_names[-1]):
308
                print "%s => %s" % pair
309
        else:
310
            if len(names_list) != 2:
311
                raise BzrCommandError('to mv multiple files the destination '
312
                                      'must be a versioned directory')
1185.1.8 by Robert Collins
David Clymers patch to use rename rather than mv for two argument non-directory target bzr mv calls.
313
            b.rename_one(rel_names[0], rel_names[1])
314
            print "%s => %s" % (rel_names[0], rel_names[1])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
315
            
316
    
317
318
319
class cmd_pull(Command):
320
    """Pull any changes from another branch into the current one.
321
322
    If the location is omitted, the last-used location will be used.
323
    Both the revision history and the working directory will be
324
    updated.
325
326
    This command only works on branches that have not diverged.  Branches are
327
    considered diverged if both branches have had commits without first
328
    pulling from the other.
329
330
    If branches have diverged, you can use 'bzr merge' to pull the text changes
331
    from one into the other.
332
    """
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
333
    takes_options = ['remember']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
334
    takes_args = ['location?']
335
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
336
    def run(self, location=None, remember=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
337
        from bzrlib.merge import merge
338
        import tempfile
339
        from shutil import rmtree
340
        import errno
341
        
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
342
        br_to = Branch.open_containing('.')
974.1.79 by Aaron Bentley
Fixed issues with pull not having a default location after branch
343
        stored_loc = br_to.get_parent()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
344
        if location is None:
345
            if stored_loc is None:
346
                raise BzrCommandError("No pull location known or specified.")
347
            else:
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
348
                print "Using saved location: %s" % stored_loc
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
349
                location = stored_loc
350
        cache_root = tempfile.mkdtemp()
1441 by Robert Collins
tests passing is a good idea - move the branch open in cmd_branch to ensure this, and remove noise from the test suite
351
        br_from = Branch.open(location)
352
        br_from.lock_read()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
353
        try:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
354
            br_from.setup_caching(cache_root)
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
355
            location = br_from.base
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
356
            old_revno = br_to.revno()
1442 by Robert Collins
only do a local merge during pull if the revision history changed
357
            old_revision_history = br_to.revision_history()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
358
            try:
359
                br_to.update_revisions(br_from)
360
            except DivergedBranches:
361
                raise BzrCommandError("These branches have diverged."
362
                    "  Try merge.")
1442 by Robert Collins
only do a local merge during pull if the revision history changed
363
            new_revision_history = br_to.revision_history()
364
            if new_revision_history != old_revision_history:
365
                merge(('.', -1), ('.', old_revno), check_clean=False)
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
366
            if stored_loc is None or remember:
974.1.79 by Aaron Bentley
Fixed issues with pull not having a default location after branch
367
                br_to.set_parent(location)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
368
        finally:
1439 by Robert Collins
fix a prior bad merge of cmd_pull, which had resulted in double opens of remote branches
369
            br_from.unlock()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
370
            rmtree(cache_root)
371
372
373
374
class cmd_branch(Command):
375
    """Create a new copy of a branch.
376
377
    If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
378
    be used.  In other words, "branch ../foo/bar" will attempt to create ./bar.
379
380
    To retrieve the branch as of a particular revision, supply the --revision
381
    parameter, as in "branch foo/bar -r 5".
1185.10.2 by Aaron Bentley
Updated help message
382
383
    --basis is to speed up branching from remote branches.  When specified, it
384
    copies all the file-contents, inventory and revision data from the basis
385
    branch before copying anything from the remote branch.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
386
    """
387
    takes_args = ['from_location', 'to_location?']
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
388
    takes_options = ['revision', 'basis']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
389
    aliases = ['get', 'clone']
390
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
391
    def run(self, from_location, to_location=None, revision=None, basis=None):
1393.1.5 by Martin Pool
- move copy_branch into bzrlib.clone
392
        from bzrlib.clone import copy_branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
393
        import tempfile
394
        import errno
395
        from shutil import rmtree
396
        cache_root = tempfile.mkdtemp()
1185.17.3 by Martin Pool
[pick] larger read lock scope for branch command
397
        if revision is None:
398
            revision = [None]
399
        elif len(revision) > 1:
400
            raise BzrCommandError(
401
                'bzr branch --revision takes exactly 1 revision value')
402
        try:
403
            br_from = Branch.open(from_location)
404
        except OSError, e:
405
            if e.errno == errno.ENOENT:
406
                raise BzrCommandError('Source location "%s" does not'
407
                                      ' exist.' % to_location)
408
            else:
409
                raise
410
        br_from.lock_read()
411
        try:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
412
            br_from.setup_caching(cache_root)
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
413
            if basis is not None:
414
                basis_branch = Branch.open_containing(basis)
415
            else:
416
                basis_branch = None
1185.8.4 by Aaron Bentley
Fixed branch -r
417
            if len(revision) == 1 and revision[0] is not None:
1390 by Robert Collins
pair programming worx... merge integration and weave
418
                revision_id = revision[0].in_history(br_from)[1]
1185.8.4 by Aaron Bentley
Fixed branch -r
419
            else:
1390 by Robert Collins
pair programming worx... merge integration and weave
420
                revision_id = None
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
421
            if to_location is None:
422
                to_location = os.path.basename(from_location.rstrip("/\\"))
423
            try:
424
                os.mkdir(to_location)
425
            except OSError, e:
426
                if e.errno == errno.EEXIST:
427
                    raise BzrCommandError('Target directory "%s" already'
428
                                          ' exists.' % to_location)
429
                if e.errno == errno.ENOENT:
430
                    raise BzrCommandError('Parent of "%s" does not exist.' %
431
                                          to_location)
432
                else:
433
                    raise
434
            try:
1391 by Robert Collins
merge from integration
435
                copy_branch(br_from, to_location, revision_id, basis_branch)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
436
            except bzrlib.errors.NoSuchRevision:
437
                rmtree(to_location)
438
                msg = "The branch %s has no revision %d." % (from_location, revision[0])
439
                raise BzrCommandError(msg)
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
440
            except bzrlib.errors.UnlistableBranch:
441
                msg = "The branch %s cannot be used as a --basis"
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
442
        finally:
1185.17.3 by Martin Pool
[pick] larger read lock scope for branch command
443
            br_from.unlock()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
444
            rmtree(cache_root)
445
446
447
class cmd_renames(Command):
448
    """Show list of renamed files.
449
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
450
    # TODO: Option to show renames between two historical versions.
451
452
    # TODO: Only show renames under dir, rather than in the whole branch.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
453
    takes_args = ['dir?']
454
455
    def run(self, dir='.'):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
456
        b = Branch.open_containing(dir)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
457
        old_inv = b.basis_tree().inventory
458
        new_inv = b.read_working_inventory()
459
460
        renames = list(bzrlib.tree.find_renames(old_inv, new_inv))
461
        renames.sort()
462
        for old_name, new_name in renames:
463
            print "%s => %s" % (old_name, new_name)        
464
465
466
class cmd_info(Command):
467
    """Show statistical information about a branch."""
468
    takes_args = ['branch?']
469
    
470
    def run(self, branch=None):
471
        import info
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
472
        b = Branch.open_containing(branch)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
473
        info.show_info(b)
474
475
476
class cmd_remove(Command):
477
    """Make a file unversioned.
478
479
    This makes bzr stop tracking changes to a versioned file.  It does
480
    not delete the working copy.
481
    """
482
    takes_args = ['file+']
483
    takes_options = ['verbose']
1424 by Robert Collins
add rm alias to remove
484
    aliases = ['rm']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
485
    
486
    def run(self, file_list, verbose=False):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
487
        b = Branch.open_containing(file_list[0])
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
488
        tree = WorkingTree(b.base, b)
489
        b.remove([tree.relpath(f) for f in file_list], verbose=verbose)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
490
491
492
class cmd_file_id(Command):
493
    """Print file_id of a particular file or directory.
494
495
    The file_id is assigned when the file is first added and remains the
496
    same through all revisions where the file exists, even when it is
497
    moved or renamed.
498
    """
499
    hidden = True
500
    takes_args = ['filename']
501
    def run(self, filename):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
502
        b = Branch.open_containing(filename)
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
503
        tree = WorkingTree(b.base, b)
504
        i = b.inventory.path2id(tree.relpath(filename))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
505
        if i == None:
506
            raise BzrError("%r is not a versioned file" % filename)
507
        else:
508
            print i
509
510
511
class cmd_file_path(Command):
512
    """Print path of file_ids to a file or directory.
513
514
    This prints one line for each directory down to the target,
515
    starting at the branch root."""
516
    hidden = True
517
    takes_args = ['filename']
518
    def run(self, filename):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
519
        b = Branch.open_containing(filename)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
520
        inv = b.inventory
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
521
        tree = WorkingTree(b.base, b)
522
        fid = inv.path2id(tree.relpath(filename))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
523
        if fid == None:
524
            raise BzrError("%r is not a versioned file" % filename)
525
        for fip in inv.get_idpath(fid):
526
            print fip
527
528
529
class cmd_revision_history(Command):
530
    """Display list of revision ids on this branch."""
531
    hidden = True
532
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
533
        for patchid in Branch.open_containing('.').revision_history():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
534
            print patchid
535
536
1225 by Martin Pool
- branch now tracks ancestry - all merged revisions
537
class cmd_ancestry(Command):
538
    """List all revisions merged into this branch."""
539
    hidden = True
540
    def run(self):
541
        b = find_branch('.')
1241 by Martin Pool
- rename last_patch to last_revision
542
        for revision_id in b.get_ancestry(b.last_revision()):
1225 by Martin Pool
- branch now tracks ancestry - all merged revisions
543
            print revision_id
544
545
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
546
class cmd_directories(Command):
547
    """Display list of versioned directories in this branch."""
548
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
549
        for name, ie in Branch.open_containing('.').read_working_inventory().directories():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
550
            if name == '':
551
                print '.'
552
            else:
553
                print name
554
555
556
class cmd_init(Command):
557
    """Make a directory into a versioned branch.
558
559
    Use this to create an empty branch, or before importing an
560
    existing project.
561
562
    Recipe for importing a tree of files:
563
        cd ~/project
564
        bzr init
565
        bzr add -v .
566
        bzr status
567
        bzr commit -m 'imported project'
568
    """
569
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
570
        Branch.initialize('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
571
572
573
class cmd_diff(Command):
574
    """Show differences in working tree.
575
    
576
    If files are listed, only the changes in those files are listed.
577
    Otherwise, all changes for the tree are listed.
578
579
    examples:
580
        bzr diff
581
        bzr diff -r1
1185.1.2 by Martin Pool
- merge various windows and other fixes from Ollie Rutherfurd
582
        bzr diff -r1..2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
583
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
584
    # TODO: Allow diff across branches.
585
    # TODO: Option to use external diff command; could be GNU diff, wdiff,
586
    #       or a graphical diff.
587
588
    # TODO: Python difflib is not exactly the same as unidiff; should
589
    #       either fix it up or prefer to use an external diff.
590
591
    # TODO: If a directory is given, diff everything under that.
592
593
    # TODO: Selected-file diff is inefficient and doesn't show you
594
    #       deleted files.
595
596
    # TODO: This probably handles non-Unix newlines poorly.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
597
    
598
    takes_args = ['file*']
599
    takes_options = ['revision', 'diff-options']
600
    aliases = ['di', 'dif']
601
602
    def run(self, revision=None, file_list=None, diff_options=None):
603
        from bzrlib.diff import show_diff
604
605
        if file_list:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
606
            b = Branch.open_containing(file_list[0])
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
607
            tree = WorkingTree(b.base, b)
608
            file_list = [tree.relpath(f) for f in file_list]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
609
            if file_list == ['']:
610
                # just pointing to top-of-tree
611
                file_list = None
612
        else:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
613
            b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
614
615
        if revision is not None:
616
            if len(revision) == 1:
617
                show_diff(b, revision[0], specific_files=file_list,
618
                          external_diff_options=diff_options)
619
            elif len(revision) == 2:
620
                show_diff(b, revision[0], specific_files=file_list,
621
                          external_diff_options=diff_options,
622
                          revision2=revision[1])
623
            else:
624
                raise BzrCommandError('bzr diff --revision takes exactly one or two revision identifiers')
625
        else:
626
            show_diff(b, None, specific_files=file_list,
627
                      external_diff_options=diff_options)
628
629
        
630
631
632
class cmd_deleted(Command):
633
    """List files deleted in the working tree.
634
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
635
    # TODO: Show files deleted since a previous revision, or
636
    # between two revisions.
637
    # TODO: Much more efficient way to do this: read in new
638
    # directories with readdir, rather than stating each one.  Same
639
    # level of effort but possibly much less IO.  (Or possibly not,
640
    # if the directories are very large...)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
641
    def run(self, show_ids=False):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
642
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
643
        old = b.basis_tree()
644
        new = b.working_tree()
645
        for path, ie in old.inventory.iter_entries():
646
            if not new.has_id(ie.file_id):
647
                if show_ids:
648
                    print '%-50s %s' % (path, ie.file_id)
649
                else:
650
                    print path
651
652
653
class cmd_modified(Command):
654
    """List files modified in working tree."""
655
    hidden = True
656
    def run(self):
657
        from bzrlib.delta import compare_trees
658
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
659
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
660
        td = compare_trees(b.basis_tree(), b.working_tree())
661
1398 by Robert Collins
integrate in Gustavos x-bit patch
662
        for path, id, kind, text_modified, meta_modified in td.modified:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
663
            print path
664
665
666
667
class cmd_added(Command):
668
    """List files added in working tree."""
669
    hidden = True
670
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
671
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
672
        wt = b.working_tree()
673
        basis_inv = b.basis_tree().inventory
674
        inv = wt.inventory
675
        for file_id in inv:
676
            if file_id in basis_inv:
677
                continue
678
            path = inv.id2path(file_id)
679
            if not os.access(b.abspath(path), os.F_OK):
680
                continue
681
            print path
682
                
683
        
684
685
class cmd_root(Command):
686
    """Show the tree root directory.
687
688
    The root is the nearest enclosing directory with a .bzr control
689
    directory."""
690
    takes_args = ['filename?']
691
    def run(self, filename=None):
692
        """Print the branch root."""
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
693
        b = Branch.open_containing(filename)
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
694
        print b.base
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
695
696
697
class cmd_log(Command):
698
    """Show log of this branch.
699
700
    To request a range of logs, you can use the command -r begin:end
701
    -r revision requests a specific revision, -r :end or -r begin: are
702
    also valid.
703
    """
704
1393.1.55 by Martin Pool
doc
705
    # TODO: Make --revision support uuid: and hash: [future tag:] notation.
706
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
707
    takes_args = ['filename?']
1185.16.46 by mbp at sourcefrog
- add help strings to some options
708
    takes_options = [Option('forward', 
709
                            help='show from oldest to newest'),
710
                     'timezone', 'verbose', 
711
                     'show-ids', 'revision',
1185.16.57 by Martin Pool
[merge] from aaron
712
                     Option('line', help='format with one line per revision'),
1185.16.46 by mbp at sourcefrog
- add help strings to some options
713
                     'long', 
714
                     Option('message',
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
715
                            help='show revisions whose message matches this regexp',
716
                            type=str),
1185.16.57 by Martin Pool
[merge] from aaron
717
                     Option('short', help='use moderately short format'),
718
                     ]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
719
    
720
    def run(self, filename=None, timezone='original',
721
            verbose=False,
722
            show_ids=False,
723
            forward=False,
724
            revision=None,
725
            message=None,
726
            long=False,
1185.12.25 by Aaron Bentley
Added one-line log format
727
            short=False,
728
            line=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
729
        from bzrlib.log import log_formatter, show_log
730
        import codecs
1185.16.49 by mbp at sourcefrog
- more refactoring and tests of commandline
731
        assert message is None or isinstance(message, basestring), \
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
732
            "invalid message argument %r" % message
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
733
        direction = (forward and 'forward') or 'reverse'
734
        
735
        if filename:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
736
            b = Branch.open_containing(filename)
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
737
            tree = WorkingTree(b.base, b)
738
            fp = tree.relpath(filename)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
739
            if fp:
740
                file_id = b.read_working_inventory().path2id(fp)
741
            else:
742
                file_id = None  # points to branch root
743
        else:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
744
            b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
745
            file_id = None
746
747
        if revision is None:
748
            rev1 = None
749
            rev2 = None
750
        elif len(revision) == 1:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
751
            rev1 = rev2 = revision[0].in_history(b).revno
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
752
        elif len(revision) == 2:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
753
            rev1 = revision[0].in_history(b).revno
754
            rev2 = revision[1].in_history(b).revno
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
755
        else:
756
            raise BzrCommandError('bzr log --revision takes one or two values.')
757
758
        if rev1 == 0:
759
            rev1 = None
760
        if rev2 == 0:
761
            rev2 = None
762
763
        mutter('encoding log as %r' % bzrlib.user_encoding)
764
765
        # use 'replace' so that we don't abort if trying to write out
766
        # in e.g. the default C locale.
767
        outf = codecs.getwriter(bzrlib.user_encoding)(sys.stdout, errors='replace')
768
1185.12.25 by Aaron Bentley
Added one-line log format
769
        log_format = 'long'
770
        if short:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
771
            log_format = 'short'
1185.12.25 by Aaron Bentley
Added one-line log format
772
        if line:
773
            log_format = 'line'
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
774
        lf = log_formatter(log_format,
775
                           show_ids=show_ids,
776
                           to_file=outf,
777
                           show_timezone=timezone)
778
779
        show_log(b,
780
                 lf,
781
                 file_id,
782
                 verbose=verbose,
783
                 direction=direction,
784
                 start_revision=rev1,
785
                 end_revision=rev2,
786
                 search=message)
787
788
789
790
class cmd_touching_revisions(Command):
791
    """Return revision-ids which affected a particular file.
792
793
    A more user-friendly interface is "bzr log FILE"."""
794
    hidden = True
795
    takes_args = ["filename"]
796
    def run(self, filename):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
797
        b = Branch.open_containing(filename)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
798
        inv = b.read_working_inventory()
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
799
        tree = WorkingTree(b.base, b)
800
        file_id = inv.path2id(tree.relpath(filename))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
801
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
802
            print "%6d %s" % (revno, what)
803
804
805
class cmd_ls(Command):
806
    """List files in a tree.
807
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
808
    # TODO: Take a revision or remote path and list that tree instead.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
809
    hidden = True
810
    def run(self, revision=None, verbose=False):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
811
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
812
        if revision == None:
813
            tree = b.working_tree()
814
        else:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
815
            tree = b.revision_tree(revision.in_history(b).rev_id)
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
816
        for fp, fc, kind, fid, entry in tree.list_files():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
817
            if verbose:
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
818
                kindch = entry.kind_character()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
819
                print '%-8s %s%s' % (fc, fp, kindch)
820
            else:
821
                print fp
822
823
824
825
class cmd_unknowns(Command):
826
    """List unknown files."""
827
    def run(self):
828
        from bzrlib.osutils import quotefn
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
829
        for f in Branch.open_containing('.').unknowns():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
830
            print quotefn(f)
831
832
833
834
class cmd_ignore(Command):
835
    """Ignore a command or pattern.
836
837
    To remove patterns from the ignore list, edit the .bzrignore file.
838
839
    If the pattern contains a slash, it is compared to the whole path
1185.16.4 by Martin Pool
- doc and todo for ignore command
840
    from the branch root.  Otherwise, it is compared to only the last
841
    component of the path.  To match a file only in the root directory,
842
    prepend './'.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
843
844
    Ignore patterns are case-insensitive on case-insensitive systems.
845
846
    Note: wildcards must be quoted from the shell on Unix.
847
848
    examples:
849
        bzr ignore ./Makefile
850
        bzr ignore '*.class'
851
    """
1185.16.4 by Martin Pool
- doc and todo for ignore command
852
    # TODO: Complain if the filename is absolute
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
853
    takes_args = ['name_pattern']
854
    
855
    def run(self, name_pattern):
856
        from bzrlib.atomicfile import AtomicFile
857
        import os.path
858
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
859
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
860
        ifn = b.abspath('.bzrignore')
861
862
        if os.path.exists(ifn):
863
            f = open(ifn, 'rt')
864
            try:
865
                igns = f.read().decode('utf-8')
866
            finally:
867
                f.close()
868
        else:
869
            igns = ''
870
871
        # TODO: If the file already uses crlf-style termination, maybe
872
        # we should use that for the newly added lines?
873
874
        if igns and igns[-1] != '\n':
875
            igns += '\n'
876
        igns += name_pattern + '\n'
877
878
        try:
879
            f = AtomicFile(ifn, 'wt')
880
            f.write(igns.encode('utf-8'))
881
            f.commit()
882
        finally:
883
            f.close()
884
885
        inv = b.working_tree().inventory
886
        if inv.path2id('.bzrignore'):
887
            mutter('.bzrignore is already versioned')
888
        else:
889
            mutter('need to make new .bzrignore file versioned')
890
            b.add(['.bzrignore'])
891
892
893
894
class cmd_ignored(Command):
895
    """List ignored files and the patterns that matched them.
896
897
    See also: bzr ignore"""
898
    def run(self):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
899
        tree = Branch.open_containing('.').working_tree()
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
900
        for path, file_class, kind, file_id, entry in tree.list_files():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
901
            if file_class != 'I':
902
                continue
903
            ## XXX: Slightly inefficient since this was already calculated
904
            pat = tree.is_ignored(path)
905
            print '%-50s %s' % (path, pat)
906
907
908
class cmd_lookup_revision(Command):
909
    """Lookup the revision-id from a revision-number
910
911
    example:
912
        bzr lookup-revision 33
913
    """
914
    hidden = True
915
    takes_args = ['revno']
916
    
917
    def run(self, revno):
918
        try:
919
            revno = int(revno)
920
        except ValueError:
921
            raise BzrCommandError("not a valid revision-number: %r" % revno)
922
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
923
        print Branch.open_containing('.').get_rev_id(revno)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
924
925
926
class cmd_export(Command):
927
    """Export past revision to destination directory.
928
929
    If no revision is specified this exports the last committed revision.
930
931
    Format may be an "exporter" name, such as tar, tgz, tbz2.  If none is
932
    given, try to find the format with the extension. If no extension
933
    is found exports to a directory (equivalent to --format=dir).
934
935
    Root may be the top directory for tar, tgz and tbz2 formats. If none
936
    is given, the top directory will be the root name of the file."""
937
    # TODO: list known exporters
938
    takes_args = ['dest']
939
    takes_options = ['revision', 'format', 'root']
940
    def run(self, dest, revision=None, format=None, root=None):
941
        import os.path
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
942
        b = Branch.open_containing('.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
943
        if revision is None:
1241 by Martin Pool
- rename last_patch to last_revision
944
            rev_id = b.last_revision()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
945
        else:
946
            if len(revision) != 1:
947
                raise BzrError('bzr export --revision takes exactly 1 argument')
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
948
            rev_id = revision[0].in_history(b).rev_id
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
949
        t = b.revision_tree(rev_id)
1185.12.1 by Aaron Bentley
Fixed export
950
        arg_root, ext = os.path.splitext(os.path.basename(dest))
951
        if ext in ('.gz', '.bz2'):
952
            new_root, new_ext = os.path.splitext(arg_root)
953
            if new_ext == '.tar':
954
                arg_root = new_root
955
                ext = new_ext + ext
956
        if root is None:
957
            root = arg_root
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
958
        if not format:
959
            if ext in (".tar",):
960
                format = "tar"
1185.12.1 by Aaron Bentley
Fixed export
961
            elif ext in (".tar.gz", ".tgz"):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
962
                format = "tgz"
1185.12.1 by Aaron Bentley
Fixed export
963
            elif ext in (".tar.bz2", ".tbz2"):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
964
                format = "tbz2"
965
            else:
966
                format = "dir"
967
        t.export(dest, format, root)
968
969
970
class cmd_cat(Command):
971
    """Write a file's text from a previous revision."""
972
973
    takes_options = ['revision']
974
    takes_args = ['filename']
975
976
    def run(self, filename, revision=None):
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
977
        if revision is None:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
978
            raise BzrCommandError("bzr cat requires a revision number")
979
        elif len(revision) != 1:
980
            raise BzrCommandError("bzr cat --revision takes exactly one number")
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
981
        b = Branch.open_containing('.')
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
982
        tree = WorkingTree(b.base, b)
983
        b.print_file(tree.relpath(filename), revision[0].in_history(b).revno)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
984
985
986
class cmd_local_time_offset(Command):
987
    """Show the offset in seconds from GMT to local time."""
988
    hidden = True    
989
    def run(self):
990
        print bzrlib.osutils.local_time_offset()
991
992
993
994
class cmd_commit(Command):
995
    """Commit changes into a new revision.
996
    
997
    If no arguments are given, the entire tree is committed.
998
999
    If selected files are specified, only changes to those files are
1000
    committed.  If a directory is specified then the directory and everything 
1001
    within it is committed.
1002
1003
    A selected-file commit may fail in some cases where the committed
1004
    tree would be invalid, such as trying to commit a file in a
1005
    newly-added directory that is not itself committed.
1006
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1007
    # TODO: Run hooks on tree to-be-committed, and after commit.
1008
1009
    # TODO: Strict commit that fails if there are unknown or deleted files.
1010
    # TODO: Give better message for -s, --summary, used by tla people
1011
1012
    # XXX: verbose currently does nothing
1013
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1014
    takes_args = ['selected*']
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
1015
    takes_options = ['message', 'verbose', 
1016
                     Option('unchanged',
1017
                            help='commit even if nothing has changed'),
1018
                     Option('file', type=str, 
1019
                            argname='msgfile',
1020
                            help='file containing commit message'),
1185.16.43 by Martin Pool
- clean up handling of option objects
1021
                     ]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1022
    aliases = ['ci', 'checkin']
1023
1024
    def run(self, message=None, file=None, verbose=True, selected_list=None,
1025
            unchanged=False):
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
1026
        from bzrlib.errors import PointlessCommit, ConflictsInTree
1167 by Martin Pool
- split commit message editor functions out into own file
1027
        from bzrlib.msgeditor import edit_commit_message
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1028
        from bzrlib.status import show_status
1029
        from cStringIO import StringIO
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1030
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1031
        b = Branch.open_containing('.')
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
1032
        tree = WorkingTree(b.base, b)
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1033
        if selected_list:
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
1034
            selected_list = [tree.relpath(s) for s in selected_list]
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
1035
        if message is None and not file:
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1036
            catcher = StringIO()
1037
            show_status(b, specific_files=selected_list,
1038
                        to_file=catcher)
1039
            message = edit_commit_message(catcher.getvalue())
1393.3.2 by Jelmer Vernooij
Fix error message when an empty commit message was specified (when using an editor). Previously bzr warned that it wanted either --message or --file.
1040
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1041
            if message is None:
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1042
                raise BzrCommandError("please specify a commit message"
1043
                                      " with either --message or --file")
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1044
        elif message and file:
1045
            raise BzrCommandError("please specify either --message or --file")
1046
        
1047
        if file:
1048
            import codecs
1049
            message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
1050
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
1051
        if message == "":
1052
                raise BzrCommandError("empty commit message specified")
1053
            
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1054
        try:
1189 by Martin Pool
- BROKEN: partial support for commit into weave
1055
            b.commit(message,
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1056
                     specific_files=selected_list,
1057
                     allow_pointless=unchanged)
1058
        except PointlessCommit:
1059
            # FIXME: This should really happen before the file is read in;
1060
            # perhaps prepare the commit; get the message; then actually commit
1061
            raise BzrCommandError("no changes to commit",
1062
                                  ["use --unchanged to commit anyhow"])
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
1063
        except ConflictsInTree:
1064
            raise BzrCommandError("Conflicts detected in working tree.  "
1065
                'Use "bzr conflicts" to list, "bzr resolve FILE" to resolve.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1066
1067
1068
class cmd_check(Command):
1069
    """Validate consistency of branch history.
1070
1071
    This command checks various invariants about the branch storage to
1072
    detect data corruption or bzr bugs.
1073
    """
1074
    takes_args = ['dir?']
1449 by Robert Collins
teach check about ghosts
1075
    takes_options = ['verbose']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1076
1449 by Robert Collins
teach check about ghosts
1077
    def run(self, dir='.', verbose=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1078
        from bzrlib.check import check
1449 by Robert Collins
teach check about ghosts
1079
        check(Branch.open_containing(dir), verbose)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1080
1081
1082
class cmd_scan_cache(Command):
1083
    hidden = True
1084
    def run(self):
1085
        from bzrlib.hashcache import HashCache
1086
1087
        c = HashCache('.')
1088
        c.read()
1089
        c.scan()
1090
            
1091
        print '%6d stats' % c.stat_count
1092
        print '%6d in hashcache' % len(c._cache)
1093
        print '%6d files removed from cache' % c.removed_count
1094
        print '%6d hashes updated' % c.update_count
1095
        print '%6d files changed too recently to cache' % c.danger_count
1096
1097
        if c.needs_write:
1098
            c.write()
1099
            
1100
1101
1102
class cmd_upgrade(Command):
1103
    """Upgrade branch storage to current format.
1104
1105
    The check command or bzr developers may sometimes advise you to run
1106
    this command.
1377 by Martin Pool
- run conversion to weaves from the 'bzr upgrade' command
1107
1108
    This version of this command upgrades from the full-text storage
1109
    used by bzr 0.0.8 and earlier to the weave format (v5).
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1110
    """
1111
    takes_args = ['dir?']
1112
1113
    def run(self, dir='.'):
1114
        from bzrlib.upgrade import upgrade
1377 by Martin Pool
- run conversion to weaves from the 'bzr upgrade' command
1115
        upgrade(dir)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1116
1117
1118
class cmd_whoami(Command):
1119
    """Show bzr user id."""
1120
    takes_options = ['email']
1121
    
1122
    def run(self, email=False):
1371 by Martin Pool
- raise NotBranchError if format file can't be read
1123
        try:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1124
            b = bzrlib.branch.Branch.open_containing('.')
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1125
            config = bzrlib.config.BranchConfig(b)
1371 by Martin Pool
- raise NotBranchError if format file can't be read
1126
        except NotBranchError:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1127
            config = bzrlib.config.GlobalConfig()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1128
        
1129
        if email:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1130
            print config.user_email()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1131
        else:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1132
            print config.username()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1133
1134
1135
class cmd_selftest(Command):
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1136
    """Run internal test suite.
1137
    
1138
    This creates temporary test directories in the working directory,
1139
    but not existing data is affected.  These directories are deleted
1140
    if the tests pass, or left behind to help in debugging if they
1141
    fail.
1142
    
1143
    If arguments are given, they are regular expressions that say
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1144
    which tests should run.
1145
    """
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1146
    # TODO: --list should give a list of all available tests
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1147
    hidden = True
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
1148
    takes_args = ['testspecs*']
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1149
    takes_options = ['verbose', 
1150
                     Option('one', help='stop when one test fails'),
1151
                    ]
1152
1153
    def run(self, testspecs_list=None, verbose=False, one=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1154
        import bzrlib.ui
1155
        from bzrlib.selftest import selftest
1156
        # we don't want progress meters from the tests to go to the
1157
        # real output; and we don't want log messages cluttering up
1158
        # the real logs.
1159
        save_ui = bzrlib.ui.ui_factory
1160
        bzrlib.trace.info('running tests...')
1161
        try:
1162
            bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory()
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
1163
            if testspecs_list is not None:
1164
                pattern = '|'.join(testspecs_list)
1165
            else:
1166
                pattern = ".*"
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1167
            result = selftest(verbose=verbose, 
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1168
                              pattern=pattern,
1169
                              stop_on_failure=one)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1170
            if result:
1171
                bzrlib.trace.info('tests passed')
1172
            else:
1173
                bzrlib.trace.info('tests failed')
1174
            return int(not result)
1175
        finally:
1176
            bzrlib.ui.ui_factory = save_ui
1177
1178
1179
def show_version():
1180
    print "bzr (bazaar-ng) %s" % bzrlib.__version__
1181
    # is bzrlib itself in a branch?
1182
    bzrrev = bzrlib.get_bzr_revision()
1183
    if bzrrev:
1184
        print "  (bzr checkout, revision %d {%s})" % bzrrev
1185
    print bzrlib.__copyright__
1186
    print "http://bazaar-ng.org/"
1187
    print
1188
    print "bzr comes with ABSOLUTELY NO WARRANTY.  bzr is free software, and"
1189
    print "you may use, modify and redistribute it under the terms of the GNU"
1190
    print "General Public License version 2 or later."
1191
1192
1193
class cmd_version(Command):
1194
    """Show version of bzr."""
1195
    def run(self):
1196
        show_version()
1197
1198
class cmd_rocks(Command):
1199
    """Statement of optimism."""
1200
    hidden = True
1201
    def run(self):
1202
        print "it sure does!"
1203
1204
1205
class cmd_find_merge_base(Command):
1206
    """Find and print a base revision for merging two branches.
1207
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1208
    # TODO: Options to specify revisions on either side, as if
1209
    #       merging only part of the history.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1210
    takes_args = ['branch', 'other']
1211
    hidden = True
1212
    
1213
    def run(self, branch, other):
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1214
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1215
        
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1216
        branch1 = Branch.open_containing(branch)
1217
        branch2 = Branch.open_containing(other)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1218
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1219
        history_1 = branch1.revision_history()
1220
        history_2 = branch2.revision_history()
1221
1241 by Martin Pool
- rename last_patch to last_revision
1222
        last1 = branch1.last_revision()
1223
        last2 = branch2.last_revision()
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1224
1225
        source = MultipleRevisionSources(branch1, branch2)
1226
        
1227
        base_rev_id = common_ancestor(last1, last2, source)
1228
1229
        print 'merge base is revision %s' % base_rev_id
1230
        
1231
        return
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1232
1233
        if base_revno is None:
1234
            raise bzrlib.errors.UnrelatedBranches()
1235
1236
        print ' r%-6d in %s' % (base_revno, branch)
1237
1238
        other_revno = branch2.revision_id_to_revno(base_revid)
1239
        
1240
        print ' r%-6d in %s' % (other_revno, other)
1241
1242
1243
1244
class cmd_merge(Command):
1245
    """Perform a three-way merge.
1246
    
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1247
    The branch is the branch you will merge from.  By default, it will
1248
    merge the latest revision.  If you specify a revision, that
1249
    revision will be merged.  If you specify two revisions, the first
1250
    will be used as a BASE, and the second one as OTHER.  Revision
1251
    numbers are always relative to the specified branch.
1252
1253
    By default bzr will try to merge in all new work from the other
1254
    branch, automatically determining an appropriate base.  If this
1255
    fails, you may need to give an explicit base.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1256
    
1257
    Examples:
1258
1259
    To merge the latest revision from bzr.dev
1260
    bzr merge ../bzr.dev
1261
1262
    To merge changes up to and including revision 82 from bzr.dev
1263
    bzr merge -r 82 ../bzr.dev
1264
1265
    To merge the changes introduced by 82, without previous changes:
1266
    bzr merge -r 81..82 ../bzr.dev
1267
    
1268
    merge refuses to run if there are any uncommitted changes, unless
1269
    --force is given.
1270
    """
1271
    takes_args = ['branch?']
1272
    takes_options = ['revision', 'force', 'merge-type']
1273
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
1274
    def run(self, branch=None, revision=None, force=False, 
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1275
            merge_type=None):
1276
        from bzrlib.merge import merge
1277
        from bzrlib.merge_core import ApplyMerge3
1278
        if merge_type is None:
1279
            merge_type = ApplyMerge3
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
1280
        if branch is None:
1281
            branch = Branch.open_containing('.').get_parent()
1282
            if branch is None:
1283
                raise BzrCommandError("No merge location known or specified.")
1284
            else:
1285
                print "Using saved location: %s" % branch 
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1286
        if revision is None or len(revision) < 1:
1287
            base = [None, None]
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
1288
            other = [branch, -1]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1289
        else:
1290
            if len(revision) == 1:
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
1291
                base = [None, None]
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1292
                other = [branch, revision[0].in_history(branch).revno]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1293
            else:
1294
                assert len(revision) == 2
1295
                if None in revision:
1296
                    raise BzrCommandError(
1297
                        "Merge doesn't permit that revision specifier.")
1185.5.1 by John Arbash Meinel
Applying bad-merge revision patch.
1298
                b = Branch.open(branch)
1299
1300
                base = [branch, revision[0].in_history(b).revno]
1301
                other = [branch, revision[1].in_history(b).revno]
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1302
1303
        try:
1304
            merge(other, base, check_clean=(not force), merge_type=merge_type)
1305
        except bzrlib.errors.AmbiguousBase, e:
1173 by Martin Pool
- message typo
1306
            m = ("sorry, bzr can't determine the right merge base yet\n"
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1307
                 "candidates are:\n  "
1308
                 + "\n  ".join(e.bases)
1309
                 + "\n"
1310
                 "please specify an explicit base with -r,\n"
1311
                 "and (if you want) report this to the bzr developers\n")
1312
            log_error(m)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1313
1314
1315
class cmd_revert(Command):
1316
    """Reverse all changes since the last commit.
1317
1318
    Only versioned files are affected.  Specify filenames to revert only 
1319
    those files.  By default, any files that are changed will be backed up
1320
    first.  Backup files have a '~' appended to their name.
1321
    """
1322
    takes_options = ['revision', 'no-backup']
1323
    takes_args = ['file*']
1324
    aliases = ['merge-revert']
1325
1326
    def run(self, revision=None, no_backup=False, file_list=None):
1327
        from bzrlib.merge import merge
1328
        from bzrlib.commands import parse_spec
1329
1330
        if file_list is not None:
1331
            if len(file_list) == 0:
1332
                raise BzrCommandError("No files specified")
1333
        if revision is None:
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
1334
            revno = -1
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1335
        elif len(revision) != 1:
1336
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
1337
        else:
1338
            b = Branch.open_containing('.')
1339
            revno = revision[0].in_history(b).revno
1340
        merge(('.', revno), parse_spec('.'),
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1341
              check_clean=False,
1342
              ignore_zero=True,
1343
              backup_files=not no_backup,
1344
              file_list=file_list)
1345
        if not file_list:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1346
            Branch.open_containing('.').set_pending_merges([])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1347
1348
1349
class cmd_assert_fail(Command):
1350
    """Test reporting of assertion failures"""
1351
    hidden = True
1352
    def run(self):
1353
        assert False, "always fails"
1354
1355
1356
class cmd_help(Command):
1357
    """Show help on a command or other topic.
1358
1359
    For a list of all available commands, say 'bzr help commands'."""
1360
    takes_options = ['long']
1361
    takes_args = ['topic?']
1362
    aliases = ['?']
1363
    
1364
    def run(self, topic=None, long=False):
1365
        import help
1366
        if topic is None and long:
1367
            topic = "commands"
1368
        help.help(topic)
1369
1370
1371
class cmd_shell_complete(Command):
1372
    """Show appropriate completions for context.
1373
1374
    For a list of all available commands, say 'bzr shell-complete'."""
1375
    takes_args = ['context?']
1376
    aliases = ['s-c']
1377
    hidden = True
1378
    
1379
    def run(self, context=None):
1380
        import shellcomplete
1381
        shellcomplete.shellcomplete(context)
1382
1383
1228 by Martin Pool
- add fetch command as builtin
1384
class cmd_fetch(Command):
1385
    """Copy in history from another branch but don't merge it.
1386
1387
    This is an internal method used for pull and merge."""
1388
    hidden = True
1389
    takes_args = ['from_branch', 'to_branch']
1390
    def run(self, from_branch, to_branch):
1391
        from bzrlib.fetch import Fetcher
1392
        from bzrlib.branch import Branch
1393
        from_b = Branch(from_branch)
1394
        to_b = Branch(to_branch)
1395
        Fetcher(to_b, from_b)
1396
        
1397
1398
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1399
class cmd_missing(Command):
1400
    """What is missing in this branch relative to other branch.
1401
    """
1228 by Martin Pool
- add fetch command as builtin
1402
    # TODO: rewrite this in terms of ancestry so that it shows only
1403
    # unmerged things
1404
    
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1405
    takes_args = ['remote?']
1406
    aliases = ['mis', 'miss']
1407
    # We don't have to add quiet to the list, because 
1408
    # unknown options are parsed as booleans
1409
    takes_options = ['verbose', 'quiet']
1410
1411
    def run(self, remote=None, verbose=False, quiet=False):
1412
        from bzrlib.errors import BzrCommandError
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1413
        from bzrlib.missing import show_missing
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1414
1415
        if verbose and quiet:
1416
            raise BzrCommandError('Cannot pass both quiet and verbose')
1417
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1418
        b = Branch.open_containing('.')
1149 by Martin Pool
- make get_parent() be a method of Branch; add simple tests for it
1419
        parent = b.get_parent()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1420
        if remote is None:
1421
            if parent is None:
1422
                raise BzrCommandError("No missing location known or specified.")
1423
            else:
1424
                if not quiet:
1425
                    print "Using last location: %s" % parent
1426
                remote = parent
1427
        elif parent is None:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1428
            # We only update parent if it did not exist, missing
1429
            # should not change the parent
974.1.79 by Aaron Bentley
Fixed issues with pull not having a default location after branch
1430
            b.set_parent(remote)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1431
        br_remote = Branch.open_containing(remote)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1432
        return show_missing(b, br_remote, verbose=verbose, quiet=quiet)
1433
1434
1435
class cmd_plugins(Command):
1436
    """List plugins"""
1437
    hidden = True
1438
    def run(self):
1439
        import bzrlib.plugin
1440
        from inspect import getdoc
1441
        for plugin in bzrlib.plugin.all_plugins:
1442
            if hasattr(plugin, '__path__'):
1443
                print plugin.__path__[0]
1444
            elif hasattr(plugin, '__file__'):
1445
                print plugin.__file__
1446
            else:
1447
                print `plugin`
1448
                
1449
            d = getdoc(plugin)
1450
            if d:
1451
                print '\t', d.split('\n')[0]
1452
1453
1185.16.24 by Martin Pool
- add and test 'testament' builtin command
1454
class cmd_testament(Command):
1455
    """Show testament (signing-form) of a revision."""
1456
    takes_options = ['revision', 'long']
1457
    takes_args = ['branch?']
1458
    def run(self, branch='.', revision=None, long=False):
1459
        from bzrlib.testament import Testament
1460
        b = Branch.open_containing(branch)
1461
        b.lock_read()
1462
        try:
1463
            if revision is None:
1464
                rev_id = b.last_revision()
1465
            else:
1466
                rev_id = revision[0].in_history(b).rev_id
1467
            t = Testament.from_revision(b, rev_id)
1468
            if long:
1469
                sys.stdout.writelines(t.as_text_lines())
1470
            else:
1471
                sys.stdout.write(t.as_short_text())
1472
        finally:
1473
            b.unlock()
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1474
1475
1476
class cmd_annotate(Command):
1477
    """Show the origin of each line in a file.
1478
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1479
    This prints out the given file with an annotation on the left side
1480
    indicating which revision, author and date introduced the change.
1481
1482
    If the origin is the same for a run of consecutive lines, it is 
1483
    shown only at the top, unless the --all option is given.
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1484
    """
1485
    # TODO: annotate directories; showing when each file was last changed
1486
    # TODO: annotate a previous version of a file
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1487
    # TODO: if the working copy is modified, show annotations on that 
1488
    #       with new uncommitted lines marked
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1489
    aliases = ['blame', 'praise']
1490
    takes_args = ['filename']
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1491
    takes_options = [Option('all', help='show annotations on all lines'),
1492
                     Option('long', help='show date in annotations'),
1493
                     ]
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1494
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1495
    def run(self, filename, all=False, long=False):
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1496
        from bzrlib.annotate import annotate_file
1497
        b = Branch.open_containing(filename)
1498
        b.lock_read()
1499
        try:
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
1500
            tree = WorkingTree(b.base, b)
1501
            rp = tree.relpath(filename)
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1502
            tree = b.revision_tree(b.last_revision())
1503
            file_id = tree.inventory.path2id(rp)
1504
            file_version = tree.inventory[file_id].revision
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1505
            annotate_file(b, file_version, file_id, long, all, sys.stdout)
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1506
        finally:
1507
            b.unlock()
1185.16.33 by Martin Pool
- move 'conflict' and 'resolved' from shipped plugin to regular builtins
1508
1509
# these get imported and then picked up by the scan for cmd_*
1510
# TODO: Some more consistent way to split command definitions across files;
1511
# we do need to load at least some information about them to know of 
1512
# aliases.
1513
from bzrlib.conflicts import cmd_resolve, cmd_conflicts