~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to __init__.py

  • Committer: Aaron Bentley
  • Date: 2007-07-24 17:10:08 UTC
  • Revision ID: abentley@panoramicfeedback.com-20070724171008-b3ygal61ec5dojub
Better error when shelving binary files

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Aaron Bentley <aaron.bentley@utoronto.ca>
 
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
#
23
23
import bzrlib
24
24
 
25
25
 
26
 
__version__ = '0.14.0'
 
26
__version__ = '0.19.0'
27
27
 
28
28
 
29
29
version_info = tuple(int(n) for n in __version__.split('.'))
39
39
    """
40
40
    desired_plus = (desired[0], desired[1]+1)
41
41
    bzrlib_version = bzrlib.version_info[:2]
42
 
    if bzrlib_version == desired:
 
42
    if bzrlib_version == desired or (bzrlib_version == desired_plus and
 
43
                                     bzrlib.version_info[3] == 'dev'):
43
44
        return
44
45
    try:
45
46
        from bzrlib.trace import warning
47
48
        # get the message out any way we can
48
49
        from warnings import warn as warning
49
50
    if bzrlib_version < desired:
50
 
        warning('Installed bzr version %s is too old to be used with bzrtools'
51
 
                ' %s.' % (bzrlib.__version__, __version__))
 
51
        warning('Installed Bazaar version %s is too old to be used with'
 
52
                ' plugin \n'
 
53
                '"Bzrtools" %s.' % (bzrlib.__version__, __version__))
52
54
        # Not using BzrNewError, because it may not exist.
53
55
        raise Exception, ('Version mismatch', version_info)
54
56
    else:
55
 
        warning('Bzrtools is not up to date with installed bzr version %s.'
56
 
                ' \nThere should be a newer version available, e.g. %i.%i.' 
 
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.'
57
61
                % (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
58
62
        if bzrlib_version != desired_plus:
59
63
            raise Exception, 'Version mismatch'
61
65
 
62
66
check_bzrlib_version(version_info[:2])
63
67
 
 
68
from bzrlib.lazy_import import lazy_import
 
69
lazy_import(globals(), """
 
70
from bzrlib import help
 
71
import shelf
 
72
""")
64
73
 
65
74
from errors import CommandError, NoPyBaz
66
75
from patchsource import BzrPatchSource
67
 
from shelf import Shelf
68
76
import sys
69
77
import os.path
70
78
 
72
80
import bzrlib.commands
73
81
from bzrlib.commands import get_cmd_object
74
82
from bzrlib.errors import BzrCommandError
75
 
from bzrlib.help import command_usage
76
83
import bzrlib.ignores
77
84
from bzrlib.option import Option
78
 
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), 
 
85
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
79
86
                                                 "external")))
80
87
 
81
88
import show_paths
98
105
 
99
106
    To check what clean-tree will do, use --dry-run.
100
107
    """
101
 
    takes_options = [Option('ignored', help='delete all ignored files.'), 
102
 
                     Option('detritus', help='delete conflict files, merge'
103
 
                            ' backups, and failed selftest dirs.'), 
104
 
                     Option('unknown', 
105
 
                            help='delete files unknown to bzr.  (default)'),
106
 
                     Option('dry-run', help='show files to delete instead of'
 
108
    takes_options = [Option('ignored', help='Delete all ignored files.'),
 
109
                     Option('detritus', help='Delete conflict files, merge'
 
110
                            ' backups, and failed selftest dirs.'),
 
111
                     Option('unknown',
 
112
                            help='Delete files unknown to bzr (default).'),
 
113
                     Option('dry-run', help='Show files to delete instead of'
107
114
                            ' deleting them.')]
108
115
    def run(self, unknown=False, ignored=False, detritus=False, dry_run=False):
109
116
        from clean_tree import clean_tree
125
132
    with the last 5 characters of their revision identifier are used instead.
126
133
 
127
134
    The value starting with d is "(maximum) distance from the null revision".
128
 
    
 
135
 
129
136
    If --merge-branch is specified, the two branches are compared and a merge
130
137
    base is selected.
131
 
    
 
138
 
132
139
    Legend:
133
140
    white    normal revision
134
141
    yellow   THIS  history
148
155
    If available, rsvg is used to antialias PNG and JPEG output, but this can
149
156
    be disabled with --no-antialias.
150
157
    """
151
 
    takes_args = ['branch', 'file']
152
 
    takes_options = [Option('no-collapse', help="Do not skip simple nodes"), 
 
158
    takes_args = ['file', 'merge_branch?']
 
159
    takes_options = [Option('no-collapse', help="Do not skip simple nodes."),
153
160
                     Option('no-antialias',
154
 
                     help="Do not use rsvg to produce antialiased output"), 
155
 
                     Option('merge-branch', type=str, 
156
 
                     help="Use this branch to calcuate a merge base"), 
 
161
                     help="Do not use rsvg to produce antialiased output."),
 
162
                     Option('merge-branch', type=str,
 
163
                     help="Use this branch to calcuate a merge base."),
157
164
                     Option('cluster', help="Use clustered output."),
158
 
                     Option('max-distance', help="Show no nodes farther than this",
159
 
                            type=int)]
160
 
    def run(self, branch, file, no_collapse=False, no_antialias=False,
161
 
        merge_branch=None, cluster=False, max_distance=None):
 
165
                     Option('max-distance',
 
166
                            help="Show no nodes farther than this.", type=int),
 
167
                     Option('directory',
 
168
                            help='Source branch to use (default is current'
 
169
                            ' directory).',
 
170
                            short_name='d',
 
171
                            type=unicode),
 
172
                    ]
 
173
    def run(self, file, merge_branch=None, no_collapse=False,
 
174
            no_antialias=False, cluster=False, max_distance=100,
 
175
            directory='.'):
 
176
        if max_distance == -1:
 
177
            max_distance = None
162
178
        import graph
163
179
        if cluster:
164
180
            ranking = "cluster"
165
181
        else:
166
182
            ranking = "forced"
167
 
        graph.write_ancestry_file(branch, file, not no_collapse, 
168
 
                                  not no_antialias, merge_branch, ranking, 
 
183
        graph.write_ancestry_file(directory, file, not no_collapse,
 
184
                                  not no_antialias, merge_branch, ranking,
169
185
                                  max_distance=max_distance)
170
186
 
171
187
 
175
191
    """
176
192
    aliases = ['fetch-missing']
177
193
    takes_args = ['branch?']
178
 
    takes_options = [Option('no-fix')]
 
194
    takes_options = [Option('no-fix', help="Skip additional synchonization.")]
179
195
    def run(self, branch=None, no_fix=False):
180
196
        from fetch_ghosts import fetch_ghosts
181
197
        fetch_ghosts(branch, no_fix)
188
204
    """Apply a named patch to the current tree.
189
205
    """
190
206
    takes_args = ['filename?']
191
 
    takes_options = [Option('strip', type=int, help=strip_help)]
192
 
    def run(self, filename=None, strip=None):
 
207
    takes_options = [Option('strip', type=int, help=strip_help),
 
208
                     Option('silent', help='Suppress chatter.')]
 
209
    def run(self, filename=None, strip=None, silent=False):
193
210
        from patch import patch
194
211
        from bzrlib.workingtree import WorkingTree
195
212
        wt = WorkingTree.open_containing('.')[0]
196
213
        if strip is None:
197
214
            strip = 0
198
 
        return patch(wt, filename, strip)
 
215
        return patch(wt, filename, strip, silent)
199
216
 
200
217
 
201
218
class cmd_shelve(bzrlib.commands.Command):
229
246
    """
230
247
 
231
248
    takes_args = ['file*']
232
 
    takes_options = ['message', 'revision',
233
 
            Option('all', help='Shelve all changes without prompting'), 
234
 
            Option('no-color', help='Never display changes in color')]
 
249
    takes_options = [Option('message',
 
250
            help='A message to associate with the shelved changes.',
 
251
            short_name='m', type=unicode),
 
252
            'revision',
 
253
            Option('all', help='Shelve all changes without prompting.'),
 
254
            Option('no-color', help='Never display changes in color.')]
235
255
 
236
256
    def run(self, all=False, file_list=None, message=None, revision=None,
237
257
            no_color=False):
243
263
                                  "parameter.")
244
264
 
245
265
        source = BzrPatchSource(revision, file_list)
246
 
        s = Shelf(source.base)
 
266
        s = shelf.Shelf(source.base)
247
267
        s.shelve(source, all, message, no_color)
248
268
        return 0
249
269
 
271
291
    aliases = ['switch']
272
292
    takes_args = ['othershelf']
273
293
    def run(self, othershelf):
274
 
        s = Shelf(self.shelf.base, othershelf)
 
294
        s = shelf.Shelf(self.shelf.base, othershelf)
275
295
        s.make_default()
276
296
 
277
297
 
304
324
            args_list = []
305
325
        cmd = self._get_cmd_object(subcommand)
306
326
        source = BzrPatchSource()
307
 
        s = Shelf(source.base)
 
327
        s = shelf.Shelf(source.base)
308
328
        cmd.shelf = s
 
329
 
 
330
        if args_list is None:
 
331
            args_list = []
309
332
        return cmd.run_argv_aliases(args_list)
310
333
 
311
334
    def _get_cmd_object(self, cmd_name):
328
351
        cmd_obj = cmd_class()
329
352
        indent = 2 * ' '
330
353
 
331
 
        usage = command_usage(cmd_obj)
 
354
        usage = cmd_obj._usage()
332
355
        usage = usage.replace('bzr shelf-', '')
333
356
        text.append('%s%s\n' % (indent, usage))
334
357
 
362
385
    See 'shelve' for more information.
363
386
    """
364
387
    takes_options = [
365
 
            Option('all', help='Unshelve all changes without prompting'),
366
 
            Option('force', help='Force unshelving even if errors occur'),
367
 
            Option('no-color', help='Never display changes in color')
 
388
            Option('all', help='Unshelve all changes without prompting.'),
 
389
            Option('force', help='Force unshelving even if errors occur.'),
 
390
            Option('no-color', help='Never display changes in color.')
368
391
        ]
369
392
    takes_args = ['patch?']
370
393
    def run(self, patch=None, all=False, force=False, no_color=False):
371
394
        source = BzrPatchSource()
372
 
        s = Shelf(source.base)
 
395
        s = shelf.Shelf(source.base)
373
396
        s.unshelve(source, patch, all, force, no_color)
374
397
        return 0
375
398
 
407
430
    """
408
431
    takes_args = ["branch?"]
409
432
    def run(self, branch=None):
410
 
        from branchhistory import branch_history 
 
433
        from branchhistory import branch_history
411
434
        return branch_history(branch)
412
435
 
413
436
 
422
445
    If --branch is specified, the branch will be deleted too, but only if the
423
446
    the branch has no new commits (relative to its parent).
424
447
    """
425
 
    takes_options = [Option("branch", help="Remove associtated branch from"
426
 
                                           " repository")]
 
448
    takes_options = [Option("branch", help="Remove associated branch from"
 
449
                                           " repository.")]
427
450
    takes_args = ["checkout"]
428
451
    def run(self, checkout, branch=False):
429
452
        from zap import zap
433
456
class cmd_cbranch(bzrlib.commands.Command):
434
457
    """
435
458
    Create a new checkout, associated with a new repository branch.
436
 
    
 
459
 
437
460
    When you cbranch, bzr looks up a target location in locations.conf, and
438
461
    creates the branch there.
439
462
 
443
466
    cbranch_target:policy = appendpath
444
467
 
445
468
    This will mean that if you run "bzr cbranch foo/bar foo/baz" in the
446
 
    working directory root, the branch will be created in 
 
469
    working directory root, the branch will be created in
447
470
    "/branch_root/foo/baz"
448
471
 
449
472
    NOTE: cbranch also supports "cbranch_root", but that behaviour is
450
473
    deprecated.
451
474
    """
452
 
    takes_options = [Option("lightweight", 
453
 
                            help="Create a lightweight checkout"), 'revision']
 
475
    takes_options = [Option("lightweight",
 
476
                            help="Create a lightweight checkout."), 'revision']
454
477
    takes_args = ["source", "target?"]
455
478
    def run(self, source, target=None, lightweight=False, revision=None):
456
479
        from cbranch import cbranch
457
 
        return cbranch(source, target, lightweight=lightweight, 
 
480
        return cbranch(source, target, lightweight=lightweight,
458
481
                       revision=revision)
459
482
 
460
483
 
468
491
 
469
492
class cmd_multi_pull(bzrlib.commands.Command):
470
493
    """Pull all the branches under a location, e.g. a repository.
471
 
    
 
494
 
472
495
    Both branches present in the directory and the branches of checkouts are
473
496
    pulled.
474
497
    """
518
541
    These marks can be used to track a branch's status.
519
542
    """
520
543
    takes_args = ['mark?', 'branch?']
521
 
    takes_options = [Option('delete', help='Delete this mark')]
 
544
    takes_options = [Option('delete', help='Delete this mark.')]
522
545
    def run(self, mark=None, branch=None, delete=False):
523
546
        from branch_mark import branch_mark
524
547
        branch_mark(mark, branch, delete)
526
549
 
527
550
class cmd_import(bzrlib.commands.Command):
528
551
    """Import sources from a directory, tarball or zip file
529
 
    
 
552
 
530
553
    This command will import a directory, tarball or zip file into a bzr
531
554
    tree, replacing any versioned files already present.  If a directory is
532
555
    specified, it is used as the target.  If the directory does not exist, or
537
560
    If the tarball or zip has a single root directory, that directory is
538
561
    stripped when extracting the tarball.  This is not done for directories.
539
562
    """
540
 
    
 
563
 
541
564
    takes_args = ['source', 'tree?']
542
565
    def run(self, source, tree=None):
543
566
        from upstream_import import do_import
547
570
class cmd_cdiff(bzrlib.commands.Command):
548
571
    """A color version of bzr's diff"""
549
572
    takes_args = property(lambda x: get_cmd_object('diff').takes_args)
550
 
    takes_options = property(lambda x: get_cmd_object('diff').takes_options)
551
 
    def run(*args, **kwargs):
 
573
    takes_options = list(get_cmd_object('diff').takes_options) + [
 
574
        Option('check-style',
 
575
            help='Warn if trailing whitespace or spurious changes have been'
 
576
                 ' added.')]
 
577
 
 
578
    def run(self, check_style=False, *args, **kwargs):
552
579
        from colordiff import colordiff
553
 
        colordiff(*args, **kwargs)
 
580
        colordiff(check_style, *args, **kwargs)
554
581
 
555
582
 
556
583
class cmd_baz_import(bzrlib.commands.Command):
558
585
 
559
586
    This command should be used on local archives (or mirrors) only.  It is
560
587
    quite slow on remote archives.
561
 
    
562
 
    reuse_history allows you to specify any previous imports you 
 
588
 
 
589
    reuse_history allows you to specify any previous imports you
563
590
    have done of different archives, which this archive has branches
564
 
    tagged from. This will dramatically reduce the time to convert 
 
591
    tagged from. This will dramatically reduce the time to convert
565
592
    the archive as it will not have to convert the history already
566
593
    converted in that other branch.
567
594
 
580
607
    """
581
608
    takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
582
609
    takes_options = ['verbose', Option('prefixes', type=str,
583
 
                     help="Prefixes of branches to import, colon-separated"),
584
 
                     Option('encoding', type=str, 
 
610
                     help="Prefixes of branches to import, colon-separated."),
 
611
                     Option('encoding', type=str,
585
612
                     help='Force encoding to specified value.  See WARNING.')]
586
613
 
587
614
    def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
606
633
    are incompatible.
607
634
    """
608
635
    takes_args = ['to_location', 'from_branch?', 'reuse_history*']
609
 
    takes_options = ['verbose', Option('max-count', type=int),
610
 
                     Option('encoding', type=str, 
 
636
    takes_options = ['verbose', 
 
637
                     Option('max-count', type=int, 
 
638
                     help='Maximim revisions to import at once.'),
 
639
                     Option('encoding', type=str,
611
640
                     help='Force encoding to specified value.  See WARNING.')]
612
641
 
613
642
    def run(self, to_location, from_branch=None, fast=False, max_count=None,
616
645
        from errors import NoPyBaz
617
646
        try:
618
647
            import baz_import
619
 
            baz_import.baz_import_branch(to_location, from_branch, fast, 
 
648
            baz_import.baz_import_branch(to_location, from_branch, fast,
620
649
                                         max_count, verbose, encoding, dry_run,
621
650
                                         reuse_history_list)
622
651
        except NoPyBaz:
626
655
class cmd_rspush(bzrlib.commands.Command):
627
656
    """Upload this branch to another location using rsync.
628
657
 
629
 
    If no location is specified, the last-used location will be used.  To 
630
 
    prevent dirty trees from being uploaded, rspush will error out if there are 
631
 
    unknown files or local changes.  It will also error out if the upstream 
632
 
    directory is non-empty and not an earlier version of the branch. 
 
658
    If no location is specified, the last-used location will be used.  To
 
659
    prevent dirty trees from being uploaded, rspush will error out if there are
 
660
    unknown files or local changes.  It will also error out if the upstream
 
661
    directory is non-empty and not an earlier version of the branch.
633
662
    """
634
663
    takes_args = ['location?']
635
664
    takes_options = [Option('overwrite', help='Ignore differences between'
636
 
                            ' branches and overwrite unconditionally'),
 
665
                            ' branches and overwrite unconditionally.'),
637
666
                     Option('no-tree', help='Do not push the working tree,'
638
667
                            ' just the .bzr.')]
639
668
 
641
670
        from bzrlib import workingtree
642
671
        import bzrtools
643
672
        cur_branch = workingtree.WorkingTree.open_containing(".")[0]
644
 
        bzrtools.rspush(cur_branch, location, overwrite=overwrite, 
 
673
        bzrtools.rspush(cur_branch, location, overwrite=overwrite,
645
674
                      working_tree=not no_tree)
646
675
 
647
676
 
661
690
            cmd_branches,
662
691
            cmd_branch_history,
663
692
            cmd_branch_mark,
664
 
            cmd_cbranch,  
 
693
            cmd_cbranch,
665
694
            cmd_cdiff,
666
695
            cmd_clean_tree,
667
696
            cmd_fetch_ghosts,
670
699
            cmd_multi_pull,
671
700
            cmd_patch,
672
701
            cmd_rspush,
673
 
            cmd_shelf, 
 
702
            cmd_shelf,
674
703
            cmd_shell,
675
 
            cmd_shelve, 
 
704
            cmd_shelve,
676
705
            cmd_switch,
677
 
            cmd_unshelve, 
678
 
            cmd_zap,            
 
706
            cmd_unshelve,
 
707
            cmd_zap,
679
708
            ]
680
709
 
681
710
 
691
720
    from unittest import TestSuite
692
721
    import bzrtools
693
722
    import tests.clean_tree
 
723
    import tests.is_clean
694
724
    import tests.upstream_import
695
725
    import zap
696
726
    import tests.blackbox
708
738
    result.addTest(tests.blackbox.test_suite())
709
739
    result.addTest(tests.upstream_import.test_suite())
710
740
    result.addTest(zap.test_suite())
 
741
    result.addTest(TestLoader().loadTestsFromModule(tests.is_clean))
711
742
    return result