~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to __init__.py

  • Committer: Aaron Bentley
  • Date: 2006-06-14 17:06:32 UTC
  • mto: This revision was merged to the branch mainline in revision 395.
  • Revision ID: abentley@panoramicfeedback.com-20060614170632-935a8dcb79efc4b7
Implement 'shove' for moving changes to other trees

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
"""\
3
3
Various useful plugins for working with bzr.
4
4
"""
 
5
import bzrlib.commands
5
6
import rspush
6
7
from errors import CommandError
7
8
from patchsource import BzrPatchSource
9
10
from switch import cmd_switch
10
11
import sys
11
12
import os.path
12
 
 
13
 
from bzrlib import DEFAULT_IGNORE
14
 
import bzrlib.builtins
 
13
from bzrlib.option import Option
15
14
import bzrlib.branch
16
 
import bzrlib.commands
17
 
from bzrlib.commands import get_cmd_object
18
15
from bzrlib.errors import BzrCommandError
19
 
from bzrlib.help import command_usage
20
 
from bzrlib.option import Option
21
16
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), 
22
17
                                                 "external")))
 
18
from bzrlib import DEFAULT_IGNORE
23
19
 
24
20
 
25
21
DEFAULT_IGNORE.append('./.shelf')
27
23
 
28
24
 
29
25
class cmd_clean_tree(bzrlib.commands.Command):
30
 
    """Remove unwanted files from working tree.
31
 
 
32
 
    By default, only unknown files, not ignored files, are deleted.  Versioned
33
 
    files are never deleted.
34
 
 
35
 
    Another class is 'detritus', which includes files emitted by bzr during
36
 
    normal operations and selftests.  (The value of these files decreases with
37
 
    time.)
38
 
 
39
 
    If no options are specified, unknown files are deleted.  Otherwise, option
40
 
    flags are respected, and may be combined.
41
 
 
42
 
    To check what clean-tree will do, use --dry-run.
 
26
    """Remove unwanted files from working tree.  <BZRTOOLS>
 
27
    Normally, ignored files are left alone.
43
28
    """
44
29
    takes_options = [Option('ignored', help='delete all ignored files.'), 
45
 
                     Option('detritus', help='delete conflict files, merge'
46
 
                            ' backups, and failed selftest dirs.'), 
47
 
                     Option('unknown', 
48
 
                            help='delete files unknown to bzr.  (default)'),
 
30
                     Option('detritus', help='delete conflict files merge'
 
31
                            ' backups, and failed selftest dirs.  (*.THIS, '
 
32
                            '*.BASE, *.OTHER, *~, *.tmp)'), 
49
33
                     Option('dry-run', help='show files to delete instead of'
50
34
                            ' deleting them.')]
51
 
    def run(self, unknown=False, ignored=False, detritus=False, dry_run=False):
 
35
    def run(self, ignored=False, detritus=False, dry_run=False):
52
36
        from clean_tree import clean_tree
53
 
        if not (unknown or ignored or detritus):
54
 
            unknown = True
55
 
        clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus, 
56
 
                   dry_run=dry_run)
 
37
        clean_tree('.', ignored=ignored, detritus=detritus, dry_run=dry_run)
57
38
 
58
39
class cmd_graph_ancestry(bzrlib.commands.Command):
59
 
    """Produce ancestry graphs using dot.
 
40
    """Produce ancestry graphs using dot.  <BZRTOOLS>
60
41
    
61
42
    Output format is detected according to file extension.  Some of the more
62
43
    common output formats are html, png, gif, svg, ps.  An extension of '.dot'
108
89
                                  not no_antialias, merge_branch, ranking)
109
90
 
110
91
class cmd_fetch_ghosts(bzrlib.commands.Command):
111
 
    """Attempt to retrieve ghosts from another branch.
 
92
    """Attempt to retrieve ghosts from another branch.  <BZRTOOLS>
112
93
    If the other branch is not supplied, the last-pulled branch is used.
113
94
    """
114
95
    aliases = ['fetch-missing']
123
104
Option.OPTIONS['bzrdiff'] = Option('bzrdiff',type=None,
124
105
                                help="""Handle extra bzr tags""")
125
106
class cmd_patch(bzrlib.commands.Command):
126
 
    """Apply a named patch to the current tree.
 
107
    """Apply a named patch to the current tree.  <BZRTOOLS>
127
108
    """
128
109
    takes_args = ['filename?']
129
110
    takes_options = [Option('strip', type=int, help=strip_help)]
138
119
        return patch(wt, filename, strip, legacy= not bzrdiff)
139
120
 
140
121
class cmd_shelve(bzrlib.commands.Command):
141
 
    """Temporarily set aside some changes from the current tree.
 
122
    """Temporarily set aside some changes from the current tree.  <BZRTOOLS>
142
123
 
143
124
    Shelve allows you to temporarily put changes you've made "on the shelf",
144
125
    ie. out of the way, until a later time when you can bring them back from
152
133
    By default shelve asks you what you want to shelve, press '?' at the
153
134
    prompt to get help. To shelve everything run shelve --all.
154
135
 
 
136
    You can put multiple items on the shelf, each time you run unshelve the
 
137
    most recently shelved changes will be reinstated.
 
138
 
155
139
    If filenames are specified, only the changes to those files will be
156
140
    shelved, other files will be left untouched.
157
141
 
158
142
    If a revision is specified, changes since that revision will be shelved.
159
 
 
160
 
    You can put multiple items on the shelf. Normally each time you run
161
 
    unshelve the most recently shelved changes will be reinstated. However,
162
 
    you can also unshelve changes in a different order by explicitly
163
 
    specifiying which changes to unshelve. This works best when the changes
164
 
    don't depend on each other.
165
143
    """
166
144
 
167
145
    takes_args = ['file*']
181
159
        s.shelve(source, all, message)
182
160
        return 0
183
161
 
184
 
 
185
 
# The following classes are only used as subcommands for 'shelf', they're
186
 
# not to be registered directly with bzr.
187
 
 
188
 
class cmd_shelf_list(bzrlib.commands.Command):
189
 
    """List the patches on the current shelf."""
190
 
    aliases = ['list', 'ls']
191
 
    def run(self):
192
 
        self.shelf.list()
193
 
 
194
 
 
195
 
class cmd_shelf_delete(bzrlib.commands.Command):
196
 
    """Delete the patch from the current shelf."""
197
 
    aliases = ['delete', 'del']
198
 
    takes_args = ['patch']
199
 
    def run(self, patch):
200
 
        self.shelf.delete(patch)
201
 
 
202
 
 
203
 
class cmd_shelf_switch(bzrlib.commands.Command):
204
 
    """Switch to the other shelf, create it if necessary."""
205
 
    aliases = ['switch']
206
 
    takes_args = ['othershelf']
207
 
    def run(self, othershelf):
208
 
        s = Shelf(self.shelf.base, othershelf)
209
 
        s.make_default()
210
 
 
211
 
 
212
 
class cmd_shelf_show(bzrlib.commands.Command):
213
 
    """Show the contents of the specified or topmost patch."""
214
 
    aliases = ['show', 'cat', 'display']
215
 
    takes_args = ['patch?']
216
 
    def run(self, patch=None):
217
 
        self.shelf.display(patch)
218
 
 
219
 
 
220
 
class cmd_shelf_upgrade(bzrlib.commands.Command):
221
 
    """Upgrade old format shelves."""
222
 
    aliases = ['upgrade']
223
 
    def run(self):
224
 
        self.shelf.upgrade()
225
 
 
226
 
 
227
162
class cmd_shelf(bzrlib.commands.Command):
228
 
    """Perform various operations on your shelved patches. See also shelve."""
 
163
    """Perform various operations on your shelved patches. See also shelve.
 
164
 
 
165
    Subcommands:
 
166
        list   (ls)           List the patches on the current shelf.
 
167
        delete (del) <patch>  Delete a patch from the current shelf.
 
168
        switch       <shelf>  Switch to the named shelf, create it if necessary.
 
169
        show         <patch>  Show the contents of the specified patch.
 
170
        upgrade               Upgrade old format shelves.
 
171
    """
229
172
    takes_args = ['subcommand', 'args*']
230
173
 
231
 
    subcommands = [cmd_shelf_list, cmd_shelf_delete, cmd_shelf_switch,
232
 
        cmd_shelf_show, cmd_shelf_upgrade]
233
 
 
234
174
    def run(self, subcommand, args_list):
235
175
        import sys
236
176
 
237
 
        cmd = self._get_cmd_object(subcommand)
238
177
        source = BzrPatchSource()
239
178
        s = Shelf(source.base)
240
 
        cmd.shelf = s
241
 
        return cmd.run_argv_aliases(args_list)
242
 
 
243
 
    def _get_cmd_object(self, cmd_name):
244
 
        for cmd_class in self.subcommands:
245
 
            for alias in cmd_class.aliases:
246
 
                if alias == cmd_name:
247
 
                    return cmd_class()
248
 
        raise CommandError("Unknown shelf subcommand '%s'" % cmd_name)
249
 
 
250
 
    def help(self):
251
 
        text = ["%s\n\nSubcommands:\n" % self.__doc__]
252
 
 
253
 
        for cmd_class in self.subcommands:
254
 
            text.extend(self.sub_help(cmd_class) + ['\n'])
255
 
 
256
 
        return ''.join(text)
257
 
 
258
 
    def sub_help(self, cmd_class):
259
 
        text = []
260
 
        cmd_obj = cmd_class()
261
 
        indent = 2 * ' '
262
 
 
263
 
        usage = command_usage(cmd_obj)
264
 
        usage = usage.replace('bzr shelf-', '')
265
 
        text.append('%s%s\n' % (indent, usage))
266
 
 
267
 
        text.append('%s%s\n' % (2 * indent, cmd_class.__doc__))
268
 
 
269
 
        # Somewhat copied from bzrlib.help.help_on_command_options
270
 
        option_help = []
271
 
        for option_name, option in sorted(cmd_obj.options().items()):
272
 
            if option_name == 'help':
273
 
                continue
274
 
            option_help.append('%s--%s' % (3 * indent, option_name))
275
 
            if option.type is not None:
276
 
                option_help.append(' %s' % option.argname.upper())
277
 
            if option.short_name():
278
 
                option_help.append(', -%s' % option.short_name())
279
 
            option_help.append('%s%s\n' % (2 * indent, option.help))
280
 
 
281
 
        if len(option_help) > 0:
282
 
            text.append('%soptions:\n' % (2 * indent))
283
 
            text.extend(option_help)
284
 
 
285
 
        return text
286
 
 
 
179
 
 
180
        if subcommand == 'ls' or subcommand == 'list':
 
181
            self.__check_no_args(args_list, "shelf list takes no arguments!")
 
182
            s.list()
 
183
        elif subcommand == 'delete' or subcommand == 'del':
 
184
            self.__check_one_arg(args_list, "shelf delete takes one argument!")
 
185
            s.delete(args_list[0])
 
186
        elif subcommand == 'switch':
 
187
            self.__check_one_arg(args_list, "shelf switch takes one argument!")
 
188
            s = Shelf(source.base, args_list[0])
 
189
            s.make_default()
 
190
        elif subcommand == 'show':
 
191
            self.__check_one_arg(args_list, "shelf show takes one argument!")
 
192
            s.display(args_list[0])
 
193
        elif subcommand == 'upgrade':
 
194
            self.__check_no_args(args_list, "shelf upgrade takes no arguments!")
 
195
            s.upgrade()
 
196
        else:
 
197
            raise CommandError("Unknown shelf subcommand '%s'" % subcommand)
 
198
 
 
199
    def __check_one_arg(self, args, msg):
 
200
        if args is None or len(args) != 1:
 
201
            raise CommandError(msg)
 
202
 
 
203
    def __check_no_args(self, args, msg):
 
204
        if args is not None:
 
205
            raise CommandError(msg)
287
206
 
288
207
 
289
208
class cmd_unshelve(bzrlib.commands.Command):
290
 
    """Restore shelved changes.
291
 
 
292
 
    By default the most recently shelved changes are restored. However if you
293
 
    specify a patch by name those changes will be restored instead.
294
 
 
 
209
    """Restore the most recently shelved changes to current tree.  <BZRTOOLS>
295
210
    See 'shelve' for more information.
296
211
    """
297
212
    takes_options = [
298
213
            Option('all', help='Unshelve all changes without prompting'),
299
214
            Option('force', help='Force unshelving even if errors occur'),
300
215
    ]
301
 
    takes_args = ['patch?']
302
 
    def run(self, patch=None, all=False, force=False):
 
216
    def run(self, all=False, force=False):
303
217
        source = BzrPatchSource()
304
218
        s = Shelf(source.base)
305
 
        s.unshelve(source, patch, all, force)
 
219
        s.unshelve(source, all, force)
306
220
        return 0
307
221
 
308
222
 
309
223
class cmd_shell(bzrlib.commands.Command):
310
 
    """Begin an interactive shell tailored for bzr.
 
224
    """Begin an interactive shell tailored for bzr.  <BZRTOOLS>
311
225
    Bzr commands can be used without typing bzr first, and will be run natively
312
226
    when possible.  Tab completion is tailored for bzr.  The shell prompt shows
313
227
    the branch nick, revno, and path.
330
244
 
331
245
class cmd_branch_history(bzrlib.commands.Command):
332
246
    """\
333
 
    Display the development history of a branch.
 
247
    Display the development history of a branch  <BZRTOOLS>.
334
248
 
335
249
    Each different committer or branch nick is considered a different line of
336
250
    development.  Committers are treated as the same if they have the same
344
258
 
345
259
class cmd_zap(bzrlib.commands.Command):
346
260
    """\
347
 
    Remove a lightweight checkout, if it can be done safely.
348
 
 
349
 
    This command will remove a lightweight checkout without losing data.  That
350
 
    means it only removes lightweight checkouts, and only if they have no
351
 
    uncommitted changes.
352
 
 
353
 
    If --branch is specified, the branch will be deleted too, but only if the
354
 
    the branch has no new commits (relative to its parent).
 
261
    Remove a checkout, if it can be done safely. <BZRTOOLS>
 
262
 
 
263
    This command will remove a checkout without losing data.  That means
 
264
    it only removes checkouts, and only if they have no uncommitted changes.
355
265
    """
356
266
    takes_options = [Option("branch", help="Remove associtated branch from"
357
267
                                           " repository")]
363
273
 
364
274
class cmd_cbranch(bzrlib.commands.Command):
365
275
    """
366
 
    Create a new checkout, associated with a new repository branch.
 
276
    Create a new checkout, associated with a new repository branch. <BZRTOOLS>
367
277
    
368
278
    When you cbranch, bzr looks up the repository associated with your current
369
279
    directory in branches.conf.  It creates a new branch in that repository
381
291
    be produced if the source branch is in 0.7 format (or earlier).
382
292
    """
383
293
    takes_options = [Option("lightweight", 
384
 
                            help="Create a lightweight checkout"), 'revision']
 
294
                            help="Create a lightweight checkout")]
385
295
    takes_args = ["source", "target?"]
386
 
    def run(self, source, target=None, lightweight=False, revision=None):
 
296
    def run(self, source, target=None, lightweight=False):
387
297
        from cbranch import cbranch
388
 
        return cbranch(source, target, lightweight=lightweight, 
389
 
                       revision=revision)
 
298
        return cbranch(source, target, lightweight=lightweight)
390
299
 
391
300
 
392
301
class cmd_branches(bzrlib.commands.Command):
393
 
    """Scan a location for branches"""
 
302
    """Scan a location for branches <BZRTOOLS>"""
394
303
    takes_args = ["location?"]
395
304
    def run(self, location=None):
396
305
        from branches import branches
398
307
 
399
308
 
400
309
class cmd_multi_pull(bzrlib.commands.Command):
401
 
    """Pull all the branches under a location, e.g. a repository.
 
310
    """Pull all the branches under a location, e.g. a repository. <BZRTOOLS>
402
311
    
403
312
    Both branches present in the directory and the branches of checkouts are
404
313
    pulled.
455
364
        branch_mark(mark, branch, delete)
456
365
 
457
366
class cmd_import(bzrlib.commands.Command):
458
 
    """Import sources from a tarball
 
367
    """Import sources from a tarball <BZRTOOLS>
459
368
    
460
369
    This command will import a tarball into a bzr tree, replacing any versioned
461
370
    files already present.  If a directory is specified, it is used as the
474
383
        do_import(source, tree)
475
384
 
476
385
class cmd_shove(bzrlib.commands.Command):
477
 
    """Apply uncommitted changes to another tree
 
386
    """Apply uncommitted changes to another tree <BZRTOOLS>
478
387
    
479
388
    This is useful when you start to make changes in one tree, then realize
480
389
    they should really be done in a different tree.
491
400
        from shove import do_shove
492
401
        do_shove(source, target)
493
402
 
494
 
class cmd_cdiff(bzrlib.commands.Command):
495
 
    """A color version of bzr's diff"""
496
 
    takes_args = property(lambda x: get_cmd_object('diff').takes_args)
497
 
    takes_options = property(lambda x: get_cmd_object('diff').takes_options)
498
 
    def run(*args, **kwargs):
499
 
        from colordiff import colordiff
500
 
        colordiff(*args, **kwargs)
501
403
 
502
404
commands = [cmd_shelve, cmd_unshelve, cmd_shelf, cmd_clean_tree,
503
405
            cmd_graph_ancestry, cmd_fetch_ghosts, cmd_patch, cmd_shell,
504
406
            cmd_branch_history, cmd_zap, cmd_cbranch, cmd_branches, 
505
 
            cmd_multi_pull, cmd_switch, cmd_branch_mark, cmd_import, cmd_shove,
506
 
            cmd_cdiff]
507
 
 
508
 
 
 
407
            cmd_multi_pull, cmd_switch, cmd_branch_mark, cmd_import, cmd_shove]
 
408
 
 
409
 
 
410
import bzrlib.builtins
509
411
commands.append(rspush.cmd_rspush)
510
412
 
511
413
from errors import NoPyBaz
516
418
 
517
419
except NoPyBaz:
518
420
    class cmd_baz_import_branch(bzrlib.commands.Command):
519
 
        """Disabled. (Requires PyBaz)"""
 
421
        """Disabled. (Requires PyBaz)   <BZRTOOLS>"""
520
422
        takes_args = ['to_location?', 'from_branch?', 'reuse_history*']
521
423
        takes_options = ['verbose', Option('max-count', type=int)]
522
424
        def run(self, to_location=None, from_branch=None, fast=False, 
526
428
 
527
429
 
528
430
    class cmd_baz_import(bzrlib.commands.Command):
529
 
        """Disabled. (Requires PyBaz)"""
 
431
        """Disabled. (Requires PyBaz)   <BZRTOOLS>"""
530
432
        takes_args = ['to_root_dir?', 'from_archive?', 'reuse_history*']
531
433
        takes_options = ['verbose', Option('prefixes', type=str,
532
434
                         help="Prefixes of branches to import")]