~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to command_classes.py

  • Committer: Aaron Bentley
  • Date: 2012-01-20 02:07:15 UTC
  • Revision ID: aaron@aaronbentley.com-20120120020715-ar6jbqnrjcuebggz
Tags: release-2.5
Update for 2.5 release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Aaron Bentley <aaron@aaronbentley.com>
2
 
# Copyright (C) 2005, 2006 Canonical Limited.
 
1
# Copyright (C) 2005, 2006, 2007, 2011 Aaron Bentley <aaron@aaronbentley.com>
 
2
# Copyright (C) 2005, 2006, 2011 Canonical Limited.
3
3
# Copyright (C) 2006 Michael Ellerman.
4
4
#
5
5
#    This program is free software; you can redistribute it and/or modify
21
21
from bzrlib.lazy_import import lazy_import
22
22
lazy_import(globals(), """
23
23
from bzrlib import help, urlutils
24
 
import shelf
 
24
from bzrlib.plugins.bzrtools import shelf
25
25
""")
26
26
 
 
27
from bzrlib.plugins import bzrtools
27
28
from command import BzrToolsCommand
28
29
from errors import CommandError
29
30
from patchsource import BzrPatchSource
30
 
import sys
31
 
import os.path
32
31
 
33
 
import bzrlib.builtins
34
32
import bzrlib.commands
35
33
from bzrlib.branch import Branch
36
 
from bzrlib.bzrdir import BzrDir
37
34
from bzrlib.commands import get_cmd_object
38
35
from bzrlib.errors import BzrCommandError
39
 
import bzrlib.ignores
40
 
from bzrlib.trace import note
41
 
from bzrlib.option import Option
42
 
 
43
 
from command import BzrToolsCommand
44
 
 
45
 
 
46
 
class cmd_clean_tree(BzrToolsCommand):
47
 
    """Remove unwanted files from working tree.
48
 
 
49
 
    By default, only unknown files, not ignored files, are deleted.  Versioned
50
 
    files are never deleted.
51
 
 
52
 
    Another class is 'detritus', which includes files emitted by bzr during
53
 
    normal operations and selftests.  (The value of these files decreases with
54
 
    time.)
55
 
 
56
 
    If no options are specified, unknown files are deleted.  Otherwise, option
57
 
    flags are respected, and may be combined.
58
 
 
59
 
    To check what clean-tree will do, use --dry-run.
60
 
    """
61
 
    takes_options = [Option('ignored', help='Delete all ignored files.'),
62
 
                     Option('detritus', help='Delete conflict files, merge'
63
 
                            ' backups, and failed selftest dirs.'),
64
 
                     Option('unknown',
65
 
                            help='Delete files unknown to bzr (default).'),
66
 
                     Option('dry-run', help='Show files to delete instead of'
67
 
                            ' deleting them.'),
68
 
                     Option('force', help='Do not prompt before deleting.')]
69
 
    def run(self, unknown=False, ignored=False, detritus=False, dry_run=False,
70
 
            force=False):
71
 
        from clean_tree import clean_tree
72
 
        if not (unknown or ignored or detritus):
73
 
            unknown = True
74
 
        if dry_run:
75
 
            force = True
76
 
        clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus, 
77
 
                   dry_run=dry_run, no_prompt=force)
 
36
from bzrlib.option import Option, RegistryOption
78
37
 
79
38
 
80
39
class cmd_graph_ancestry(BzrToolsCommand):
81
40
    """Produce ancestry graphs using dot.
82
 
    
 
41
 
83
42
    Output format is detected according to file extension.  Some of the more
84
43
    common output formats are html, png, gif, svg, ps.  An extension of '.dot'
85
44
    will cause a dot graph file to be produced.  HTML output has mouseovers
151
110
    takes_options = [Option('no-fix', help="Skip additional synchonization.")]
152
111
    def run(self, branch=None, no_fix=False):
153
112
        from fetch_ghosts import fetch_ghosts
154
 
        fetch_ghosts(branch, no_fix)
 
113
        fetch_ghosts(branch, do_reconcile=not no_fix)
155
114
 
156
115
strip_help="""Strip the smallest prefix containing num leading slashes  from \
157
116
each file name found in the patch file."""
161
120
    """Apply a named patch to the current tree.
162
121
    """
163
122
    takes_args = ['filename?']
164
 
    takes_options = [Option('strip', type=int, help=strip_help),
 
123
    takes_options = [Option('strip', type=int, short_name='p',
 
124
                            help=strip_help),
165
125
                     Option('silent', help='Suppress chatter.')]
166
126
    def run(self, filename=None, strip=None, silent=False):
167
127
        from patch import patch
199
159
    don't depend on each other.
200
160
 
201
161
    While you have patches on the shelf you can view and manipulate them with
202
 
    the 'shelf' command. Run 'bzr shelf -h' for more info.
 
162
    the 'shelf1' command. Run 'bzr shelf1 -h' for more info.
203
163
    """
204
164
 
205
 
    aliases = ['shelve']
206
165
    takes_args = ['file*']
207
166
    takes_options = [Option('message',
208
167
            help='A message to associate with the shelved changes.',
226
185
        return 0
227
186
 
228
187
 
229
 
# The following classes are only used as subcommands for 'shelf', they're
 
188
# The following classes are only used as subcommands for 'shelf1', they're
230
189
# not to be registered directly with bzr.
231
190
 
232
191
class cmd_shelf_list(bzrlib.commands.Command):
268
227
        self.shelf.upgrade()
269
228
 
270
229
 
271
 
class cmd_shelf(BzrToolsCommand):
 
230
class cmd_shelf1(BzrToolsCommand):
272
231
    """Perform various operations on your shelved patches. See also shelve1."""
273
232
    takes_args = ['subcommand', 'args*']
274
233
 
342
301
 
343
302
    See 'shelve1' for more information.
344
303
    """
345
 
    aliases = ['unshelve']
346
304
    takes_options = [
347
305
            Option('all', help='Unshelve all changes without prompting.'),
348
306
            Option('force', help='Force unshelving even if errors occur.'),
374
332
    --all        --help       --revision   --show-ids
375
333
    bzr bzrtools:287/> status --
376
334
    """
377
 
    def run(self):
 
335
    takes_options = [
 
336
        Option('directory',
 
337
            help='Branch in which to start the shell, '
 
338
                 'rather than the one containing the working directory.',
 
339
            short_name='d',
 
340
            type=unicode,
 
341
            ),
 
342
        ]
 
343
    def run(self, directory=None):
378
344
        import shell
379
 
        return shell.run_shell()
 
345
        return shell.run_shell(directory)
380
346
 
381
347
 
382
348
class cmd_branch_history(BzrToolsCommand):
403
369
 
404
370
    If --branch is specified, the branch will be deleted too, but only if the
405
371
    the branch has no new commits (relative to its parent).
 
372
 
 
373
    If bzr-pipeline is also installed, the --store option will store changes
 
374
    in the branch before deleting the tree.  To restore the changes, do::
 
375
 
 
376
      bzr checkout --lightweight $BRANCH $CHECKOUT
 
377
      bzr switch-pipe -d $CHECKOUT `bzr nick -d $CHECKOUT`
406
378
    """
407
379
    takes_options = [Option("branch", help="Remove associated branch from"
408
380
                                           " repository."),
409
 
                     Option('force', help='Delete tree even if contents are'
410
 
                     ' modified.')]
 
381
                     RegistryOption('change_policy',
 
382
                                    'How to handle changed files',
 
383
                                    lazy_registry =
 
384
                                    ('bzrlib.plugins.bzrtools.zap',
 
385
                                        'change_policy_registry'),
 
386
                                    value_switches=True,
 
387
                                    enum_switch=False)]
411
388
    takes_args = ["checkout"]
412
 
    def run(self, checkout, branch=False, force=False):
413
 
        from zap import zap
414
 
        return zap(checkout, remove_branch=branch, allow_modified=force)
 
389
    def run(self, checkout, branch=False, change_policy=None):
 
390
        from zap import (
 
391
            change_policy_registry,
 
392
            StoreChanges,
 
393
            zap,
 
394
        )
 
395
        if change_policy is None:
 
396
            change_policy = change_policy_registry.get()
 
397
        if change_policy is StoreChanges:
 
398
            try:
 
399
                import bzrlib.plugins.pipeline
 
400
            except ImportError:
 
401
                raise BzrCommandError('--store requires bzr-pipeline.')
 
402
        return zap(checkout, remove_branch=branch, policy=change_policy)
415
403
 
416
404
 
417
405
class cmd_cbranch(BzrToolsCommand):
450
438
                       hardlink=hardlink)
451
439
 
452
440
 
453
 
class cmd_branches(BzrToolsCommand):
 
441
class cmd_list_branches(BzrToolsCommand):
454
442
    """Scan a location for branches"""
 
443
    @property
 
444
    def aliases(self):
 
445
        from bzrlib import commands
 
446
        return commands.plugin_cmds.get_info('list-branches').aliases
 
447
 
455
448
    takes_args = ["location?"]
456
449
    def run(self, location=None):
457
450
        from branches import branches
534
527
    """A color version of bzr's diff"""
535
528
    takes_args = property(lambda x: get_cmd_object('diff').takes_args)
536
529
    takes_options = list(get_cmd_object('diff').takes_options) + [
 
530
        RegistryOption.from_kwargs('color',
 
531
            'Color mode to use.',
 
532
            title='Color Mode', value_switches=False, enum_switch=True,
 
533
            never='Never colorize output.',
 
534
            auto='Only colorize output if terminal supports it and STDOUT is a'
 
535
            ' TTY.',
 
536
            always='Always colorize output (default).'),
537
537
        Option('check-style',
538
538
            help='Warn if trailing whitespace or spurious changes have been'
539
539
                 ' added.')]
540
540
 
541
 
    def run(self, check_style=False, *args, **kwargs):
 
541
    def run(self, color='always', check_style=False, *args, **kwargs):
542
542
        from colordiff import colordiff
543
 
        colordiff(check_style, *args, **kwargs)
 
543
        colordiff(color, check_style, *args, **kwargs)
 
544
 
 
545
 
 
546
class cmd_conflict_diff(BzrToolsCommand):
 
547
 
 
548
    """Compare a conflicted file against BASE."""
 
549
 
 
550
    encoding_type = 'exact'
 
551
    takes_args = ['file*']
 
552
    takes_options = [
 
553
        RegistryOption.from_kwargs('direction', 'Direction of comparison.',
 
554
            value_switches=True, enum_switch=False,
 
555
            other='Compare OTHER against common base.',
 
556
            this='Compare THIS against common base.')]
 
557
 
 
558
    def run(self, file_list, direction='other'):
 
559
        from bzrlib.plugins.bzrtools.colordiff import DiffWriter
 
560
        from conflict_diff import ConflictDiffer
 
561
        dw = DiffWriter(self.outf, check_style=False, color='auto')
 
562
        ConflictDiffer().run(dw, file_list, direction)
544
563
 
545
564
 
546
565
class cmd_rspush(BzrToolsCommand):
587
606
        finally:
588
607
            target_tree.unlock()
589
608
 
590
 
from heads import cmd_heads
591
 
commands = [
592
 
            cmd_branches,
593
 
            cmd_branch_history,
594
 
            cmd_cbranch,
595
 
            cmd_cdiff,
596
 
            cmd_clean_tree,
597
 
            cmd_fetch_ghosts,
598
 
            cmd_graph_ancestry,
599
 
            cmd_heads,
600
 
            cmd_import,
601
 
            cmd_link_tree,
602
 
            cmd_multi_pull,
603
 
            cmd_patch,
604
 
            cmd_rspush,
605
 
            cmd_shelf,
606
 
            cmd_shell,
607
 
            cmd_shelve1,
608
 
            cmd_trees,
609
 
            cmd_unshelve1,
610
 
            cmd_zap,
611
 
            ]
612
 
 
 
609
 
 
610
class cmd_create_mirror(BzrToolsCommand):
 
611
    """Create a mirror of another branch.
 
612
 
 
613
    This is similar to `bzr branch`, but copies more settings, including the
 
614
    submit branch and nickname.
 
615
 
 
616
    It sets the public branch and parent of the target to the source location.
 
617
    """
 
618
 
 
619
    takes_args = ['source', 'target']
 
620
 
 
621
    def run(self, source, target):
 
622
        source_branch = Branch.open(source)
 
623
        from bzrlib.plugins.bzrtools.mirror import create_mirror
 
624
        create_mirror(source_branch, target, [])