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.
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'):
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'
53
'"Bzrtools" %s.' % (bzrlib.__version__, __version__))
52
54
# Not using BzrNewError, because it may not exist.
53
55
raise Exception, ('Version mismatch', version_info)
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'
59
' There should be a newer version of Bzrtools available, e.g.'
57
61
% (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
58
62
if bzrlib_version != desired_plus:
59
63
raise Exception, 'Version mismatch'
62
66
check_bzrlib_version(version_info[:2])
68
from bzrlib.lazy_import import lazy_import
69
lazy_import(globals(), """
70
from bzrlib import help
65
74
from errors import CommandError, NoPyBaz
66
75
from patchsource import BzrPatchSource
67
from shelf import Shelf
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__),
99
106
To check what clean-tree will do, use --dry-run.
101
takes_options = [Option('ignored', help='delete all ignored files.'),
108
takes_options = [Option('ignored', help='delete all ignored files.'),
102
109
Option('detritus', help='delete conflict files, merge'
103
' backups, and failed selftest dirs.'),
110
' backups, and failed selftest dirs.'),
105
112
help='delete files unknown to bzr. (default)'),
106
113
Option('dry-run', help='show files to delete instead of'
107
114
' deleting them.')]
149
156
be disabled with --no-antialias.
151
158
takes_args = ['branch', 'file']
152
takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
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"),
157
Option('cluster', help="Use clustered output.")]
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"),
164
Option('cluster', help="Use clustered output."),
165
Option('max-distance', help="Show no nodes farther than this",
158
167
def run(self, branch, file, no_collapse=False, no_antialias=False,
159
merge_branch=None, cluster=False):
168
merge_branch=None, cluster=False, max_distance=None):
162
171
ranking = "cluster"
164
173
ranking = "forced"
165
graph.write_ancestry_file(branch, file, not no_collapse,
166
not no_antialias, merge_branch, ranking)
174
graph.write_ancestry_file(branch, file, not no_collapse,
175
not no_antialias, merge_branch, ranking,
176
max_distance=max_distance)
169
179
class cmd_fetch_ghosts(bzrlib.commands.Command):
185
195
"""Apply a named patch to the current tree.
187
197
takes_args = ['filename?']
188
takes_options = [Option('strip', type=int, help=strip_help)]
189
def run(self, filename=None, strip=None):
198
takes_options = [Option('strip', type=int, help=strip_help),
199
Option('silent', help='Suppress chatter')]
200
def run(self, filename=None, strip=None, silent=False):
190
201
from patch import patch
191
202
from bzrlib.workingtree import WorkingTree
192
203
wt = WorkingTree.open_containing('.')[0]
193
204
if strip is None:
195
return patch(wt, filename, strip)
206
return patch(wt, filename, strip, silent)
198
209
class cmd_shelve(bzrlib.commands.Command):
228
239
takes_args = ['file*']
229
240
takes_options = ['message', 'revision',
230
Option('all', help='Shelve all changes without prompting'),
241
Option('all', help='Shelve all changes without prompting'),
231
242
Option('no-color', help='Never display changes in color')]
233
244
def run(self, all=False, file_list=None, message=None, revision=None,
268
279
aliases = ['switch']
269
280
takes_args = ['othershelf']
270
281
def run(self, othershelf):
271
s = Shelf(self.shelf.base, othershelf)
282
s = shelf.Shelf(self.shelf.base, othershelf)
302
313
cmd = self._get_cmd_object(subcommand)
303
314
source = BzrPatchSource()
304
s = Shelf(source.base)
315
s = shelf.Shelf(source.base)
318
if args_list is None:
306
320
return cmd.run_argv_aliases(args_list)
308
322
def _get_cmd_object(self, cmd_name):
366
380
takes_args = ['patch?']
367
381
def run(self, patch=None, all=False, force=False, no_color=False):
368
382
source = BzrPatchSource()
369
s = Shelf(source.base)
383
s = shelf.Shelf(source.base)
370
384
s.unshelve(source, patch, all, force, no_color)
430
444
class cmd_cbranch(bzrlib.commands.Command):
432
446
Create a new checkout, associated with a new repository branch.
434
When you cbranch, bzr looks up the repository associated with your current
435
directory in locations.conf. It creates a new branch in that repository
436
with the same name and relative path as the checkout you request.
438
The locations.conf parameter is "cbranch_root". So if you want
439
cbranch operations in /home/jrandom/bigproject to produce branches in
440
/home/jrandom/bigproject/repository, you'd add this:
442
[/home/jrandom/bigproject]
443
cbranch_root = /home/jrandom/bigproject/repository
445
Note that if "/home/jrandom/bigproject/repository" isn't a repository,
446
standalone branches will be produced. Standalone branches will also
447
be produced if the source branch is in 0.7 format (or earlier).
448
When you cbranch, bzr looks up a target location in locations.conf, and
449
creates the branch there.
451
In your locations.conf, add the following lines:
452
[/working_directory_root]
453
cbranch_target = /branch_root
454
cbranch_target:policy = appendpath
456
This will mean that if you run "bzr cbranch foo/bar foo/baz" in the
457
working directory root, the branch will be created in
458
"/branch_root/foo/baz"
460
NOTE: cbranch also supports "cbranch_root", but that behaviour is
449
takes_options = [Option("lightweight",
463
takes_options = [Option("lightweight",
450
464
help="Create a lightweight checkout"), 'revision']
451
465
takes_args = ["source", "target?"]
452
466
def run(self, source, target=None, lightweight=False, revision=None):
453
467
from cbranch import cbranch
454
return cbranch(source, target, lightweight=lightweight,
468
return cbranch(source, target, lightweight=lightweight,
455
469
revision=revision)
524
538
class cmd_import(bzrlib.commands.Command):
525
"""Import sources from a tarball
527
This command will import a tarball into a bzr tree, replacing any versioned
528
files already present. If a directory is specified, it is used as the
529
target. If the directory does not exist, or is not versioned, it is
539
"""Import sources from a directory, tarball or zip file
541
This command will import a directory, tarball or zip file into a bzr
542
tree, replacing any versioned files already present. If a directory is
543
specified, it is used as the target. If the directory does not exist, or
544
is not versioned, it is created.
532
546
Tarballs may be gzip or bzip2 compressed. This is autodetected.
534
If the tarball has a single root directory, that directory is stripped
535
when extracting the tarball.
548
If the tarball or zip has a single root directory, that directory is
549
stripped when extracting the tarball. This is not done for directories.
538
552
takes_args = ['source', 'tree?']
539
553
def run(self, source, tree=None):
540
554
from upstream_import import do_import
544
558
class cmd_cdiff(bzrlib.commands.Command):
545
559
"""A color version of bzr's diff"""
546
560
takes_args = property(lambda x: get_cmd_object('diff').takes_args)
547
takes_options = property(lambda x: get_cmd_object('diff').takes_options)
548
def run(*args, **kwargs):
562
def _takes_options(self):
563
options = list(get_cmd_object('diff').takes_options)
564
options.append(Option('check-style',
565
help='Warn if trailing whitespace or spurious changes have been'
569
takes_options = property(_takes_options)
571
def run(self, check_style=False, *args, **kwargs):
549
572
from colordiff import colordiff
550
colordiff(*args, **kwargs)
573
colordiff(check_style, *args, **kwargs)
553
576
class cmd_baz_import(bzrlib.commands.Command):
556
579
This command should be used on local archives (or mirrors) only. It is
557
580
quite slow on remote archives.
559
reuse_history allows you to specify any previous imports you
582
reuse_history allows you to specify any previous imports you
560
583
have done of different archives, which this archive has branches
561
tagged from. This will dramatically reduce the time to convert
584
tagged from. This will dramatically reduce the time to convert
562
585
the archive as it will not have to convert the history already
563
586
converted in that other branch.
578
601
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
579
602
takes_options = ['verbose', Option('prefixes', type=str,
580
603
help="Prefixes of branches to import, colon-separated"),
581
Option('encoding', type=str,
604
Option('encoding', type=str,
582
605
help='Force encoding to specified value. See WARNING.')]
584
607
def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
605
628
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
606
629
takes_options = ['verbose', Option('max-count', type=int),
607
Option('encoding', type=str,
630
Option('encoding', type=str,
608
631
help='Force encoding to specified value. See WARNING.')]
610
633
def run(self, to_location, from_branch=None, fast=False, max_count=None,
613
636
from errors import NoPyBaz
615
638
import baz_import
616
baz_import.baz_import_branch(to_location, from_branch, fast,
639
baz_import.baz_import_branch(to_location, from_branch, fast,
617
640
max_count, verbose, encoding, dry_run,
618
641
reuse_history_list)
623
646
class cmd_rspush(bzrlib.commands.Command):
624
647
"""Upload this branch to another location using rsync.
626
If no location is specified, the last-used location will be used. To
627
prevent dirty trees from being uploaded, rspush will error out if there are
628
unknown files or local changes. It will also error out if the upstream
629
directory is non-empty and not an earlier version of the branch.
649
If no location is specified, the last-used location will be used. To
650
prevent dirty trees from being uploaded, rspush will error out if there are
651
unknown files or local changes. It will also error out if the upstream
652
directory is non-empty and not an earlier version of the branch.
631
654
takes_args = ['location?']
632
655
takes_options = [Option('overwrite', help='Ignore differences between'
638
661
from bzrlib import workingtree
640
663
cur_branch = workingtree.WorkingTree.open_containing(".")[0]
641
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
664
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
642
665
working_tree=not no_tree)
703
727
result.addTest(tests.test_suite())
704
728
result.addTest(TestLoader().loadTestsFromModule(tests.shelf_tests))
705
729
result.addTest(tests.blackbox.test_suite())
706
result.addTest(upstream_import.test_suite())
730
result.addTest(tests.upstream_import.test_suite())
707
731
result.addTest(zap.test_suite())
732
result.addTest(TestLoader().loadTestsFromModule(tests.is_clean))