/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
1185.33.90 by Martin Pool
[merge] add --dry-run option (mpe)
17
"""builtin bzr commands"""
18
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
19
# DO NOT change this to cStringIO - it results in control files 
20
# written as UCS4
21
# FIXIT! (Only deal with byte streams OR unicode at any one layer.)
22
# RBC 20051018
1185.33.90 by Martin Pool
[merge] add --dry-run option (mpe)
23
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
24
from StringIO import StringIO
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
25
import sys
26
import os
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
27
import codecs
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
28
29
import bzrlib
1460 by Robert Collins
merge from martin.
30
from bzrlib import BZRDIR
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
31
from bzrlib.commands import Command, display_command
1460 by Robert Collins
merge from martin.
32
from bzrlib.branch import Branch
1185.35.4 by Aaron Bentley
Implemented remerge
33
from bzrlib.revision import common_ancestor
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
34
import bzrlib.errors as errors
1185.35.4 by Aaron Bentley
Implemented remerge
35
from bzrlib.errors import (BzrError, BzrCheckError, BzrCommandError, 
1185.35.13 by Aaron Bentley
Merged Martin
36
                           NotBranchError, DivergedBranches, NotConflicted,
1508.1.15 by Robert Collins
Merge from mpool.
37
                           NoSuchFile, NoWorkingTree, FileInWrongBranch)
1185.16.43 by Martin Pool
- clean up handling of option objects
38
from bzrlib.option import Option
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
39
from bzrlib.revisionspec import RevisionSpec
1460 by Robert Collins
merge from martin.
40
import bzrlib.trace
1185.33.42 by Martin Pool
[patch] make --quiet a global option (robey)
41
from bzrlib.trace import mutter, note, log_error, warning, is_quiet
1457.1.4 by Robert Collins
Branch.relpath has been moved to WorkingTree.relpath.
42
from bzrlib.workingtree import WorkingTree
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
43
from bzrlib.log import show_one_log
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
44
45
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
46
def tree_files(file_list, default_branch=u'.'):
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
47
    try:
1508.1.15 by Robert Collins
Merge from mpool.
48
        return internal_tree_files(file_list, default_branch)
1185.35.32 by Aaron Bentley
Fixed handling of files in mixed branches
49
    except FileInWrongBranch, e:
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
50
        raise BzrCommandError("%s is not in the same branch as %s" %
1185.35.32 by Aaron Bentley
Fixed handling of files in mixed branches
51
                             (e.path, file_list[0]))
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
52
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
53
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
54
def internal_tree_files(file_list, default_branch=u'.'):
1185.12.101 by Aaron Bentley
Made commit take branch from first argument, if supplied.
55
    """\
56
    Return a branch and list of branch-relative paths.
57
    If supplied file_list is empty or None, the branch default will be used,
58
    and returned file_list will match the original.
59
    """
60
    if file_list is None or len(file_list) == 0:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
61
        return WorkingTree.open_containing(default_branch)[0], file_list
62
    tree = WorkingTree.open_containing(file_list[0])[0]
1185.12.101 by Aaron Bentley
Made commit take branch from first argument, if supplied.
63
    new_list = []
64
    for filename in file_list:
1185.35.32 by Aaron Bentley
Fixed handling of files in mixed branches
65
        try:
66
            new_list.append(tree.relpath(filename))
1185.31.45 by John Arbash Meinel
Refactoring Exceptions found some places where the wrong exception was caught.
67
        except errors.PathNotChild:
1508.1.15 by Robert Collins
Merge from mpool.
68
            raise FileInWrongBranch(tree.branch, filename)
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
69
    return tree, new_list
1185.12.101 by Aaron Bentley
Made commit take branch from first argument, if supplied.
70
71
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
72
def _get_encoded_stdout_file():
73
    """Return a file linked to stdout, which has proper encoding."""
74
    output_encoding = getattr(sys.stdout, 'encoding', None)
75
    if not output_encoding:
76
        output_encoding = bzrlib.user_encoding
77
        mutter('encoding log as bzrlib.user_encoding %r', output_encoding)
78
    else:
79
        mutter('encoding log as sys.stdout encoding %r', output_encoding)
80
81
    # use 'replace' so that we don't abort if trying to write out
82
    # in e.g. the default C locale.
83
    return codecs.getwriter(output_encoding)(sys.stdout, errors='replace')
84
85
86
1185.16.112 by mbp at sourcefrog
todo
87
# TODO: Make sure no commands unconditionally use the working directory as a
88
# branch.  If a filename argument is used, the first of them should be used to
89
# specify the branch.  (Perhaps this can be factored out into some kind of
90
# Argument class, representing a file in a branch, where the first occurrence
91
# opens the branch?)
92
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
93
class cmd_status(Command):
94
    """Display status summary.
95
96
    This reports on versioned and unknown files, reporting them
97
    grouped by state.  Possible states are:
98
99
    added
100
        Versioned in the working copy but not in the previous revision.
101
102
    removed
103
        Versioned in the previous revision but removed or deleted
104
        in the working copy.
105
106
    renamed
107
        Path of this file changed from the previous revision;
108
        the text may also have changed.  This includes files whose
109
        parent directory was renamed.
110
111
    modified
112
        Text has changed since the previous revision.
113
114
    unchanged
115
        Nothing about this file has changed since the previous revision.
116
        Only shown with --all.
117
118
    unknown
119
        Not versioned and not matching an ignore pattern.
120
121
    To see ignored files use 'bzr ignored'.  For details in the
122
    changes to file texts, use 'bzr diff'.
123
124
    If no arguments are specified, the status of the entire working
125
    directory is shown.  Otherwise, only the status of the specified
126
    files or directories is reported.  If a directory is given, status
127
    is reported for everything inside that directory.
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
128
129
    If a revision argument is given, the status is calculated against
130
    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
131
    """
1185.16.76 by Martin Pool
doc
132
    
133
    # TODO: --no-recurse, --recurse options
134
    
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
135
    takes_args = ['file*']
1185.34.4 by Jelmer Vernooij
Support -r option to bzr status. The backend code already handled
136
    takes_options = ['all', 'show-ids', 'revision']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
137
    aliases = ['st', 'stat']
138
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
139
    @display_command
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
140
    def run(self, all=False, show_ids=False, file_list=None, revision=None):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
141
        tree, file_list = tree_files(file_list)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
142
            
143
        from bzrlib.status import show_status
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
144
        show_status(tree.branch, show_unchanged=all, show_ids=show_ids,
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
145
                    specific_files=file_list, revision=revision)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
146
147
148
class cmd_cat_revision(Command):
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
149
    """Write out metadata for a revision.
150
    
151
    The revision to print can either be specified by a specific
152
    revision identifier, or you can use --revision.
153
    """
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
154
155
    hidden = True
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
156
    takes_args = ['revision_id?']
157
    takes_options = ['revision']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
158
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
159
    @display_command
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
160
    def run(self, revision_id=None, revision=None):
161
162
        if revision_id is not None and revision is not None:
163
            raise BzrCommandError('You can only supply one of revision_id or --revision')
164
        if revision_id is None and revision is None:
165
            raise BzrCommandError('You must supply either --revision or a revision_id')
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
166
        b = WorkingTree.open_containing(u'.')[0].branch
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
167
        if revision_id is not None:
1185.42.5 by Jelmer Vernooij
Make get_revision_xml_file() private
168
            sys.stdout.write(b.get_revision_xml(revision_id))
1185.5.3 by John Arbash Meinel
cat-revision allows --revision for easier investigation.
169
        elif revision is not None:
170
            for rev in revision:
171
                if rev is None:
172
                    raise BzrCommandError('You cannot specify a NULL revision.')
173
                revno, rev_id = rev.in_history(b)
1185.42.5 by Jelmer Vernooij
Make get_revision_xml_file() private
174
                sys.stdout.write(b.get_revision_xml(rev_id))
1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
175
    
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
176
177
class cmd_revno(Command):
178
    """Show current revision number.
179
180
    This is equal to the number of revisions on this branch."""
1185.50.16 by John Arbash Meinel
[patch] Michael Ellerman: 'Trivial patch to allow revno to take a location'
181
    takes_args = ['location?']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
182
    @display_command
1185.50.16 by John Arbash Meinel
[patch] Michael Ellerman: 'Trivial patch to allow revno to take a location'
183
    def run(self, location=u'.'):
184
        print Branch.open_containing(location)[0].revno()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
185
1182 by Martin Pool
- more disentangling of xml storage format from objects
186
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
187
class cmd_revision_info(Command):
188
    """Show revision number and revision id for a given revision identifier.
189
    """
190
    hidden = True
191
    takes_args = ['revision_info*']
192
    takes_options = ['revision']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
193
    @display_command
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
194
    def run(self, revision=None, revision_info_list=[]):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
195
196
        revs = []
197
        if revision is not None:
198
            revs.extend(revision)
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
199
        if revision_info_list is not None:
200
            for rev in revision_info_list:
201
                revs.append(RevisionSpec(rev))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
202
        if len(revs) == 0:
203
            raise BzrCommandError('You must supply a revision identifier')
204
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
205
        b = WorkingTree.open_containing(u'.')[0].branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
206
207
        for rev in revs:
1185.5.4 by John Arbash Meinel
Updated bzr revision-info, created tests.
208
            revinfo = rev.in_history(b)
209
            if revinfo.revno is None:
210
                print '     %s' % revinfo.rev_id
211
            else:
212
                print '%4d %s' % (revinfo.revno, revinfo.rev_id)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
213
214
    
215
class cmd_add(Command):
216
    """Add specified files or directories.
217
218
    In non-recursive mode, all the named items are added, regardless
219
    of whether they were previously ignored.  A warning is given if
220
    any of the named files are already versioned.
221
222
    In recursive mode (the default), files are treated the same way
223
    but the behaviour for directories is different.  Directories that
224
    are already versioned do not give a warning.  All directories,
225
    whether already versioned or not, are searched for files or
226
    subdirectories that are neither versioned or ignored, and these
227
    are added.  This search proceeds recursively into versioned
228
    directories.  If no names are given '.' is assumed.
229
230
    Therefore simply saying 'bzr add' will version all files that
231
    are currently unknown.
232
1185.3.3 by Martin Pool
- patch from mpe to automatically add parent directories
233
    Adding a file whose parent directory is not versioned will
234
    implicitly add the parent, and so on up to the root. This means
235
    you should never need to explictly add a directory, they'll just
236
    get added when you add a file in the directory.
1185.33.90 by Martin Pool
[merge] add --dry-run option (mpe)
237
238
    --dry-run will show which files would be added, but not actually 
239
    add them.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
240
    """
241
    takes_args = ['file*']
1185.46.9 by Aaron Bentley
Added verbose option to bzr add, to list all ignored files.
242
    takes_options = ['no-recurse', 'dry-run', 'verbose']
1185.53.1 by Michael Ellerman
Add support for bzr add --dry-run
243
1185.46.9 by Aaron Bentley
Added verbose option to bzr add, to list all ignored files.
244
    def run(self, file_list, no_recurse=False, dry_run=False, verbose=False):
1185.53.1 by Michael Ellerman
Add support for bzr add --dry-run
245
        import bzrlib.add
246
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
247
        to_file = _get_encoded_stdout_file()
248
        action = bzrlib.add.AddAction(to_file=to_file,
249
            should_add=(not dry_run), should_print=(not is_quiet()))
1185.53.1 by Michael Ellerman
Add support for bzr add --dry-run
250
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
251
        added, ignored = bzrlib.add.smart_add(file_list, not no_recurse, 
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
252
                                              action=action)
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
253
        if len(ignored) > 0:
254
            for glob in sorted(ignored.keys()):
255
                match_len = len(ignored[glob])
1185.46.9 by Aaron Bentley
Added verbose option to bzr add, to list all ignored files.
256
                if verbose:
257
                    for path in ignored[glob]:
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
258
                        to_file.write("ignored %s matching \"%s\"\n" 
259
                                      % (path, glob))
1185.46.9 by Aaron Bentley
Added verbose option to bzr add, to list all ignored files.
260
                else:
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
261
                    to_file.write("ignored %d file(s) matching \"%s\"\n"
262
                                  % (match_len, glob))
263
            to_file.write("If you wish to add some of these files,"
264
                          " please add them by name.\n")
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
265
266
267
class cmd_mkdir(Command):
268
    """Create a new versioned directory.
269
270
    This is equivalent to creating the directory and then adding it.
271
    """
272
    takes_args = ['dir+']
273
274
    def run(self, dir_list):
275
        for d in dir_list:
276
            os.mkdir(d)
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
277
            wt, dd = WorkingTree.open_containing(d)
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
278
            wt.add([dd])
1185.31.9 by John Arbash Meinel
Changed to printing the full path, rather than just the relative portion.
279
            print 'added', d
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
280
281
282
class cmd_relpath(Command):
283
    """Show path of a file relative to root"""
284
    takes_args = ['filename']
285
    hidden = True
286
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
287
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
288
    def run(self, filename):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
289
        tree, relpath = WorkingTree.open_containing(filename)
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
290
        print relpath
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
291
292
293
class cmd_inventory(Command):
1185.33.33 by Martin Pool
[patch] add 'bzr inventory --kind directory'; remove 'bzr directories'
294
    """Show inventory of the current working copy or a revision.
295
296
    It is possible to limit the output to a particular entry
297
    type using the --kind option.  For example; --kind file.
298
    """
299
    takes_options = ['revision', 'show-ids', 'kind']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
300
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
301
    @display_command
1185.33.33 by Martin Pool
[patch] add 'bzr inventory --kind directory'; remove 'bzr directories'
302
    def run(self, revision=None, show_ids=False, kind=None):
303
        if kind and kind not in ['file', 'directory', 'symlink']:
304
            raise BzrCommandError('invalid kind specified')
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
305
        tree = WorkingTree.open_containing(u'.')[0]
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
306
        if revision is None:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
307
            inv = tree.read_working_inventory()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
308
        else:
309
            if len(revision) > 1:
310
                raise BzrCommandError('bzr inventory --revision takes'
311
                    ' exactly one revision identifier')
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
312
            inv = tree.branch.get_revision_inventory(
313
                revision[0].in_history(tree.branch).rev_id)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
314
315
        for path, entry in inv.entries():
1185.33.33 by Martin Pool
[patch] add 'bzr inventory --kind directory'; remove 'bzr directories'
316
            if kind and kind != entry.kind:
317
                continue
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
318
            if show_ids:
319
                print '%-50s %s' % (path, entry.file_id)
320
            else:
321
                print path
322
323
324
class cmd_move(Command):
325
    """Move files to a different directory.
326
327
    examples:
328
        bzr move *.txt doc
329
330
    The destination must be a versioned directory in the same branch.
331
    """
332
    takes_args = ['source$', 'dest']
333
    def run(self, source_list, dest):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
334
        tree, source_list = tree_files(source_list)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
335
        # TODO: glob expansion on windows?
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
336
        tree.move(source_list, tree.relpath(dest))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
337
338
339
class cmd_rename(Command):
340
    """Change the name of an entry.
341
342
    examples:
343
      bzr rename frob.c frobber.c
344
      bzr rename src/frob.c lib/frob.c
345
346
    It is an error if the destination name exists.
347
348
    See also the 'move' command, which moves files into a different
349
    directory without changing their name.
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
350
    """
351
    # TODO: Some way to rename multiple files without invoking 
352
    # bzr for each one?"""
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
353
    takes_args = ['from_name', 'to_name']
354
    
355
    def run(self, from_name, to_name):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
356
        tree, (from_name, to_name) = tree_files((from_name, to_name))
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
357
        tree.rename_one(from_name, to_name)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
358
359
360
class cmd_mv(Command):
361
    """Move or rename a file.
362
363
    usage:
364
        bzr mv OLDNAME NEWNAME
365
        bzr mv SOURCE... DESTINATION
366
367
    If the last argument is a versioned directory, all the other names
368
    are moved into it.  Otherwise, there must be exactly two arguments
369
    and the file is changed to a new name, which must not already exist.
370
371
    Files cannot be moved between branches.
372
    """
373
    takes_args = ['names*']
374
    def run(self, names_list):
375
        if len(names_list) < 2:
376
            raise BzrCommandError("missing file argument")
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
377
        tree, rel_names = tree_files(names_list)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
378
        
379
        if os.path.isdir(names_list[-1]):
380
            # move into existing directory
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
381
            for pair in tree.move(rel_names[:-1], rel_names[-1]):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
382
                print "%s => %s" % pair
383
        else:
384
            if len(names_list) != 2:
385
                raise BzrCommandError('to mv multiple files the destination '
386
                                      'must be a versioned directory')
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
387
            tree.rename_one(rel_names[0], rel_names[1])
1185.1.8 by Robert Collins
David Clymers patch to use rename rather than mv for two argument non-directory target bzr mv calls.
388
            print "%s => %s" % (rel_names[0], rel_names[1])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
389
            
390
    
391
class cmd_pull(Command):
392
    """Pull any changes from another branch into the current one.
393
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
394
    If there is no default location set, the first pull will set it.  After
395
    that, you can omit the location to use the default.  To change the
396
    default, use --remember.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
397
398
    This command only works on branches that have not diverged.  Branches are
399
    considered diverged if both branches have had commits without first
400
    pulling from the other.
401
402
    If branches have diverged, you can use 'bzr merge' to pull the text changes
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
403
    from one into the other.  Once one branch has merged, the other should
404
    be able to pull it again.
405
406
    If you want to forget your local changes and just update your branch to
407
    match the remote one, use --overwrite.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
408
    """
1185.32.4 by John Arbash Meinel
[merge] up-to-date against bzr.dev
409
    takes_options = ['remember', 'overwrite', 'verbose']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
410
    takes_args = ['location?']
411
1185.32.4 by John Arbash Meinel
[merge] up-to-date against bzr.dev
412
    def run(self, location=None, remember=False, overwrite=False, verbose=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
413
        from bzrlib.merge import merge
414
        from shutil import rmtree
415
        import errno
1185.33.45 by Martin Pool
[merge] refactoring of branch vs working tree, etc (robertc)
416
        # FIXME: too much stuff is in the command class        
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
417
        tree_to = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
418
        stored_loc = tree_to.branch.get_parent()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
419
        if location is None:
420
            if stored_loc is None:
421
                raise BzrCommandError("No pull location known or specified.")
422
            else:
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
423
                print "Using saved location: %s" % stored_loc
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
424
                location = stored_loc
1185.56.1 by Michael Ellerman
Simplify handling of DivergedBranches in cmd_pull()
425
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
426
        br_from = Branch.open(location)
1185.33.45 by Martin Pool
[merge] refactoring of branch vs working tree, etc (robertc)
427
        br_to = tree_to.branch
1185.56.1 by Michael Ellerman
Simplify handling of DivergedBranches in cmd_pull()
428
429
        old_rh = br_to.revision_history()
430
        count = tree_to.pull(br_from, overwrite)
431
1494 by Robert Collins
Set push and pull locations only upon success.
432
        if br_to.get_parent() is None or remember:
433
            br_to.set_parent(location)
1185.40.2 by Robey Pointer
when doing a 'pull', display the number of revisions pulled; on 'commit', display the current (new) revision number
434
        note('%d revision(s) pulled.' % (count,))
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
435
1185.31.5 by John Arbash Meinel
Merged pull --verbose changes
436
        if verbose:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
437
            new_rh = tree_to.branch.revision_history()
1185.31.5 by John Arbash Meinel
Merged pull --verbose changes
438
            if old_rh != new_rh:
439
                # Something changed
440
                from bzrlib.log import show_changed_revisions
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
441
                show_changed_revisions(tree_to.branch, old_rh, new_rh)
1185.31.5 by John Arbash Meinel
Merged pull --verbose changes
442
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
443
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
444
class cmd_push(Command):
445
    """Push this branch into another branch.
446
    
447
    The remote branch will not have its working tree populated because this
448
    is both expensive, and may not be supported on the remote file system.
449
    
450
    Some smart servers or protocols *may* put the working tree in place.
451
452
    If there is no default push location set, the first push will set it.
453
    After that, you can omit the location to use the default.  To change the
454
    default, use --remember.
455
456
    This command only works on branches that have not diverged.  Branches are
457
    considered diverged if the branch being pushed to is not an older version
458
    of this branch.
459
460
    If branches have diverged, you can use 'bzr push --overwrite' to replace
461
    the other branch completely.
462
    
463
    If you want to ensure you have the different changes in the other branch,
464
    do a merge (see bzr help merge) from the other branch, and commit that
465
    before doing a 'push --overwrite'.
466
    """
1495 by Robert Collins
Add a --create-prefix to the new push command.
467
    takes_options = ['remember', 'overwrite', 
468
                     Option('create-prefix', 
469
                            help='Create the path leading up to the branch '
470
                                 'if it does not already exist')]
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
471
    takes_args = ['location?']
472
1495 by Robert Collins
Add a --create-prefix to the new push command.
473
    def run(self, location=None, remember=False, overwrite=False,
1185.31.5 by John Arbash Meinel
Merged pull --verbose changes
474
            create_prefix=False, verbose=False):
1185.33.45 by Martin Pool
[merge] refactoring of branch vs working tree, etc (robertc)
475
        # FIXME: Way too big!  Put this into a function called from the
476
        # command.
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
477
        import errno
478
        from shutil import rmtree
479
        from bzrlib.transport import get_transport
480
        
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
481
        tree_from = WorkingTree.open_containing(u'.')[0]
1185.33.45 by Martin Pool
[merge] refactoring of branch vs working tree, etc (robertc)
482
        br_from = tree_from.branch
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
483
        stored_loc = tree_from.branch.get_push_location()
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
484
        if location is None:
485
            if stored_loc is None:
486
                raise BzrCommandError("No push location known or specified.")
487
            else:
488
                print "Using saved location: %s" % stored_loc
489
                location = stored_loc
490
        try:
491
            br_to = Branch.open(location)
492
        except NotBranchError:
493
            # create a branch.
494
            transport = get_transport(location).clone('..')
1495 by Robert Collins
Add a --create-prefix to the new push command.
495
            if not create_prefix:
496
                try:
497
                    transport.mkdir(transport.relpath(location))
498
                except NoSuchFile:
499
                    raise BzrCommandError("Parent directory of %s "
500
                                          "does not exist." % location)
501
            else:
502
                current = transport.base
503
                needed = [(transport, transport.relpath(location))]
504
                while needed:
505
                    try:
506
                        transport, relpath = needed[-1]
507
                        transport.mkdir(relpath)
508
                        needed.pop()
509
                    except NoSuchFile:
510
                        new_transport = transport.clone('..')
511
                        needed.append((new_transport,
512
                                       new_transport.relpath(transport.base)))
513
                        if new_transport.base == transport.base:
514
                            raise BzrCommandError("Could not creeate "
515
                                                  "path prefix.")
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
516
            br_to = Branch.initialize(location)
1185.49.26 by John Arbash Meinel
Adding tests for remote sftp branches without working trees, plus a bugfix to allow push to still work with a warning.
517
        old_rh = br_to.revision_history()
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
518
        try:
1185.49.26 by John Arbash Meinel
Adding tests for remote sftp branches without working trees, plus a bugfix to allow push to still work with a warning.
519
            try:
520
                tree_to = br_to.working_tree()
521
            except NoWorkingTree:
522
                # TODO: This should be updated for branches which don't have a
523
                # working tree, as opposed to ones where we just couldn't 
524
                # update the tree.
525
                warning('Unable to update the working tree of: %s' % (br_to.base,))
526
                count = br_to.pull(br_from, overwrite)
527
            else:
528
                count = tree_to.pull(br_from, overwrite)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
529
        except DivergedBranches:
530
            raise BzrCommandError("These branches have diverged."
531
                                  "  Try a merge then push with overwrite.")
1494 by Robert Collins
Set push and pull locations only upon success.
532
        if br_from.get_push_location() is None or remember:
533
            br_from.set_push_location(location)
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
534
        note('%d revision(s) pushed.' % (count,))
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
535
1185.31.5 by John Arbash Meinel
Merged pull --verbose changes
536
        if verbose:
537
            new_rh = br_to.revision_history()
538
            if old_rh != new_rh:
539
                # Something changed
540
                from bzrlib.log import show_changed_revisions
541
                show_changed_revisions(br_to, old_rh, new_rh)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
542
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
543
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
544
class cmd_branch(Command):
545
    """Create a new copy of a branch.
546
547
    If the TO_LOCATION is omitted, the last component of the FROM_LOCATION will
548
    be used.  In other words, "branch ../foo/bar" will attempt to create ./bar.
549
550
    To retrieve the branch as of a particular revision, supply the --revision
551
    parameter, as in "branch foo/bar -r 5".
1185.10.2 by Aaron Bentley
Updated help message
552
553
    --basis is to speed up branching from remote branches.  When specified, it
554
    copies all the file-contents, inventory and revision data from the basis
555
    branch before copying anything from the remote branch.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
556
    """
557
    takes_args = ['from_location', 'to_location?']
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
558
    takes_options = ['revision', 'basis']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
559
    aliases = ['get', 'clone']
560
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
561
    def run(self, from_location, to_location=None, revision=None, basis=None):
1393.1.5 by Martin Pool
- move copy_branch into bzrlib.clone
562
        from bzrlib.clone import copy_branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
563
        import errno
564
        from shutil import rmtree
1185.17.3 by Martin Pool
[pick] larger read lock scope for branch command
565
        if revision is None:
566
            revision = [None]
567
        elif len(revision) > 1:
568
            raise BzrCommandError(
569
                'bzr branch --revision takes exactly 1 revision value')
570
        try:
571
            br_from = Branch.open(from_location)
572
        except OSError, e:
573
            if e.errno == errno.ENOENT:
574
                raise BzrCommandError('Source location "%s" does not'
575
                                      ' exist.' % to_location)
576
            else:
577
                raise
578
        br_from.lock_read()
579
        try:
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
580
            if basis is not None:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
581
                basis_branch = WorkingTree.open_containing(basis)[0].branch
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
582
            else:
583
                basis_branch = None
1185.8.4 by Aaron Bentley
Fixed branch -r
584
            if len(revision) == 1 and revision[0] is not None:
1390 by Robert Collins
pair programming worx... merge integration and weave
585
                revision_id = revision[0].in_history(br_from)[1]
1185.8.4 by Aaron Bentley
Fixed branch -r
586
            else:
1390 by Robert Collins
pair programming worx... merge integration and weave
587
                revision_id = None
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
588
            if to_location is None:
589
                to_location = os.path.basename(from_location.rstrip("/\\"))
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
590
                name = None
591
            else:
592
                name = os.path.basename(to_location) + '\n'
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
593
            try:
594
                os.mkdir(to_location)
595
            except OSError, e:
596
                if e.errno == errno.EEXIST:
597
                    raise BzrCommandError('Target directory "%s" already'
598
                                          ' exists.' % to_location)
599
                if e.errno == errno.ENOENT:
600
                    raise BzrCommandError('Parent of "%s" does not exist.' %
601
                                          to_location)
602
                else:
603
                    raise
604
            try:
1391 by Robert Collins
merge from integration
605
                copy_branch(br_from, to_location, revision_id, basis_branch)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
606
            except bzrlib.errors.NoSuchRevision:
607
                rmtree(to_location)
1466 by Robert Collins
revision may be None in cmd_branch, do not treat as an int.
608
                msg = "The branch %s has no revision %s." % (from_location, revision[0])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
609
                raise BzrCommandError(msg)
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
610
            except bzrlib.errors.UnlistableBranch:
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
611
                rmtree(to_location)
1185.10.1 by Aaron Bentley
Added --basis option to bzr branch
612
                msg = "The branch %s cannot be used as a --basis"
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
613
                raise BzrCommandError(msg)
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
614
            branch = Branch.open(to_location)
1442.1.71 by Robert Collins
'bzr branch' sets the branch-name,
615
            if name:
616
                name = StringIO(name)
617
                branch.put_controlfile('branch-name', name)
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
618
            note('Branched %d revision(s).' % branch.revno())
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
619
        finally:
1185.17.3 by Martin Pool
[pick] larger read lock scope for branch command
620
            br_from.unlock()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
621
622
623
class cmd_renames(Command):
624
    """Show list of renamed files.
625
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
626
    # TODO: Option to show renames between two historical versions.
627
628
    # TODO: Only show renames under dir, rather than in the whole branch.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
629
    takes_args = ['dir?']
630
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
631
    @display_command
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
632
    def run(self, dir=u'.'):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
633
        tree = WorkingTree.open_containing(dir)[0]
634
        old_inv = tree.branch.basis_tree().inventory
635
        new_inv = tree.read_working_inventory()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
636
637
        renames = list(bzrlib.tree.find_renames(old_inv, new_inv))
638
        renames.sort()
639
        for old_name, new_name in renames:
640
            print "%s => %s" % (old_name, new_name)        
641
642
643
class cmd_info(Command):
644
    """Show statistical information about a branch."""
645
    takes_args = ['branch?']
646
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
647
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
648
    def run(self, branch=None):
649
        import info
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
650
        b = WorkingTree.open_containing(branch)[0].branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
651
        info.show_info(b)
652
653
654
class cmd_remove(Command):
655
    """Make a file unversioned.
656
657
    This makes bzr stop tracking changes to a versioned file.  It does
658
    not delete the working copy.
659
    """
660
    takes_args = ['file+']
661
    takes_options = ['verbose']
1424 by Robert Collins
add rm alias to remove
662
    aliases = ['rm']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
663
    
664
    def run(self, file_list, verbose=False):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
665
        tree, file_list = tree_files(file_list)
1185.12.105 by Aaron Bentley
Substituted branch_files for equivalent code
666
        tree.remove(file_list, verbose=verbose)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
667
668
669
class cmd_file_id(Command):
670
    """Print file_id of a particular file or directory.
671
672
    The file_id is assigned when the file is first added and remains the
673
    same through all revisions where the file exists, even when it is
674
    moved or renamed.
675
    """
676
    hidden = True
677
    takes_args = ['filename']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
678
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
679
    def run(self, filename):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
680
        tree, relpath = WorkingTree.open_containing(filename)
681
        i = tree.inventory.path2id(relpath)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
682
        if i == None:
683
            raise BzrError("%r is not a versioned file" % filename)
684
        else:
685
            print i
686
687
688
class cmd_file_path(Command):
689
    """Print path of file_ids to a file or directory.
690
691
    This prints one line for each directory down to the target,
692
    starting at the branch root."""
693
    hidden = True
694
    takes_args = ['filename']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
695
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
696
    def run(self, filename):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
697
        tree, relpath = WorkingTree.open_containing(filename)
698
        inv = tree.inventory
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
699
        fid = inv.path2id(relpath)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
700
        if fid == None:
701
            raise BzrError("%r is not a versioned file" % filename)
702
        for fip in inv.get_idpath(fid):
703
            print fip
704
705
706
class cmd_revision_history(Command):
707
    """Display list of revision ids on this branch."""
708
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
709
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
710
    def run(self):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
711
        branch = WorkingTree.open_containing(u'.')[0].branch
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
712
        for patchid in branch.revision_history():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
713
            print patchid
714
715
1225 by Martin Pool
- branch now tracks ancestry - all merged revisions
716
class cmd_ancestry(Command):
717
    """List all revisions merged into this branch."""
718
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
719
    @display_command
1225 by Martin Pool
- branch now tracks ancestry - all merged revisions
720
    def run(self):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
721
        tree = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
722
        b = tree.branch
723
        # FIXME. should be tree.last_revision
1241 by Martin Pool
- rename last_patch to last_revision
724
        for revision_id in b.get_ancestry(b.last_revision()):
1225 by Martin Pool
- branch now tracks ancestry - all merged revisions
725
            print revision_id
726
727
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
728
class cmd_init(Command):
729
    """Make a directory into a versioned branch.
730
731
    Use this to create an empty branch, or before importing an
732
    existing project.
733
734
    Recipe for importing a tree of files:
735
        cd ~/project
736
        bzr init
1185.12.93 by Aaron Bentley
Fixed obsolete help
737
        bzr add .
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
738
        bzr status
739
        bzr commit -m 'imported project'
740
    """
1185.16.138 by Martin Pool
[patch] 'bzr init DIR' (John)
741
    takes_args = ['location?']
742
    def run(self, location=None):
743
        from bzrlib.branch import Branch
744
        if location is None:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
745
            location = u'.'
1185.16.138 by Martin Pool
[patch] 'bzr init DIR' (John)
746
        else:
747
            # The path has to exist to initialize a
748
            # branch inside of it.
749
            # Just using os.mkdir, since I don't
750
            # believe that we want to create a bunch of
751
            # locations if the user supplies an extended path
752
            if not os.path.exists(location):
753
                os.mkdir(location)
754
        Branch.initialize(location)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
755
756
757
class cmd_diff(Command):
758
    """Show differences in working tree.
759
    
760
    If files are listed, only the changes in those files are listed.
761
    Otherwise, all changes for the tree are listed.
762
763
    examples:
764
        bzr diff
765
        bzr diff -r1
1185.1.2 by Martin Pool
- merge various windows and other fixes from Ollie Rutherfurd
766
        bzr diff -r1..2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
767
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
768
    # TODO: Allow diff across branches.
769
    # TODO: Option to use external diff command; could be GNU diff, wdiff,
770
    #       or a graphical diff.
771
772
    # TODO: Python difflib is not exactly the same as unidiff; should
773
    #       either fix it up or prefer to use an external diff.
774
775
    # TODO: If a directory is given, diff everything under that.
776
777
    # TODO: Selected-file diff is inefficient and doesn't show you
778
    #       deleted files.
779
780
    # TODO: This probably handles non-Unix newlines poorly.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
781
    
782
    takes_args = ['file*']
783
    takes_options = ['revision', 'diff-options']
784
    aliases = ['di', 'dif']
785
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
786
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
787
    def run(self, revision=None, file_list=None, diff_options=None):
788
        from bzrlib.diff import show_diff
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
789
        try:
1508.1.15 by Robert Collins
Merge from mpool.
790
            tree, file_list = internal_tree_files(file_list)
791
            b = None
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
792
            b2 = None
1185.35.32 by Aaron Bentley
Fixed handling of files in mixed branches
793
        except FileInWrongBranch:
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
794
            if len(file_list) != 2:
795
                raise BzrCommandError("Files are in different branches")
796
797
            b, file1 = Branch.open_containing(file_list[0])
798
            b2, file2 = Branch.open_containing(file_list[1])
799
            if file1 != "" or file2 != "":
1508.1.15 by Robert Collins
Merge from mpool.
800
                # FIXME diff those two files. rbc 20051123
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
801
                raise BzrCommandError("Files are in different branches")
802
            file_list = None
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
803
        if revision is not None:
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
804
            if b2 is not None:
805
                raise BzrCommandError("Can't specify -r with two branches")
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
806
            if len(revision) == 1:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
807
                return show_diff(tree.branch, revision[0], specific_files=file_list,
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
808
                                 external_diff_options=diff_options)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
809
            elif len(revision) == 2:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
810
                return show_diff(tree.branch, revision[0], specific_files=file_list,
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
811
                                 external_diff_options=diff_options,
812
                                 revision2=revision[1])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
813
            else:
814
                raise BzrCommandError('bzr diff --revision takes exactly one or two revision identifiers')
815
        else:
1508.1.15 by Robert Collins
Merge from mpool.
816
            if b is not None:
817
                return show_diff(b, None, specific_files=file_list,
818
                                 external_diff_options=diff_options, b2=b2)
819
            else:
820
                return show_diff(tree.branch, None, specific_files=file_list,
821
                                 external_diff_options=diff_options)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
822
823
824
class cmd_deleted(Command):
825
    """List files deleted in the working tree.
826
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
827
    # TODO: Show files deleted since a previous revision, or
828
    # between two revisions.
829
    # TODO: Much more efficient way to do this: read in new
830
    # directories with readdir, rather than stating each one.  Same
831
    # level of effort but possibly much less IO.  (Or possibly not,
832
    # if the directories are very large...)
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
833
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
834
    def run(self, show_ids=False):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
835
        tree = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
836
        old = tree.branch.basis_tree()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
837
        for path, ie in old.inventory.iter_entries():
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
838
            if not tree.has_id(ie.file_id):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
839
                if show_ids:
840
                    print '%-50s %s' % (path, ie.file_id)
841
                else:
842
                    print path
843
844
845
class cmd_modified(Command):
846
    """List files modified in working tree."""
847
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
848
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
849
    def run(self):
850
        from bzrlib.delta import compare_trees
851
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
852
        tree = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
853
        td = compare_trees(tree.branch.basis_tree(), tree)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
854
1398 by Robert Collins
integrate in Gustavos x-bit patch
855
        for path, id, kind, text_modified, meta_modified in td.modified:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
856
            print path
857
858
859
860
class cmd_added(Command):
861
    """List files added in working tree."""
862
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
863
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
864
    def run(self):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
865
        wt = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
866
        basis_inv = wt.branch.basis_tree().inventory
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
867
        inv = wt.inventory
868
        for file_id in inv:
869
            if file_id in basis_inv:
870
                continue
871
            path = inv.id2path(file_id)
872
            if not os.access(b.abspath(path), os.F_OK):
873
                continue
874
            print path
875
                
876
        
877
878
class cmd_root(Command):
879
    """Show the tree root directory.
880
881
    The root is the nearest enclosing directory with a .bzr control
882
    directory."""
883
    takes_args = ['filename?']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
884
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
885
    def run(self, filename=None):
886
        """Print the branch root."""
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
887
        tree = WorkingTree.open_containing(filename)[0]
888
        print tree.basedir
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
889
890
891
class cmd_log(Command):
892
    """Show log of this branch.
893
1185.16.153 by Martin Pool
[patch] fix help for bzr log (Matthieu)
894
    To request a range of logs, you can use the command -r begin..end
895
    -r revision requests a specific revision, -r ..end or -r begin.. are
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
896
    also valid.
897
    """
898
1393.1.55 by Martin Pool
doc
899
    # TODO: Make --revision support uuid: and hash: [future tag:] notation.
900
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
901
    takes_args = ['filename?']
1185.16.46 by mbp at sourcefrog
- add help strings to some options
902
    takes_options = [Option('forward', 
903
                            help='show from oldest to newest'),
904
                     'timezone', 'verbose', 
905
                     'show-ids', 'revision',
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
906
                     'line', 'long', 
1185.16.46 by mbp at sourcefrog
- add help strings to some options
907
                     Option('message',
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
908
                            help='show revisions whose message matches this regexp',
909
                            type=str),
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
910
                     'short',
1185.16.57 by Martin Pool
[merge] from aaron
911
                     ]
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
912
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
913
    def run(self, filename=None, timezone='original',
914
            verbose=False,
915
            show_ids=False,
916
            forward=False,
917
            revision=None,
918
            message=None,
919
            long=False,
1185.12.25 by Aaron Bentley
Added one-line log format
920
            short=False,
921
            line=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
922
        from bzrlib.log import log_formatter, show_log
1185.16.49 by mbp at sourcefrog
- more refactoring and tests of commandline
923
        assert message is None or isinstance(message, basestring), \
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
924
            "invalid message argument %r" % message
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
925
        direction = (forward and 'forward') or 'reverse'
926
        
927
        if filename:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
928
            # might be a tree:
929
            tree = None
930
            try:
931
                tree, fp = WorkingTree.open_containing(filename)
932
                b = tree.branch
933
                if fp != '':
934
                    inv = tree.read_working_inventory()
935
            except NotBranchError:
936
                pass
937
            if tree is None:
938
                b, fp = Branch.open_containing(filename)
939
                if fp != '':
940
                    inv = b.get_inventory(b.last_revision())
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
941
            if fp != '':
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
942
                file_id = inv.path2id(fp)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
943
            else:
944
                file_id = None  # points to branch root
945
        else:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
946
            tree, relpath = WorkingTree.open_containing(u'.')
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
947
            b = tree.branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
948
            file_id = None
949
950
        if revision is None:
951
            rev1 = None
952
            rev2 = None
953
        elif len(revision) == 1:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
954
            rev1 = rev2 = revision[0].in_history(b).revno
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
955
        elif len(revision) == 2:
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
956
            rev1 = revision[0].in_history(b).revno
957
            rev2 = revision[1].in_history(b).revno
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
958
        else:
959
            raise BzrCommandError('bzr log --revision takes one or two values.')
960
1185.36.1 by Daniel Silverstone
A revision of zero is meant to be zero, not None. Also order the revisions supplied to cope with the user being confused
961
        # By this point, the revision numbers are converted to the +ve
962
        # form if they were supplied in the -ve form, so we can do
963
        # this comparison in relative safety
964
        if rev1 > rev2:
965
            (rev2, rev1) = (rev1, rev2)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
966
1185.85.12 by John Arbash Meinel
Refactoring AddAction to allow redirecting to an encoding file.
967
        outf = _get_encoded_stdout_file()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
968
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
969
        log_format = get_log_format(long=long, short=short, line=line)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
970
        lf = log_formatter(log_format,
971
                           show_ids=show_ids,
972
                           to_file=outf,
973
                           show_timezone=timezone)
974
975
        show_log(b,
976
                 lf,
977
                 file_id,
978
                 verbose=verbose,
979
                 direction=direction,
980
                 start_revision=rev1,
981
                 end_revision=rev2,
982
                 search=message)
983
1185.85.4 by John Arbash Meinel
currently broken, trying to fix things up.
984
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
985
def get_log_format(long=False, short=False, line=False, default='long'):
986
    log_format = default
987
    if long:
988
        log_format = 'long'
989
    if short:
990
        log_format = 'short'
991
    if line:
992
        log_format = 'line'
993
    return log_format
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
994
995
996
class cmd_touching_revisions(Command):
997
    """Return revision-ids which affected a particular file.
998
999
    A more user-friendly interface is "bzr log FILE"."""
1000
    hidden = True
1001
    takes_args = ["filename"]
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1002
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1003
    def run(self, filename):
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1004
        tree, relpath = WorkingTree.open_containing(filename)
1005
        b = tree.branch
1006
        inv = tree.read_working_inventory()
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
1007
        file_id = inv.path2id(relpath)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1008
        for revno, revision_id, what in bzrlib.log.find_touching_revisions(b, file_id):
1009
            print "%6d %s" % (revno, what)
1010
1011
1012
class cmd_ls(Command):
1013
    """List files in a tree.
1014
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1015
    # TODO: Take a revision or remote path and list that tree instead.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1016
    hidden = True
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1017
    takes_options = ['verbose', 'revision',
1018
                     Option('non-recursive',
1019
                            help='don\'t recurse into sub-directories'),
1020
                     Option('from-root',
1021
                            help='Print all paths from the root of the branch.'),
1022
                     Option('unknown', help='Print unknown files'),
1023
                     Option('versioned', help='Print versioned files'),
1024
                     Option('ignored', help='Print ignored files'),
1025
1026
                     Option('null', help='Null separate the files'),
1027
                    ]
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1028
    @display_command
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1029
    def run(self, revision=None, verbose=False, 
1030
            non_recursive=False, from_root=False,
1031
            unknown=False, versioned=False, ignored=False,
1032
            null=False):
1033
1034
        if verbose and null:
1035
            raise BzrCommandError('Cannot set both --verbose and --null')
1036
        all = not (unknown or versioned or ignored)
1037
1038
        selection = {'I':ignored, '?':unknown, 'V':versioned}
1039
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1040
        tree, relpath = WorkingTree.open_containing(u'.')
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1041
        if from_root:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1042
            relpath = u''
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1043
        elif relpath:
1044
            relpath += '/'
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1045
        if revision is not None:
1046
            tree = tree.branch.revision_tree(
1047
                revision[0].in_history(tree.branch).rev_id)
1185.85.13 by John Arbash Meinel
Moving bzr ls to encoded output.
1048
1049
        outf = _get_encoded_stdout_file()
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
1050
        for fp, fc, kind, fid, entry in tree.list_files():
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1051
            if fp.startswith(relpath):
1052
                fp = fp[len(relpath):]
1053
                if non_recursive and '/' in fp:
1054
                    continue
1055
                if not all and not selection[fc]:
1056
                    continue
1057
                if verbose:
1058
                    kindch = entry.kind_character()
1185.85.13 by John Arbash Meinel
Moving bzr ls to encoded output.
1059
                    outf.write('%-8s %s%s\n' % (fc, fp, kindch))
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1060
                elif null:
1185.85.13 by John Arbash Meinel
Moving bzr ls to encoded output.
1061
                    outf.write(fp)
1062
                    outf.write('\0')
1063
                    outf.flush()
1185.26.1 by John Arbash Meinel
Made ls work again, and take extra arguments.
1064
                else:
1185.85.13 by John Arbash Meinel
Moving bzr ls to encoded output.
1065
                    outf.write(fp)
1066
                    outf.write('\n')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1067
1068
1069
class cmd_unknowns(Command):
1070
    """List unknown files."""
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1071
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1072
    def run(self):
1073
        from bzrlib.osutils import quotefn
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1074
        for f in WorkingTree.open_containing(u'.')[0].unknowns():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1075
            print quotefn(f)
1076
1077
1078
class cmd_ignore(Command):
1079
    """Ignore a command or pattern.
1080
1081
    To remove patterns from the ignore list, edit the .bzrignore file.
1082
1083
    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
1084
    from the branch root.  Otherwise, it is compared to only the last
1085
    component of the path.  To match a file only in the root directory,
1086
    prepend './'.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1087
1088
    Ignore patterns are case-insensitive on case-insensitive systems.
1089
1090
    Note: wildcards must be quoted from the shell on Unix.
1091
1092
    examples:
1093
        bzr ignore ./Makefile
1094
        bzr ignore '*.class'
1095
    """
1185.16.4 by Martin Pool
- doc and todo for ignore command
1096
    # TODO: Complain if the filename is absolute
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1097
    takes_args = ['name_pattern']
1098
    
1099
    def run(self, name_pattern):
1100
        from bzrlib.atomicfile import AtomicFile
1101
        import os.path
1102
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1103
        tree, relpath = WorkingTree.open_containing(u'.')
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1104
        ifn = tree.abspath('.bzrignore')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1105
1106
        if os.path.exists(ifn):
1107
            f = open(ifn, 'rt')
1108
            try:
1109
                igns = f.read().decode('utf-8')
1110
            finally:
1111
                f.close()
1112
        else:
1113
            igns = ''
1114
1115
        # TODO: If the file already uses crlf-style termination, maybe
1116
        # we should use that for the newly added lines?
1117
1118
        if igns and igns[-1] != '\n':
1119
            igns += '\n'
1120
        igns += name_pattern + '\n'
1121
1122
        try:
1123
            f = AtomicFile(ifn, 'wt')
1124
            f.write(igns.encode('utf-8'))
1125
            f.commit()
1126
        finally:
1127
            f.close()
1128
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1129
        inv = tree.inventory
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1130
        if inv.path2id('.bzrignore'):
1131
            mutter('.bzrignore is already versioned')
1132
        else:
1133
            mutter('need to make new .bzrignore file versioned')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
1134
            tree.add(['.bzrignore'])
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1135
1136
1137
class cmd_ignored(Command):
1138
    """List ignored files and the patterns that matched them.
1139
1140
    See also: bzr ignore"""
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1141
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1142
    def run(self):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1143
        tree = WorkingTree.open_containing(u'.')[0]
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
1144
        for path, file_class, kind, file_id, entry in tree.list_files():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1145
            if file_class != 'I':
1146
                continue
1147
            ## XXX: Slightly inefficient since this was already calculated
1148
            pat = tree.is_ignored(path)
1149
            print '%-50s %s' % (path, pat)
1150
1151
1152
class cmd_lookup_revision(Command):
1153
    """Lookup the revision-id from a revision-number
1154
1155
    example:
1156
        bzr lookup-revision 33
1157
    """
1158
    hidden = True
1159
    takes_args = ['revno']
1160
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1161
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1162
    def run(self, revno):
1163
        try:
1164
            revno = int(revno)
1165
        except ValueError:
1166
            raise BzrCommandError("not a valid revision-number: %r" % revno)
1167
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1168
        print WorkingTree.open_containing(u'.')[0].branch.get_rev_id(revno)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1169
1170
1171
class cmd_export(Command):
1172
    """Export past revision to destination directory.
1173
1174
    If no revision is specified this exports the last committed revision.
1175
1176
    Format may be an "exporter" name, such as tar, tgz, tbz2.  If none is
1177
    given, try to find the format with the extension. If no extension
1178
    is found exports to a directory (equivalent to --format=dir).
1179
1180
    Root may be the top directory for tar, tgz and tbz2 formats. If none
1185.31.11 by John Arbash Meinel
Merging Alexander's zip export patch
1181
    is given, the top directory will be the root name of the file.
1182
1183
    Note: export of tree with non-ascii filenames to zip is not supported.
1184
1185
    Supported formats       Autodetected by extension
1186
    -----------------       -------------------------
1187
         dir                            -
1188
         tar                          .tar
1189
         tbz2                    .tar.bz2, .tbz2
1190
         tgz                      .tar.gz, .tgz
1191
         zip                          .zip
1192
    """
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1193
    takes_args = ['dest']
1194
    takes_options = ['revision', 'format', 'root']
1195
    def run(self, dest, revision=None, format=None, root=None):
1196
        import os.path
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
1197
        from bzrlib.export import export
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1198
        tree = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1199
        b = tree.branch
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1200
        if revision is None:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1201
            # should be tree.last_revision  FIXME
1241 by Martin Pool
- rename last_patch to last_revision
1202
            rev_id = b.last_revision()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1203
        else:
1204
            if len(revision) != 1:
1205
                raise BzrError('bzr export --revision takes exactly 1 argument')
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
1206
            rev_id = revision[0].in_history(b).rev_id
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1207
        t = b.revision_tree(rev_id)
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
1208
        try:
1209
            export(t, dest, format, root)
1210
        except errors.NoSuchExportFormat, e:
1211
            raise BzrCommandError('Unsupported export format: %s' % e.format)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1212
1213
1214
class cmd_cat(Command):
1215
    """Write a file's text from a previous revision."""
1216
1217
    takes_options = ['revision']
1218
    takes_args = ['filename']
1219
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1220
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1221
    def run(self, filename, revision=None):
1185.50.9 by John Arbash Meinel
[bug 3632] Matthieu Moy- bzr cat should default to last revision
1222
        if revision is not None and len(revision) != 1:
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1223
            raise BzrCommandError("bzr cat --revision takes exactly one number")
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1224
        tree = None
1225
        try:
1226
            tree, relpath = WorkingTree.open_containing(filename)
1227
            b = tree.branch
1228
        except NotBranchError:
1229
            pass
1185.50.9 by John Arbash Meinel
[bug 3632] Matthieu Moy- bzr cat should default to last revision
1230
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1231
        if tree is None:
1232
            b, relpath = Branch.open_containing(filename)
1185.50.9 by John Arbash Meinel
[bug 3632] Matthieu Moy- bzr cat should default to last revision
1233
        if revision is None:
1234
            revision_id = b.last_revision()
1235
        else:
1236
            revision_id = revision[0].in_history(b).rev_id
1237
        b.print_file(relpath, revision_id)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1238
1239
1240
class cmd_local_time_offset(Command):
1241
    """Show the offset in seconds from GMT to local time."""
1242
    hidden = True    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1243
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1244
    def run(self):
1245
        print bzrlib.osutils.local_time_offset()
1246
1247
1248
1249
class cmd_commit(Command):
1250
    """Commit changes into a new revision.
1251
    
1252
    If no arguments are given, the entire tree is committed.
1253
1254
    If selected files are specified, only changes to those files are
1255
    committed.  If a directory is specified then the directory and everything 
1256
    within it is committed.
1257
1258
    A selected-file commit may fail in some cases where the committed
1259
    tree would be invalid, such as trying to commit a file in a
1260
    newly-added directory that is not itself committed.
1261
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1262
    # TODO: Run hooks on tree to-be-committed, and after commit.
1263
1185.16.65 by mbp at sourcefrog
- new commit --strict option
1264
    # TODO: Strict commit that fails if there are deleted files.
1265
    #       (what does "deleted files" mean ??)
1266
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1267
    # TODO: Give better message for -s, --summary, used by tla people
1268
1269
    # XXX: verbose currently does nothing
1270
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1271
    takes_args = ['selected*']
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
1272
    takes_options = ['message', 'verbose', 
1273
                     Option('unchanged',
1274
                            help='commit even if nothing has changed'),
1275
                     Option('file', type=str, 
1276
                            argname='msgfile',
1277
                            help='file containing commit message'),
1185.16.65 by mbp at sourcefrog
- new commit --strict option
1278
                     Option('strict',
1279
                            help="refuse to commit if there are unknown "
1280
                            "files in the working tree."),
1185.16.43 by Martin Pool
- clean up handling of option objects
1281
                     ]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1282
    aliases = ['ci', 'checkin']
1283
1284
    def run(self, message=None, file=None, verbose=True, selected_list=None,
1185.16.65 by mbp at sourcefrog
- new commit --strict option
1285
            unchanged=False, strict=False):
1286
        from bzrlib.errors import (PointlessCommit, ConflictsInTree,
1287
                StrictCommitFailed)
1185.33.76 by Martin Pool
Fix import error.
1288
        from bzrlib.msgeditor import edit_commit_message, \
1289
                make_commit_message_template
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1290
        from bzrlib.status import show_status
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
1291
        from tempfile import TemporaryFile
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1292
1185.33.77 by Martin Pool
doc
1293
        # TODO: Need a blackbox test for invoking the external editor; may be
1294
        # slightly problematic to run this cross-platform.
1295
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
1296
        # TODO: do more checks that the commit will succeed before 
1297
        # spending the user's valuable time typing a commit message.
1298
        #
1299
        # TODO: if the commit *does* happen to fail, then save the commit 
1300
        # message to a temporary file where it can be recovered
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1301
        tree, selected_list = tree_files(selected_list)
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
1302
        if message is None and not file:
1185.33.76 by Martin Pool
Fix import error.
1303
            template = make_commit_message_template(tree, selected_list)
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
1304
            message = edit_commit_message(template)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1305
            if message is None:
1169 by Martin Pool
- clean up nasty code for inserting the status summary into commit template
1306
                raise BzrCommandError("please specify a commit message"
1307
                                      " with either --message or --file")
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1308
        elif message and file:
1309
            raise BzrCommandError("please specify either --message or --file")
1310
        
1311
        if file:
1312
            message = codecs.open(file, 'rt', bzrlib.user_encoding).read()
1313
1414 by Robert Collins
merge in an adjusted version of Jelmer's empty-log detection patch.
1314
        if message == "":
1315
                raise BzrCommandError("empty commit message specified")
1316
            
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1317
        try:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1318
            tree.commit(message, specific_files=selected_list,
1319
                        allow_pointless=unchanged, strict=strict)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1320
        except PointlessCommit:
1321
            # FIXME: This should really happen before the file is read in;
1322
            # perhaps prepare the commit; get the message; then actually commit
1323
            raise BzrCommandError("no changes to commit",
1324
                                  ["use --unchanged to commit anyhow"])
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
1325
        except ConflictsInTree:
1326
            raise BzrCommandError("Conflicts detected in working tree.  "
1327
                'Use "bzr conflicts" to list, "bzr resolve FILE" to resolve.')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
1328
        except StrictCommitFailed:
1329
            raise BzrCommandError("Commit refused because there are unknown "
1330
                                  "files in the working tree.")
1185.33.45 by Martin Pool
[merge] refactoring of branch vs working tree, etc (robertc)
1331
        note('Committed revision %d.' % (tree.branch.revno(),))
1185.49.17 by John Arbash Meinel
[merge] Robey Pointer - some sftp fixes, and an http patch
1332
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1333
1334
class cmd_check(Command):
1335
    """Validate consistency of branch history.
1336
1337
    This command checks various invariants about the branch storage to
1338
    detect data corruption or bzr bugs.
1339
    """
1512 by Robert Collins
Merge from Martin. Adjust check to work with HTTP again.
1340
    takes_args = ['branch?']
1449 by Robert Collins
teach check about ghosts
1341
    takes_options = ['verbose']
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1342
1512 by Robert Collins
Merge from Martin. Adjust check to work with HTTP again.
1343
    def run(self, branch=None, verbose=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1344
        from bzrlib.check import check
1512 by Robert Collins
Merge from Martin. Adjust check to work with HTTP again.
1345
        if branch is None:
1346
            tree = WorkingTree.open_containing()[0]
1347
            branch = tree.branch
1348
        else:
1349
            branch = Branch.open(branch)
1350
        check(branch, verbose)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1351
1352
1353
class cmd_scan_cache(Command):
1354
    hidden = True
1355
    def run(self):
1356
        from bzrlib.hashcache import HashCache
1357
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1358
        c = HashCache(u'.')
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1359
        c.read()
1360
        c.scan()
1361
            
1362
        print '%6d stats' % c.stat_count
1363
        print '%6d in hashcache' % len(c._cache)
1364
        print '%6d files removed from cache' % c.removed_count
1365
        print '%6d hashes updated' % c.update_count
1366
        print '%6d files changed too recently to cache' % c.danger_count
1367
1368
        if c.needs_write:
1369
            c.write()
1370
            
1371
1372
1373
class cmd_upgrade(Command):
1374
    """Upgrade branch storage to current format.
1375
1376
    The check command or bzr developers may sometimes advise you to run
1377
    this command.
1377 by Martin Pool
- run conversion to weaves from the 'bzr upgrade' command
1378
1379
    This version of this command upgrades from the full-text storage
1380
    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;
1381
    """
1382
    takes_args = ['dir?']
1383
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1384
    def run(self, dir=u'.'):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1385
        from bzrlib.upgrade import upgrade
1377 by Martin Pool
- run conversion to weaves from the 'bzr upgrade' command
1386
        upgrade(dir)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1387
1388
1389
class cmd_whoami(Command):
1390
    """Show bzr user id."""
1391
    takes_options = ['email']
1392
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1393
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1394
    def run(self, email=False):
1371 by Martin Pool
- raise NotBranchError if format file can't be read
1395
        try:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1396
            b = WorkingTree.open_containing(u'.')[0].branch
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1397
            config = bzrlib.config.BranchConfig(b)
1371 by Martin Pool
- raise NotBranchError if format file can't be read
1398
        except NotBranchError:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1399
            config = bzrlib.config.GlobalConfig()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1400
        
1401
        if email:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1402
            print config.user_email()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1403
        else:
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
1404
            print config.username()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1405
1185.35.14 by Aaron Bentley
Implemented nick command
1406
class cmd_nick(Command):
1407
    """\
1408
    Print or set the branch nickname.  
1409
    If unset, the tree root directory name is used as the nickname
1410
    To print the current nickname, execute with no argument.  
1411
    """
1412
    takes_args = ['nickname?']
1413
    def run(self, nickname=None):
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1414
        branch = Branch.open_containing(u'.')[0]
1185.35.14 by Aaron Bentley
Implemented nick command
1415
        if nickname is None:
1416
            self.printme(branch)
1417
        else:
1418
            branch.nick = nickname
1419
1420
    @display_command
1421
    def printme(self, branch):
1422
        print branch.nick 
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1423
1424
class cmd_selftest(Command):
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1425
    """Run internal test suite.
1426
    
1427
    This creates temporary test directories in the working directory,
1428
    but not existing data is affected.  These directories are deleted
1429
    if the tests pass, or left behind to help in debugging if they
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
1430
    fail and --keep-output is specified.
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1431
    
1432
    If arguments are given, they are regular expressions that say
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1433
    which tests should run.
1434
    """
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1435
    # TODO: --list should give a list of all available tests
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1436
    hidden = True
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
1437
    takes_args = ['testspecs*']
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1438
    takes_options = ['verbose', 
1439
                     Option('one', help='stop when one test fails'),
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
1440
                     Option('keep-output', 
1441
                            help='keep output directories when tests fail')
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1442
                    ]
1443
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
1444
    def run(self, testspecs_list=None, verbose=False, one=False,
1445
            keep_output=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1446
        import bzrlib.ui
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
1447
        from bzrlib.tests import selftest
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1448
        # we don't want progress meters from the tests to go to the
1449
        # real output; and we don't want log messages cluttering up
1450
        # the real logs.
1451
        save_ui = bzrlib.ui.ui_factory
1452
        bzrlib.trace.info('running tests...')
1453
        try:
1454
            bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory()
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
1455
            if testspecs_list is not None:
1456
                pattern = '|'.join(testspecs_list)
1457
            else:
1458
                pattern = ".*"
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
1459
            result = selftest(verbose=verbose, 
1185.16.58 by mbp at sourcefrog
- run all selftests by default
1460
                              pattern=pattern,
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
1461
                              stop_on_failure=one, 
1462
                              keep_output=keep_output)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1463
            if result:
1464
                bzrlib.trace.info('tests passed')
1465
            else:
1466
                bzrlib.trace.info('tests failed')
1467
            return int(not result)
1468
        finally:
1469
            bzrlib.ui.ui_factory = save_ui
1470
1471
1185.62.8 by John Arbash Meinel
Deprecating bzrlib.get_bzr_revision, in favor of bzrlib.builtins._get_bzr_branch
1472
def _get_bzr_branch():
1473
    """If bzr is run from a branch, return Branch or None"""
1474
    import bzrlib.errors
1475
    from bzrlib.branch import Branch
1476
    from bzrlib.osutils import abspath
1477
    from os.path import dirname
1478
    
1479
    try:
1480
        branch = Branch.open(dirname(abspath(dirname(__file__))))
1481
        return branch
1482
    except bzrlib.errors.BzrError:
1483
        return None
1484
    
1485
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1486
def show_version():
1487
    print "bzr (bazaar-ng) %s" % bzrlib.__version__
1488
    # is bzrlib itself in a branch?
1185.62.8 by John Arbash Meinel
Deprecating bzrlib.get_bzr_revision, in favor of bzrlib.builtins._get_bzr_branch
1489
    branch = _get_bzr_branch()
1490
    if branch:
1491
        rh = branch.revision_history()
1492
        revno = len(rh)
1185.62.1 by John Arbash Meinel
bzr --version prints branch nickname.
1493
        print "  bzr checkout, revision %d" % (revno,)
1494
        print "  nick: %s" % (branch.nick,)
1185.62.8 by John Arbash Meinel
Deprecating bzrlib.get_bzr_revision, in favor of bzrlib.builtins._get_bzr_branch
1495
        if rh:
1496
            print "  revid: %s" % (rh[-1],)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1497
    print bzrlib.__copyright__
1498
    print "http://bazaar-ng.org/"
1499
    print
1500
    print "bzr comes with ABSOLUTELY NO WARRANTY.  bzr is free software, and"
1501
    print "you may use, modify and redistribute it under the terms of the GNU"
1502
    print "General Public License version 2 or later."
1503
1504
1505
class cmd_version(Command):
1506
    """Show version of bzr."""
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1507
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1508
    def run(self):
1509
        show_version()
1510
1511
class cmd_rocks(Command):
1512
    """Statement of optimism."""
1513
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1514
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1515
    def run(self):
1516
        print "it sure does!"
1517
1518
1519
class cmd_find_merge_base(Command):
1520
    """Find and print a base revision for merging two branches.
1521
    """
1185.16.3 by Martin Pool
- remove all TODOs from bzr help messages
1522
    # TODO: Options to specify revisions on either side, as if
1523
    #       merging only part of the history.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1524
    takes_args = ['branch', 'other']
1525
    hidden = True
1526
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1527
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1528
    def run(self, branch, other):
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1529
        from bzrlib.revision import common_ancestor, MultipleRevisionSources
1530
        
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
1531
        branch1 = Branch.open_containing(branch)[0]
1532
        branch2 = Branch.open_containing(other)[0]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1533
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1534
        history_1 = branch1.revision_history()
1535
        history_2 = branch2.revision_history()
1536
1241 by Martin Pool
- rename last_patch to last_revision
1537
        last1 = branch1.last_revision()
1538
        last2 = branch2.last_revision()
1155 by Martin Pool
- update find-merge-base to use new common_ancestor code
1539
1540
        source = MultipleRevisionSources(branch1, branch2)
1541
        
1542
        base_rev_id = common_ancestor(last1, last2, source)
1543
1544
        print 'merge base is revision %s' % base_rev_id
1545
        
1546
        return
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1547
1548
        if base_revno is None:
1549
            raise bzrlib.errors.UnrelatedBranches()
1550
1551
        print ' r%-6d in %s' % (base_revno, branch)
1552
1553
        other_revno = branch2.revision_id_to_revno(base_revid)
1554
        
1555
        print ' r%-6d in %s' % (other_revno, other)
1556
1557
1558
1559
class cmd_merge(Command):
1560
    """Perform a three-way merge.
1561
    
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1562
    The branch is the branch you will merge from.  By default, it will
1563
    merge the latest revision.  If you specify a revision, that
1564
    revision will be merged.  If you specify two revisions, the first
1565
    will be used as a BASE, and the second one as OTHER.  Revision
1566
    numbers are always relative to the specified branch.
1567
1568
    By default bzr will try to merge in all new work from the other
1569
    branch, automatically determining an appropriate base.  If this
1570
    fails, you may need to give an explicit base.
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1571
    
1572
    Examples:
1573
1574
    To merge the latest revision from bzr.dev
1575
    bzr merge ../bzr.dev
1576
1577
    To merge changes up to and including revision 82 from bzr.dev
1578
    bzr merge -r 82 ../bzr.dev
1579
1580
    To merge the changes introduced by 82, without previous changes:
1581
    bzr merge -r 81..82 ../bzr.dev
1582
    
1583
    merge refuses to run if there are any uncommitted changes, unless
1584
    --force is given.
1585
    """
1586
    takes_args = ['branch?']
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
1587
    takes_options = ['revision', 'force', 'merge-type', 'reprocess',
1185.18.1 by Aaron Bentley
Added --show-base to merge
1588
                     Option('show-base', help="Show base revision text in "
1589
                            "conflicts")]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1590
1185.18.1 by Aaron Bentley
Added --show-base to merge
1591
    def run(self, branch=None, revision=None, force=False, merge_type=None,
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
1592
            show_base=False, reprocess=False):
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1593
        from bzrlib.merge import merge
1594
        from bzrlib.merge_core import ApplyMerge3
1595
        if merge_type is None:
1596
            merge_type = ApplyMerge3
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
1597
        if branch is None:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1598
            branch = WorkingTree.open_containing(u'.')[0].branch.get_parent()
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
1599
            if branch is None:
1600
                raise BzrCommandError("No merge location known or specified.")
1601
            else:
1602
                print "Using saved location: %s" % branch 
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1603
        if revision is None or len(revision) < 1:
1604
            base = [None, None]
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
1605
            other = [branch, -1]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1606
        else:
1607
            if len(revision) == 1:
974.1.52 by aaron.bentley at utoronto
Merged mpool's latest changes (~0.0.7)
1608
                base = [None, None]
1185.12.53 by Aaron Bentley
Merged more from Robert
1609
                other_branch = Branch.open_containing(branch)[0]
1185.12.46 by Aaron Bentley
Fixed -r brokenness in merge
1610
                revno = revision[0].in_history(other_branch).revno
1611
                other = [branch, revno]
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1612
            else:
1613
                assert len(revision) == 2
1614
                if None in revision:
1615
                    raise BzrCommandError(
1616
                        "Merge doesn't permit that revision specifier.")
1185.12.53 by Aaron Bentley
Merged more from Robert
1617
                b = Branch.open_containing(branch)[0]
1185.5.1 by John Arbash Meinel
Applying bad-merge revision patch.
1618
1619
                base = [branch, revision[0].in_history(b).revno]
1620
                other = [branch, revision[1].in_history(b).revno]
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1621
1622
        try:
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
1623
            conflict_count = merge(other, base, check_clean=(not force),
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
1624
                                   merge_type=merge_type, reprocess=reprocess,
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
1625
                                   show_base=show_base)
1626
            if conflict_count != 0:
1627
                return 1
1628
            else:
1629
                return 0
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1630
        except bzrlib.errors.AmbiguousBase, e:
1173 by Martin Pool
- message typo
1631
            m = ("sorry, bzr can't determine the right merge base yet\n"
1172 by Martin Pool
- better explanation when merge fails with AmbiguousBase
1632
                 "candidates are:\n  "
1633
                 + "\n  ".join(e.bases)
1634
                 + "\n"
1635
                 "please specify an explicit base with -r,\n"
1636
                 "and (if you want) report this to the bzr developers\n")
1637
            log_error(m)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1638
1639
1185.35.4 by Aaron Bentley
Implemented remerge
1640
class cmd_remerge(Command):
1641
    """Redo a merge.
1642
    """
1643
    takes_args = ['file*']
1644
    takes_options = ['merge-type', 'reprocess',
1645
                     Option('show-base', help="Show base revision text in "
1646
                            "conflicts")]
1647
1648
    def run(self, file_list=None, merge_type=None, show_base=False,
1649
            reprocess=False):
1650
        from bzrlib.merge import merge_inner, transform_tree
1651
        from bzrlib.merge_core import ApplyMerge3
1652
        if merge_type is None:
1653
            merge_type = ApplyMerge3
1508.1.15 by Robert Collins
Merge from mpool.
1654
        tree, file_list = tree_files(file_list)
1655
        tree.lock_write()
1185.35.4 by Aaron Bentley
Implemented remerge
1656
        try:
1508.1.15 by Robert Collins
Merge from mpool.
1657
            pending_merges = tree.pending_merges() 
1185.35.4 by Aaron Bentley
Implemented remerge
1658
            if len(pending_merges) != 1:
1659
                raise BzrCommandError("Sorry, remerge only works after normal"
1660
                                      + " merges.  Not cherrypicking or"
1661
                                      + "multi-merges.")
1508.1.15 by Robert Collins
Merge from mpool.
1662
            base_revision = common_ancestor(tree.branch.last_revision(), 
1663
                                            pending_merges[0], tree.branch)
1664
            base_tree = tree.branch.revision_tree(base_revision)
1665
            other_tree = tree.branch.revision_tree(pending_merges[0])
1185.35.4 by Aaron Bentley
Implemented remerge
1666
            interesting_ids = None
1667
            if file_list is not None:
1668
                interesting_ids = set()
1669
                for filename in file_list:
1508.1.15 by Robert Collins
Merge from mpool.
1670
                    file_id = tree.path2id(filename)
1185.35.4 by Aaron Bentley
Implemented remerge
1671
                    interesting_ids.add(file_id)
1508.1.15 by Robert Collins
Merge from mpool.
1672
                    if tree.kind(file_id) != "directory":
1185.35.4 by Aaron Bentley
Implemented remerge
1673
                        continue
1185.35.13 by Aaron Bentley
Merged Martin
1674
                    
1508.1.15 by Robert Collins
Merge from mpool.
1675
                    for name, ie in tree.inventory.iter_entries(file_id):
1185.35.4 by Aaron Bentley
Implemented remerge
1676
                        interesting_ids.add(ie.file_id)
1508.1.15 by Robert Collins
Merge from mpool.
1677
            transform_tree(tree, tree.branch.basis_tree(), interesting_ids)
1185.35.4 by Aaron Bentley
Implemented remerge
1678
            if file_list is None:
1508.1.15 by Robert Collins
Merge from mpool.
1679
                restore_files = list(tree.iter_conflicts())
1185.35.4 by Aaron Bentley
Implemented remerge
1680
            else:
1681
                restore_files = file_list
1682
            for filename in restore_files:
1683
                try:
1508.1.15 by Robert Collins
Merge from mpool.
1684
                    restore(tree.abspath(filename))
1185.35.4 by Aaron Bentley
Implemented remerge
1685
                except NotConflicted:
1686
                    pass
1508.1.15 by Robert Collins
Merge from mpool.
1687
            conflicts =  merge_inner(tree.branch, other_tree, base_tree, 
1185.35.4 by Aaron Bentley
Implemented remerge
1688
                                     interesting_ids = interesting_ids, 
1689
                                     other_rev_id=pending_merges[0], 
1690
                                     merge_type=merge_type, 
1691
                                     show_base=show_base,
1692
                                     reprocess=reprocess)
1693
        finally:
1508.1.15 by Robert Collins
Merge from mpool.
1694
            tree.unlock()
1185.35.4 by Aaron Bentley
Implemented remerge
1695
        if conflicts > 0:
1696
            return 1
1697
        else:
1698
            return 0
1699
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1700
class cmd_revert(Command):
1701
    """Reverse all changes since the last commit.
1702
1703
    Only versioned files are affected.  Specify filenames to revert only 
1704
    those files.  By default, any files that are changed will be backed up
1705
    first.  Backup files have a '~' appended to their name.
1706
    """
1707
    takes_options = ['revision', 'no-backup']
1708
    takes_args = ['file*']
1709
    aliases = ['merge-revert']
1710
1711
    def run(self, revision=None, no_backup=False, file_list=None):
1457.1.7 by Robert Collins
Change cmd_revert to use merge_inner.
1712
        from bzrlib.merge import merge_inner
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1713
        from bzrlib.commands import parse_spec
1714
        if file_list is not None:
1715
            if len(file_list) == 0:
1716
                raise BzrCommandError("No files specified")
1457.1.9 by Robert Collins
Change cmd_revert implementation to call workingtree.Revert.
1717
        else:
1718
            file_list = []
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1719
        if revision is None:
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
1720
            revno = -1
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1721
            tree = WorkingTree.open_containing(u'.')[0]
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1722
            # FIXME should be tree.last_revision
1723
            rev_id = tree.branch.last_revision()
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1724
        elif len(revision) != 1:
1725
            raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
1726
        else:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1727
            tree, file_list = tree_files(file_list)
1728
            rev_id = revision[0].in_history(tree.branch).rev_id
1729
        tree.revert(file_list, tree.branch.revision_tree(rev_id),
1457.1.9 by Robert Collins
Change cmd_revert implementation to call workingtree.Revert.
1730
                                not no_backup)
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1731
1732
1733
class cmd_assert_fail(Command):
1734
    """Test reporting of assertion failures"""
1735
    hidden = True
1736
    def run(self):
1737
        assert False, "always fails"
1738
1739
1740
class cmd_help(Command):
1741
    """Show help on a command or other topic.
1742
1743
    For a list of all available commands, say 'bzr help commands'."""
1744
    takes_options = ['long']
1745
    takes_args = ['topic?']
1746
    aliases = ['?']
1747
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1748
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1749
    def run(self, topic=None, long=False):
1750
        import help
1751
        if topic is None and long:
1752
            topic = "commands"
1753
        help.help(topic)
1754
1755
1756
class cmd_shell_complete(Command):
1757
    """Show appropriate completions for context.
1758
1759
    For a list of all available commands, say 'bzr shell-complete'."""
1760
    takes_args = ['context?']
1761
    aliases = ['s-c']
1762
    hidden = True
1763
    
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1764
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1765
    def run(self, context=None):
1766
        import shellcomplete
1767
        shellcomplete.shellcomplete(context)
1768
1769
1228 by Martin Pool
- add fetch command as builtin
1770
class cmd_fetch(Command):
1771
    """Copy in history from another branch but don't merge it.
1772
1773
    This is an internal method used for pull and merge."""
1774
    hidden = True
1775
    takes_args = ['from_branch', 'to_branch']
1776
    def run(self, from_branch, to_branch):
1777
        from bzrlib.fetch import Fetcher
1778
        from bzrlib.branch import Branch
1185.16.100 by mbp at sourcefrog
Update fetch command for new Branch constructors.
1779
        from_b = Branch.open(from_branch)
1780
        to_b = Branch.open(to_branch)
1781
        from_b.lock_read()
1782
        try:
1783
            to_b.lock_write()
1784
            try:
1785
                Fetcher(to_b, from_b)
1786
            finally:
1787
                to_b.unlock()
1788
        finally:
1789
            from_b.unlock()
1228 by Martin Pool
- add fetch command as builtin
1790
1791
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1792
class cmd_missing(Command):
1185.54.3 by Aaron Bentley
Factored out find_unmerged
1793
    """Show unmerged/unpulled revisions between two branches.
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
1794
1185.54.3 by Aaron Bentley
Factored out find_unmerged
1795
    OTHER_BRANCH may be local or remote."""
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
1796
    takes_args = ['other_branch?']
1797
    takes_options = [Option('reverse', 'Reverse the order of revisions'),
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
1798
                     Option('mine-only', 
1799
                            'Display changes in the local branch only'),
1800
                     Option('theirs-only', 
1801
                            'Display changes in the remote branch only'), 
1802
                     'line',
1803
                     'long', 
1804
                     'short',
1805
                     'show-ids',
1185.54.19 by Aaron Bentley
All tests pass
1806
                     'verbose'
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
1807
                     ]
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
1808
1809
    def run(self, other_branch=None, reverse=False, mine_only=False,
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
1810
            theirs_only=False, long=True, short=False, line=False, 
1185.54.19 by Aaron Bentley
All tests pass
1811
            show_ids=False, verbose=False):
1812
        from bzrlib.missing import find_unmerged, iter_log_data
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
1813
        from bzrlib.log import log_formatter
1185.46.5 by Aaron Bentley
Use unicode pathname in cmd_missing
1814
        local_branch = bzrlib.branch.Branch.open_containing(u".")[0]
1185.54.16 by Aaron Bentley
fixed location handling to match old missing
1815
        parent = local_branch.get_parent()
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
1816
        if other_branch is None:
1185.54.16 by Aaron Bentley
fixed location handling to match old missing
1817
            other_branch = parent
1818
            if other_branch is None:
1819
                raise BzrCommandError("No missing location known or specified.")
1185.54.1 by Aaron Bentley
Import Kinnison's plugin
1820
            print "Using last location: " + local_branch.get_parent()
1821
        remote_branch = bzrlib.branch.Branch.open(other_branch)
1185.54.4 by Aaron Bentley
Restructured find_unmerged, so it returns lists of (revno, revision) pairs
1822
        local_extra, remote_extra = find_unmerged(local_branch, remote_branch)
1185.54.12 by Aaron Bentley
Added log formatter selection and show-ids to missing
1823
        log_format = get_log_format(long=long, short=short, line=line)
1824
        lf = log_formatter(log_format, sys.stdout,
1825
                           show_ids=show_ids,
1826
                           show_timezone='original')
1185.54.5 by Aaron Bentley
Inverted the meaning of reverse
1827
        if reverse is False:
1185.54.3 by Aaron Bentley
Factored out find_unmerged
1828
            local_extra.reverse()
1829
            remote_extra.reverse()
1830
        if local_extra and not theirs_only:
1185.54.14 by Aaron Bentley
Added missing revision counts.
1831
            print "You have %d extra revision(s):" % len(local_extra)
1185.54.19 by Aaron Bentley
All tests pass
1832
            for data in iter_log_data(local_extra, local_branch, verbose):
1833
                lf.show(*data)
1185.54.3 by Aaron Bentley
Factored out find_unmerged
1834
            printed_local = True
1835
        else:
1836
            printed_local = False
1837
        if remote_extra and not mine_only:
1838
            if printed_local is True:
1839
                print "\n\n"
1185.54.14 by Aaron Bentley
Added missing revision counts.
1840
            print "You are missing %d revision(s):" % len(remote_extra)
1185.54.19 by Aaron Bentley
All tests pass
1841
            for data in iter_log_data(remote_extra, remote_branch, verbose):
1842
                lf.show(*data)
1185.54.11 by Aaron Bentley
Added no-difference message
1843
        if not remote_extra and not local_extra:
1185.54.17 by Aaron Bentley
Set status to 1 when there are missing revisions on either side.
1844
            status_code = 0
1185.54.11 by Aaron Bentley
Added no-difference message
1845
            print "Branches are up to date."
1185.54.17 by Aaron Bentley
Set status to 1 when there are missing revisions on either side.
1846
        else:
1847
            status_code = 1
1185.54.16 by Aaron Bentley
fixed location handling to match old missing
1848
        if parent is None and other_branch is not None:
1849
            local_branch.set_parent(other_branch)
1185.54.17 by Aaron Bentley
Set status to 1 when there are missing revisions on either side.
1850
        return status_code
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1851
1852
1853
class cmd_plugins(Command):
1854
    """List plugins"""
1855
    hidden = True
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1856
    @display_command
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1857
    def run(self):
1858
        import bzrlib.plugin
1859
        from inspect import getdoc
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
1860
        for name, plugin in bzrlib.plugin.all_plugins().items():
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
1861
            if hasattr(plugin, '__path__'):
1862
                print plugin.__path__[0]
1863
            elif hasattr(plugin, '__file__'):
1864
                print plugin.__file__
1865
            else:
1866
                print `plugin`
1867
                
1868
            d = getdoc(plugin)
1869
            if d:
1870
                print '\t', d.split('\n')[0]
1871
1872
1185.16.24 by Martin Pool
- add and test 'testament' builtin command
1873
class cmd_testament(Command):
1874
    """Show testament (signing-form) of a revision."""
1875
    takes_options = ['revision', 'long']
1876
    takes_args = ['branch?']
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1877
    @display_command
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1878
    def run(self, branch=u'.', revision=None, long=False):
1185.16.24 by Martin Pool
- add and test 'testament' builtin command
1879
        from bzrlib.testament import Testament
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1880
        b = WorkingTree.open_containing(branch)[0].branch
1185.16.24 by Martin Pool
- add and test 'testament' builtin command
1881
        b.lock_read()
1882
        try:
1883
            if revision is None:
1884
                rev_id = b.last_revision()
1885
            else:
1886
                rev_id = revision[0].in_history(b).rev_id
1887
            t = Testament.from_revision(b, rev_id)
1888
            if long:
1889
                sys.stdout.writelines(t.as_text_lines())
1890
            else:
1891
                sys.stdout.write(t.as_short_text())
1892
        finally:
1893
            b.unlock()
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1894
1895
1896
class cmd_annotate(Command):
1897
    """Show the origin of each line in a file.
1898
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1899
    This prints out the given file with an annotation on the left side
1900
    indicating which revision, author and date introduced the change.
1901
1902
    If the origin is the same for a run of consecutive lines, it is 
1903
    shown only at the top, unless the --all option is given.
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1904
    """
1905
    # TODO: annotate directories; showing when each file was last changed
1906
    # TODO: annotate a previous version of a file
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1907
    # TODO: if the working copy is modified, show annotations on that 
1908
    #       with new uncommitted lines marked
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1909
    aliases = ['blame', 'praise']
1910
    takes_args = ['filename']
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1911
    takes_options = [Option('all', help='show annotations on all lines'),
1912
                     Option('long', help='show date in annotations'),
1913
                     ]
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1914
1185.12.56 by Aaron Bentley
Prevented display commands from printing broken pipe errors
1915
    @display_command
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
1916
    def run(self, filename, all=False, long=False):
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1917
        from bzrlib.annotate import annotate_file
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1918
        tree, relpath = WorkingTree.open_containing(filename)
1919
        branch = tree.branch
1920
        branch.lock_read()
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1921
        try:
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
1922
            file_id = tree.inventory.path2id(relpath)
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1923
            tree = branch.revision_tree(branch.last_revision())
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1924
            file_version = tree.inventory[file_id].revision
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1925
            annotate_file(branch, file_version, file_id, long, all, sys.stdout)
1185.16.32 by Martin Pool
- add a basic annotate built-in command
1926
        finally:
1508.1.4 by Robert Collins
Convert most of the front ends commands to use WorkingTree.open_containing
1927
            branch.unlock()
1185.16.33 by Martin Pool
- move 'conflict' and 'resolved' from shipped plugin to regular builtins
1928
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
1929
1930
class cmd_re_sign(Command):
1931
    """Create a digital signature for an existing revision."""
1932
    # TODO be able to replace existing ones.
1933
1934
    hidden = True # is this right ?
1935
    takes_args = ['revision_id?']
1936
    takes_options = ['revision']
1937
    
1938
    def run(self, revision_id=None, revision=None):
1939
        import bzrlib.config as config
1940
        import bzrlib.gpg as gpg
1941
        if revision_id is not None and revision is not None:
1942
            raise BzrCommandError('You can only supply one of revision_id or --revision')
1943
        if revision_id is None and revision is None:
1944
            raise BzrCommandError('You must supply either --revision or a revision_id')
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1945
        b = WorkingTree.open_containing(u'.')[0].branch
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
1946
        gpg_strategy = gpg.GPGStrategy(config.BranchConfig(b))
1947
        if revision_id is not None:
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
1948
            b.sign_revision(revision_id, gpg_strategy)
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
1949
        elif revision is not None:
1483 by Robert Collins
BUGFIX: re-sign should accept ranges
1950
            if len(revision) == 1:
1951
                revno, rev_id = revision[0].in_history(b)
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
1952
                b.sign_revision(rev_id, gpg_strategy)
1483 by Robert Collins
BUGFIX: re-sign should accept ranges
1953
            elif len(revision) == 2:
1954
                # are they both on rh- if so we can walk between them
1955
                # might be nice to have a range helper for arbitrary
1956
                # revision paths. hmm.
1957
                from_revno, from_revid = revision[0].in_history(b)
1958
                to_revno, to_revid = revision[1].in_history(b)
1959
                if to_revid is None:
1960
                    to_revno = b.revno()
1961
                if from_revno is None or to_revno is None:
1962
                    raise BzrCommandError('Cannot sign a range of non-revision-history revisions')
1963
                for revno in range(from_revno, to_revno + 1):
1964
                    b.sign_revision(b.get_rev_id(revno), gpg_strategy)
1965
            else:
1966
                raise BzrCommandError('Please supply either one revision, or a range.')
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
1967
1968
1185.31.24 by John Arbash Meinel
[merge] Added the uncommit plugin
1969
class cmd_uncommit(bzrlib.commands.Command):
1970
    """Remove the last committed revision.
1971
1972
    By supplying the --all flag, it will not only remove the entry 
1973
    from revision_history, but also remove all of the entries in the
1974
    stores.
1975
1976
    --verbose will print out what is being removed.
1977
    --dry-run will go through all the motions, but not actually
1978
    remove anything.
1979
    
1980
    In the future, uncommit will create a changeset, which can then
1981
    be re-applied.
1982
    """
1983
    takes_options = ['all', 'verbose', 'revision',
1984
                    Option('dry-run', help='Don\'t actually make changes'),
1985
                    Option('force', help='Say yes to all questions.')]
1986
    takes_args = ['location?']
1987
    aliases = []
1988
1989
    def run(self, location=None, all=False,
1990
            dry_run=False, verbose=False,
1991
            revision=None, force=False):
1992
        from bzrlib.branch import Branch
1993
        from bzrlib.log import log_formatter
1994
        import sys
1995
        from bzrlib.uncommit import uncommit
1996
1997
        if location is None:
1185.33.66 by Martin Pool
[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)
1998
            location = u'.'
1185.31.24 by John Arbash Meinel
[merge] Added the uncommit plugin
1999
        b, relpath = Branch.open_containing(location)
2000
2001
        if revision is None:
2002
            revno = b.revno()
2003
            rev_id = b.last_revision()
2004
        else:
2005
            revno, rev_id = revision[0].in_history(b)
2006
        if rev_id is None:
2007
            print 'No revisions to uncommit.'
2008
2009
        for r in range(revno, b.revno()+1):
2010
            rev_id = b.get_rev_id(r)
2011
            lf = log_formatter('short', to_file=sys.stdout,show_timezone='original')
2012
            lf.show(r, b.get_revision(rev_id), None)
2013
2014
        if dry_run:
2015
            print 'Dry-run, pretending to remove the above revisions.'
2016
            if not force:
2017
                val = raw_input('Press <enter> to continue')
2018
        else:
2019
            print 'The above revision(s) will be removed.'
2020
            if not force:
2021
                val = raw_input('Are you sure [y/N]? ')
2022
                if val.lower() not in ('y', 'yes'):
2023
                    print 'Canceled'
2024
                    return 0
2025
2026
        uncommit(b, remove_files=all,
2027
                dry_run=dry_run, verbose=verbose,
2028
                revno=revno)
2029
2030
1185.16.33 by Martin Pool
- move 'conflict' and 'resolved' from shipped plugin to regular builtins
2031
# these get imported and then picked up by the scan for cmd_*
2032
# TODO: Some more consistent way to split command definitions across files;
2033
# we do need to load at least some information about them to know of 
2034
# aliases.
1185.35.4 by Aaron Bentley
Implemented remerge
2035
from bzrlib.conflicts import cmd_resolve, cmd_conflicts, restore