~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to __init__.py

  • Committer: Aaron Bentley
  • Date: 2007-06-11 05:08:34 UTC
  • Revision ID: aaron.bentley@utoronto.ca-20070611050834-wcbta2pfitcuopku
fix long-line detection

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Aaron Bentley <aaron@aaronbentley.com>
 
1
# Copyright (C) 2005, 2006, 2007 Aaron Bentley <aaron.bentley@utoronto.ca>
2
2
# Copyright (C) 2005, 2006 Canonical Limited.
3
3
# Copyright (C) 2006 Michael Ellerman.
4
4
#
22
22
 
23
23
import bzrlib
24
24
 
 
25
 
 
26
__version__ = '0.17.0'
 
27
 
 
28
 
 
29
version_info = tuple(int(n) for n in __version__.split('.'))
 
30
 
 
31
 
 
32
def check_bzrlib_version(desired):
 
33
    """Check that bzrlib is compatible.
 
34
 
 
35
    If version is < bzrtools version, assume incompatible.
 
36
    If version == bzrtools version, assume completely compatible
 
37
    If version == bzrtools version + 1, assume compatible, with deprecations
 
38
    Otherwise, assume incompatible.
 
39
    """
 
40
    desired_plus = (desired[0], desired[1]+1)
 
41
    bzrlib_version = bzrlib.version_info[:2]
 
42
    if bzrlib_version == desired or (bzrlib_version == desired_plus and
 
43
                                     bzrlib.version_info[3] == 'dev'):
 
44
        return
 
45
    try:
 
46
        from bzrlib.trace import warning
 
47
    except ImportError:
 
48
        # get the message out any way we can
 
49
        from warnings import warn as warning
 
50
    if bzrlib_version < desired:
 
51
        warning('Installed Bazaar version %s is too old to be used with'
 
52
                ' plugin \n'
 
53
                '"Bzrtools" %s.' % (bzrlib.__version__, __version__))
 
54
        # Not using BzrNewError, because it may not exist.
 
55
        raise Exception, ('Version mismatch', version_info)
 
56
    else:
 
57
        warning('Plugin "Bzrtools" is not up to date with installed Bazaar'
 
58
                ' version %s.\n'
 
59
                ' There should be a newer version of Bzrtools available, e.g.'
 
60
                ' %i.%i.'
 
61
                % (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
 
62
        if bzrlib_version != desired_plus:
 
63
            raise Exception, 'Version mismatch'
 
64
 
 
65
 
 
66
check_bzrlib_version(version_info[:2])
 
67
 
25
68
from bzrlib.lazy_import import lazy_import
26
69
lazy_import(globals(), """
27
 
from bzrlib import help, urlutils
 
70
from bzrlib import help
28
71
import shelf
29
72
""")
30
73
 
31
 
from version import version_info, __version__
32
 
from command import BzrToolsCommand
33
74
from errors import CommandError, NoPyBaz
34
75
from patchsource import BzrPatchSource
35
76
import sys
37
78
 
38
79
import bzrlib.builtins
39
80
import bzrlib.commands
40
 
from bzrlib.branch import Branch
41
 
from bzrlib.bzrdir import BzrDir
42
81
from bzrlib.commands import get_cmd_object
43
82
from bzrlib.errors import BzrCommandError
44
83
import bzrlib.ignores
45
 
from bzrlib.trace import note
46
84
from bzrlib.option import Option
47
85
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
48
86
                                                 "external")))
49
87
 
50
88
import show_paths
51
 
from command import BzrToolsCommand
52
89
 
53
90
bzrlib.ignores.add_runtime_ignores(['./.shelf'])
54
91
 
55
92
 
56
 
class cmd_clean_tree(BzrToolsCommand):
 
93
class cmd_clean_tree(bzrlib.commands.Command):
57
94
    """Remove unwanted files from working tree.
58
95
 
59
96
    By default, only unknown files, not ignored files, are deleted.  Versioned
68
105
 
69
106
    To check what clean-tree will do, use --dry-run.
70
107
    """
71
 
    takes_options = [Option('ignored', help='Delete all ignored files.'),
72
 
                     Option('detritus', help='Delete conflict files, merge'
 
108
    takes_options = [Option('ignored', help='delete all ignored files.'),
 
109
                     Option('detritus', help='delete conflict files, merge'
73
110
                            ' backups, and failed selftest dirs.'),
74
111
                     Option('unknown',
75
 
                            help='Delete files unknown to bzr (default).'),
76
 
                     Option('dry-run', help='Show files to delete instead of'
 
112
                            help='delete files unknown to bzr.  (default)'),
 
113
                     Option('dry-run', help='show files to delete instead of'
77
114
                            ' deleting them.')]
78
115
    def run(self, unknown=False, ignored=False, detritus=False, dry_run=False):
79
116
        from clean_tree import clean_tree
83
120
                   dry_run=dry_run)
84
121
 
85
122
 
86
 
class cmd_graph_ancestry(BzrToolsCommand):
 
123
class cmd_graph_ancestry(bzrlib.commands.Command):
87
124
    """Produce ancestry graphs using dot.
88
125
    
89
126
    Output format is detected according to file extension.  Some of the more
118
155
    If available, rsvg is used to antialias PNG and JPEG output, but this can
119
156
    be disabled with --no-antialias.
120
157
    """
121
 
    takes_args = ['file', 'merge_branch?']
122
 
    takes_options = [Option('no-collapse', help="Do not skip simple nodes."),
 
158
    takes_args = ['branch', 'file']
 
159
    takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
123
160
                     Option('no-antialias',
124
 
                     help="Do not use rsvg to produce antialiased output."),
 
161
                     help="Do not use rsvg to produce antialiased output"),
125
162
                     Option('merge-branch', type=str,
126
 
                     help="Use this branch to calcuate a merge base."),
 
163
                     help="Use this branch to calcuate a merge base"),
127
164
                     Option('cluster', help="Use clustered output."),
128
 
                     Option('max-distance',
129
 
                            help="Show no nodes farther than this.", type=int),
130
 
                     Option('directory',
131
 
                            help='Source branch to use (default is current'
132
 
                            ' directory).',
133
 
                            short_name='d',
134
 
                            type=unicode),
135
 
                    ]
136
 
    def run(self, file, merge_branch=None, no_collapse=False,
137
 
            no_antialias=False, cluster=False, max_distance=100,
138
 
            directory='.'):
139
 
        if max_distance == -1:
140
 
            max_distance = None
 
165
                     Option('max-distance', help="Show no nodes farther than this",
 
166
                            type=int)]
 
167
    def run(self, branch, file, no_collapse=False, no_antialias=False,
 
168
        merge_branch=None, cluster=False, max_distance=None):
141
169
        import graph
142
170
        if cluster:
143
171
            ranking = "cluster"
144
172
        else:
145
173
            ranking = "forced"
146
 
        graph.write_ancestry_file(directory, file, not no_collapse,
 
174
        graph.write_ancestry_file(branch, file, not no_collapse,
147
175
                                  not no_antialias, merge_branch, ranking,
148
176
                                  max_distance=max_distance)
149
177
 
150
178
 
151
 
class cmd_fetch_ghosts(BzrToolsCommand):
 
179
class cmd_fetch_ghosts(bzrlib.commands.Command):
152
180
    """Attempt to retrieve ghosts from another branch.
153
181
    If the other branch is not supplied, the last-pulled branch is used.
154
182
    """
155
183
    aliases = ['fetch-missing']
156
184
    takes_args = ['branch?']
157
 
    takes_options = [Option('no-fix', help="Skip additional synchonization.")]
 
185
    takes_options = [Option('no-fix')]
158
186
    def run(self, branch=None, no_fix=False):
159
187
        from fetch_ghosts import fetch_ghosts
160
188
        fetch_ghosts(branch, no_fix)
163
191
each file name found in the patch file."""
164
192
 
165
193
 
166
 
class cmd_patch(BzrToolsCommand):
 
194
class cmd_patch(bzrlib.commands.Command):
167
195
    """Apply a named patch to the current tree.
168
196
    """
169
197
    takes_args = ['filename?']
170
198
    takes_options = [Option('strip', type=int, help=strip_help),
171
 
                     Option('silent', help='Suppress chatter.')]
 
199
                     Option('silent', help='Suppress chatter')]
172
200
    def run(self, filename=None, strip=None, silent=False):
173
201
        from patch import patch
174
202
        from bzrlib.workingtree import WorkingTree
178
206
        return patch(wt, filename, strip, silent)
179
207
 
180
208
 
181
 
class cmd_shelve(BzrToolsCommand):
 
209
class cmd_shelve(bzrlib.commands.Command):
182
210
    """Temporarily set aside some changes from the current tree.
183
211
 
184
212
    Shelve allows you to temporarily put changes you've made "on the shelf",
209
237
    """
210
238
 
211
239
    takes_args = ['file*']
212
 
    takes_options = [Option('message',
213
 
            help='A message to associate with the shelved changes.',
214
 
            short_name='m', type=unicode),
215
 
            'revision',
216
 
            Option('all', help='Shelve all changes without prompting.'),
217
 
            Option('no-color', help='Never display changes in color.')]
 
240
    takes_options = ['message', 'revision',
 
241
            Option('all', help='Shelve all changes without prompting'),
 
242
            Option('no-color', help='Never display changes in color')]
218
243
 
219
244
    def run(self, all=False, file_list=None, message=None, revision=None,
220
245
            no_color=False):
273
298
        self.shelf.upgrade()
274
299
 
275
300
 
276
 
class cmd_shelf(BzrToolsCommand):
 
301
class cmd_shelf(bzrlib.commands.Command):
277
302
    """Perform various operations on your shelved patches. See also shelve."""
278
303
    takes_args = ['subcommand', 'args*']
279
304
 
339
364
        return text
340
365
 
341
366
 
342
 
class cmd_unshelve(BzrToolsCommand):
 
367
class cmd_unshelve(bzrlib.commands.Command):
343
368
    """Restore shelved changes.
344
369
 
345
370
    By default the most recently shelved changes are restored. However if you
348
373
    See 'shelve' for more information.
349
374
    """
350
375
    takes_options = [
351
 
            Option('all', help='Unshelve all changes without prompting.'),
352
 
            Option('force', help='Force unshelving even if errors occur.'),
353
 
            Option('no-color', help='Never display changes in color.')
 
376
            Option('all', help='Unshelve all changes without prompting'),
 
377
            Option('force', help='Force unshelving even if errors occur'),
 
378
            Option('no-color', help='Never display changes in color')
354
379
        ]
355
380
    takes_args = ['patch?']
356
381
    def run(self, patch=None, all=False, force=False, no_color=False):
360
385
        return 0
361
386
 
362
387
 
363
 
class cmd_shell(BzrToolsCommand):
 
388
class cmd_shell(bzrlib.commands.Command):
364
389
    """Begin an interactive shell tailored for bzr.
365
390
    Bzr commands can be used without typing bzr first, and will be run natively
366
391
    when possible.  Tab completion is tailored for bzr.  The shell prompt shows
383
408
        return shell.run_shell()
384
409
 
385
410
 
386
 
class cmd_branch_history(BzrToolsCommand):
 
411
class cmd_branch_history(bzrlib.commands.Command):
387
412
    """\
388
413
    Display the development history of a branch.
389
414
 
397
422
        return branch_history(branch)
398
423
 
399
424
 
400
 
class cmd_zap(BzrToolsCommand):
 
425
class cmd_zap(bzrlib.commands.Command):
401
426
    """\
402
427
    Remove a lightweight checkout, if it can be done safely.
403
428
 
408
433
    If --branch is specified, the branch will be deleted too, but only if the
409
434
    the branch has no new commits (relative to its parent).
410
435
    """
411
 
    takes_options = [Option("branch", help="Remove associated branch from"
412
 
                                           " repository."),
413
 
                     Option('force', help='Delete tree even if contents are'
414
 
                     ' modified.')]
 
436
    takes_options = [Option("branch", help="Remove associtated branch from"
 
437
                                           " repository")]
415
438
    takes_args = ["checkout"]
416
 
    def run(self, checkout, branch=False, force=False):
 
439
    def run(self, checkout, branch=False):
417
440
        from zap import zap
418
 
        return zap(checkout, remove_branch=branch, allow_modified=force)
419
 
 
420
 
 
421
 
class cmd_cbranch(BzrToolsCommand):
 
441
        return zap(checkout, remove_branch=branch)
 
442
 
 
443
 
 
444
class cmd_cbranch(bzrlib.commands.Command):
422
445
    """
423
446
    Create a new checkout, associated with a new repository branch.
424
447
 
438
461
    deprecated.
439
462
    """
440
463
    takes_options = [Option("lightweight",
441
 
                            help="Create a lightweight checkout."), 'revision',
442
 
                     Option('files-from', type=unicode,
443
 
                            help='Accelerate checkout using files from this'
444
 
                                 ' tree.'),
445
 
                     Option('hardlink',
446
 
                            help='Hard-link files from source/files-from tree'
447
 
                            ' where posible.')]
 
464
                            help="Create a lightweight checkout"), 'revision']
448
465
    takes_args = ["source", "target?"]
449
 
    def run(self, source, target=None, lightweight=False, revision=None,
450
 
            files_from=None, hardlink=False):
 
466
    def run(self, source, target=None, lightweight=False, revision=None):
451
467
        from cbranch import cbranch
452
468
        return cbranch(source, target, lightweight=lightweight,
453
 
                       revision=revision, files_from=files_from,
454
 
                       hardlink=hardlink)
455
 
 
456
 
 
457
 
class cmd_branches(BzrToolsCommand):
 
469
                       revision=revision)
 
470
 
 
471
 
 
472
class cmd_branches(bzrlib.commands.Command):
458
473
    """Scan a location for branches"""
459
474
    takes_args = ["location?"]
460
475
    def run(self, location=None):
461
476
        from branches import branches
462
477
        return branches(location)
463
478
 
464
 
class cmd_trees(BzrToolsCommand):
465
 
    """Scan a location for trees"""
466
 
    takes_args = ['location?']
467
 
    def run(self, location='.'):
468
 
        from bzrlib.workingtree import WorkingTree
469
 
        from bzrlib.transport import get_transport
470
 
        t = get_transport(location)
471
 
        for tree in WorkingTree.find_trees(location):
472
 
            self.outf.write('%s\n' % t.relpath(
473
 
                tree.bzrdir.root_transport.base))
474
479
 
475
 
class cmd_multi_pull(BzrToolsCommand):
 
480
class cmd_multi_pull(bzrlib.commands.Command):
476
481
    """Pull all the branches under a location, e.g. a repository.
477
482
 
478
483
    Both branches present in the directory and the branches of checkouts are
480
485
    """
481
486
    takes_args = ["location?"]
482
487
    def run(self, location=None):
 
488
        from bzrlib.branch import Branch
483
489
        from bzrlib.transport import get_transport
484
490
        from bzrtools import iter_branch_tree
485
491
        if location is None:
486
492
            location = '.'
487
493
        t = get_transport(location)
488
 
        possible_transports = []
489
494
        if not t.listable():
490
495
            print "Can't list this type of location."
491
496
            return 3
507
512
                relpath = base
508
513
            print "Pulling %s from %s" % (relpath, parent)
509
514
            try:
510
 
                branch_t = get_transport(parent, possible_transports)
511
 
                pullable.pull(Branch.open_from_transport(branch_t))
 
515
                pullable.pull(Branch.open(parent))
512
516
            except Exception, e:
513
517
                print e
514
518
 
515
519
 
516
 
 
517
 
class cmd_import(BzrToolsCommand):
 
520
class cmd_branch_mark(bzrlib.commands.Command):
 
521
    """
 
522
    Add, view or list branch markers <EXPERIMENTAL>
 
523
 
 
524
    To add a mark, do 'bzr branch-mark MARK'.
 
525
    To list marks, do 'bzr branch-mark' (this lists all marks for the branch's
 
526
    repository).
 
527
    To delete a mark, do 'bzr branch-mark --delete MARK'
 
528
 
 
529
    These marks can be used to track a branch's status.
 
530
    """
 
531
    takes_args = ['mark?', 'branch?']
 
532
    takes_options = [Option('delete', help='Delete this mark')]
 
533
    def run(self, mark=None, branch=None, delete=False):
 
534
        from branch_mark import branch_mark
 
535
        branch_mark(mark, branch, delete)
 
536
 
 
537
 
 
538
class cmd_import(bzrlib.commands.Command):
518
539
    """Import sources from a directory, tarball or zip file
519
540
 
520
541
    This command will import a directory, tarball or zip file into a bzr
534
555
        do_import(source, tree)
535
556
 
536
557
 
537
 
class cmd_cdiff(BzrToolsCommand):
 
558
class cmd_cdiff(bzrlib.commands.Command):
538
559
    """A color version of bzr's diff"""
539
560
    takes_args = property(lambda x: get_cmd_object('diff').takes_args)
540
 
    takes_options = list(get_cmd_object('diff').takes_options) + [
541
 
        Option('check-style',
 
561
 
 
562
    def _takes_options(self):
 
563
        options = list(get_cmd_object('diff').takes_options)
 
564
        options.append(Option('check-style',
542
565
            help='Warn if trailing whitespace or spurious changes have been'
543
 
                 ' added.')]
 
566
                 ' added.'))
 
567
        return options
 
568
 
 
569
    takes_options = property(_takes_options)
544
570
 
545
571
    def run(self, check_style=False, *args, **kwargs):
546
572
        from colordiff import colordiff
547
573
        colordiff(check_style, *args, **kwargs)
548
574
 
549
575
 
550
 
class cmd_baz_import(BzrToolsCommand):
 
576
class cmd_baz_import(bzrlib.commands.Command):
551
577
    """Import an Arch or Baz archive into a bzr repository.
552
578
 
553
579
    This command should be used on local archives (or mirrors) only.  It is
574
600
    """
575
601
    takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
576
602
    takes_options = ['verbose', Option('prefixes', type=str,
577
 
                     help="Prefixes of branches to import, colon-separated."),
 
603
                     help="Prefixes of branches to import, colon-separated"),
578
604
                     Option('encoding', type=str,
579
605
                     help='Force encoding to specified value.  See WARNING.')]
580
606
 
589
615
            print "This command is disabled.  Please install PyBaz."
590
616
 
591
617
 
592
 
class cmd_baz_import_branch(BzrToolsCommand):
 
618
class cmd_baz_import_branch(bzrlib.commands.Command):
593
619
    """Import an Arch or Baz branch into a bzr branch.
594
620
 
595
621
    WARNING: Encoding should not be specified unless necessary, because if you
600
626
    are incompatible.
601
627
    """
602
628
    takes_args = ['to_location', 'from_branch?', 'reuse_history*']
603
 
    takes_options = ['verbose', 
604
 
                     Option('max-count', type=int, 
605
 
                     help='Maximim revisions to import at once.'),
 
629
    takes_options = ['verbose', Option('max-count', type=int),
606
630
                     Option('encoding', type=str,
607
631
                     help='Force encoding to specified value.  See WARNING.')]
608
632
 
619
643
            print "This command is disabled.  Please install PyBaz."
620
644
 
621
645
 
622
 
class cmd_rspush(BzrToolsCommand):
 
646
class cmd_rspush(bzrlib.commands.Command):
623
647
    """Upload this branch to another location using rsync.
624
648
 
625
649
    If no location is specified, the last-used location will be used.  To
629
653
    """
630
654
    takes_args = ['location?']
631
655
    takes_options = [Option('overwrite', help='Ignore differences between'
632
 
                            ' branches and overwrite unconditionally.'),
 
656
                            ' branches and overwrite unconditionally'),
633
657
                     Option('no-tree', help='Do not push the working tree,'
634
658
                            ' just the .bzr.')]
635
659
 
641
665
                      working_tree=not no_tree)
642
666
 
643
667
 
644
 
class cmd_link_tree(BzrToolsCommand):
645
 
    """Hardlink matching files to another tree.
646
 
 
647
 
    Only files with identical content and execute bit will be linked.
648
 
    """
649
 
    takes_args = ['location']
650
 
 
651
 
    def run(self, location):
652
 
        from bzrlib import workingtree
653
 
        from bzrlib.plugins.bzrtools.link_tree import link_tree
654
 
        target_tree = workingtree.WorkingTree.open_containing(".")[0]
655
 
        source_tree = workingtree.WorkingTree.open(location)
656
 
        target_tree.lock_write()
657
 
        try:
658
 
            source_tree.lock_read()
659
 
            try:
660
 
                link_tree(target_tree, source_tree)
661
 
            finally:
662
 
                source_tree.unlock()
663
 
        finally:
664
 
            target_tree.unlock()
 
668
class cmd_switch(bzrlib.commands.Command):
 
669
    """Set the branch of a lightweight checkout and update."""
 
670
 
 
671
    takes_args = ['to_location']
 
672
 
 
673
    def run(self, to_location):
 
674
        from switch import cmd_switch
 
675
        cmd_switch().run(to_location)
665
676
 
666
677
 
667
678
commands = [
668
679
            cmd_baz_import,
669
680
            cmd_baz_import_branch,
670
681
            cmd_branches,
671
 
            cmd_trees,
672
682
            cmd_branch_history,
 
683
            cmd_branch_mark,
673
684
            cmd_cbranch,
674
685
            cmd_cdiff,
675
686
            cmd_clean_tree,
676
687
            cmd_fetch_ghosts,
677
688
            cmd_graph_ancestry,
678
689
            cmd_import,
679
 
            cmd_link_tree,
680
690
            cmd_multi_pull,
681
691
            cmd_patch,
682
692
            cmd_rspush,
683
693
            cmd_shelf,
684
694
            cmd_shell,
685
695
            cmd_shelve,
 
696
            cmd_switch,
686
697
            cmd_unshelve,
687
698
            cmd_zap,
688
699
            ]
701
712
    import bzrtools
702
713
    import tests.clean_tree
703
714
    import tests.is_clean
704
 
    import tests.test_cbranch
705
 
    import tests.test_link_tree
706
 
    import tests.test_patch
707
 
    import tests.test_rspush
708
715
    import tests.upstream_import
709
716
    import zap
710
717
    import tests.blackbox
723
730
    result.addTest(tests.upstream_import.test_suite())
724
731
    result.addTest(zap.test_suite())
725
732
    result.addTest(TestLoader().loadTestsFromModule(tests.is_clean))
726
 
    result.addTest(TestLoader().loadTestsFromModule(tests.test_link_tree))
727
 
    result.addTest(TestLoader().loadTestsFromModule(tests.test_patch))
728
 
    result.addTest(TestLoader().loadTestsFromModule(tests.test_rspush))
729
 
    result.addTest(TestLoader().loadTestsFromModule(tests.test_cbranch))
730
733
    return result