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.
47
47
# get the message out any way we can
48
48
from warnings import warn as warning
49
49
if bzrlib_version < desired:
50
warning('Installed bzr version %s is too old to be used with bzrtools'
51
' %s.' % (bzrlib.__version__, __version__))
50
warning('Installed Bazaar version %s is too old to be used with'
52
'"Bzrtools" %s.' % (bzrlib.__version__, __version__))
52
53
# Not using BzrNewError, because it may not exist.
53
54
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.'
56
warning('Plugin "Bzrtools" is not up to date with installed Bazaar'
58
' There should be a newer version of Bzrtools available, e.g.'
57
60
% (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
58
61
if bzrlib_version != desired_plus:
59
62
raise Exception, 'Version mismatch'
62
65
check_bzrlib_version(version_info[:2])
67
from bzrlib.lazy_import import lazy_import
68
lazy_import(globals(), """
69
from bzrlib import help
65
73
from errors import CommandError, NoPyBaz
66
74
from patchsource import BzrPatchSource
67
from shelf import Shelf
72
79
import bzrlib.commands
73
80
from bzrlib.commands import get_cmd_object
74
81
from bzrlib.errors import BzrCommandError
75
from bzrlib.help import command_usage
76
82
import bzrlib.ignores
77
83
from bzrlib.option import Option
78
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
84
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
99
105
To check what clean-tree will do, use --dry-run.
101
takes_options = [Option('ignored', help='delete all ignored files.'),
107
takes_options = [Option('ignored', help='delete all ignored files.'),
102
108
Option('detritus', help='delete conflict files, merge'
103
' backups, and failed selftest dirs.'),
109
' backups, and failed selftest dirs.'),
105
111
help='delete files unknown to bzr. (default)'),
106
112
Option('dry-run', help='show files to delete instead of'
107
113
' deleting them.')]
109
115
from clean_tree import clean_tree
110
116
if not (unknown or ignored or detritus):
112
clean_tree('.', unknown=unknown, ignored=ignored, detritus=detritus,
118
clean_tree('.', out=self.outf, unknown=unknown, ignored=ignored,
119
detritus=detritus, dry_run=dry_run)
116
122
class cmd_graph_ancestry(bzrlib.commands.Command):
117
123
"""Produce ancestry graphs using dot.
119
125
Output format is detected according to file extension. Some of the more
120
126
common output formats are html, png, gif, svg, ps. An extension of '.dot'
121
127
will cause a dot graph file to be produced. HTML output has mouseovers
149
155
be disabled with --no-antialias.
151
157
takes_args = ['branch', 'file']
152
takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
158
takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
153
159
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.")]
160
help="Do not use rsvg to produce antialiased output"),
161
Option('merge-branch', type=str,
162
help="Use this branch to calcuate a merge base"),
163
Option('cluster', help="Use clustered output."),
164
Option('max-distance', help="Show no nodes farther than this",
158
166
def run(self, branch, file, no_collapse=False, no_antialias=False,
159
merge_branch=None, cluster=False):
167
merge_branch=None, cluster=False, max_distance=None):
162
170
ranking = "cluster"
164
172
ranking = "forced"
165
graph.write_ancestry_file(branch, file, not no_collapse,
166
not no_antialias, merge_branch, ranking)
173
graph.write_ancestry_file(branch, file, not no_collapse,
174
not no_antialias, merge_branch, ranking,
175
max_distance=max_distance)
169
178
class cmd_fetch_ghosts(bzrlib.commands.Command):
180
189
strip_help="""Strip the smallest prefix containing num leading slashes from \
181
190
each file name found in the patch file."""
182
Option.OPTIONS['bzrdiff'] = Option('bzrdiff',type=None,
183
help="""Handle extra bzr tags""")
186
193
class cmd_patch(bzrlib.commands.Command):
187
194
"""Apply a named patch to the current tree.
189
196
takes_args = ['filename?']
190
takes_options = [Option('strip', type=int, help=strip_help)]
191
def run(self, filename=None, strip=-1, bzrdiff=0):
197
takes_options = [Option('strip', type=int, help=strip_help),
198
Option('silent', help='Suppress chatter')]
199
def run(self, filename=None, strip=None, silent=False):
192
200
from patch import patch
193
201
from bzrlib.workingtree import WorkingTree
194
202
wt = WorkingTree.open_containing('.')[0]
196
if bzrdiff: strip = 0
199
return patch(wt, filename, strip, legacy= not bzrdiff)
205
return patch(wt, filename, strip, silent)
202
208
class cmd_shelve(bzrlib.commands.Command):
232
238
takes_args = ['file*']
233
239
takes_options = ['message', 'revision',
234
Option('all', help='Shelve all changes without prompting'),
240
Option('all', help='Shelve all changes without prompting'),
235
241
Option('no-color', help='Never display changes in color')]
237
243
def run(self, all=False, file_list=None, message=None, revision=None,
272
278
aliases = ['switch']
273
279
takes_args = ['othershelf']
274
280
def run(self, othershelf):
275
s = Shelf(self.shelf.base, othershelf)
281
s = shelf.Shelf(self.shelf.base, othershelf)
306
312
cmd = self._get_cmd_object(subcommand)
307
313
source = BzrPatchSource()
308
s = Shelf(source.base)
314
s = shelf.Shelf(source.base)
317
if args_list is None:
310
319
return cmd.run_argv_aliases(args_list)
312
321
def _get_cmd_object(self, cmd_name):
370
379
takes_args = ['patch?']
371
380
def run(self, patch=None, all=False, force=False, no_color=False):
372
381
source = BzrPatchSource()
373
s = Shelf(source.base)
382
s = shelf.Shelf(source.base)
374
383
s.unshelve(source, patch, all, force, no_color)
434
443
class cmd_cbranch(bzrlib.commands.Command):
436
445
Create a new checkout, associated with a new repository branch.
438
When you cbranch, bzr looks up the repository associated with your current
439
directory in locations.conf. It creates a new branch in that repository
440
with the same name and relative path as the checkout you request.
442
The locations.conf parameter is "cbranch_root". So if you want
443
cbranch operations in /home/jrandom/bigproject to produce branches in
444
/home/jrandom/bigproject/repository, you'd add this:
446
[/home/jrandom/bigproject]
447
cbranch_root = /home/jrandom/bigproject/repository
449
Note that if "/home/jrandom/bigproject/repository" isn't a repository,
450
standalone branches will be produced. Standalone branches will also
451
be produced if the source branch is in 0.7 format (or earlier).
447
When you cbranch, bzr looks up a target location in locations.conf, and
448
creates the branch there.
450
In your locations.conf, add the following lines:
451
[/working_directory_root]
452
cbranch_target = /branch_root
453
cbranch_target:policy = appendpath
455
This will mean that if you run "bzr cbranch foo/bar foo/baz" in the
456
working directory root, the branch will be created in
457
"/branch_root/foo/baz"
459
NOTE: cbranch also supports "cbranch_root", but that behaviour is
453
takes_options = [Option("lightweight",
462
takes_options = [Option("lightweight",
454
463
help="Create a lightweight checkout"), 'revision']
455
464
takes_args = ["source", "target?"]
456
465
def run(self, source, target=None, lightweight=False, revision=None):
457
466
from cbranch import cbranch
458
return cbranch(source, target, lightweight=lightweight,
467
return cbranch(source, target, lightweight=lightweight,
459
468
revision=revision)
528
537
class cmd_import(bzrlib.commands.Command):
529
"""Import sources from a tarball
531
This command will import a tarball into a bzr tree, replacing any versioned
532
files already present. If a directory is specified, it is used as the
533
target. If the directory does not exist, or is not versioned, it is
538
"""Import sources from a directory, tarball or zip file
540
This command will import a directory, tarball or zip file into a bzr
541
tree, replacing any versioned files already present. If a directory is
542
specified, it is used as the target. If the directory does not exist, or
543
is not versioned, it is created.
536
545
Tarballs may be gzip or bzip2 compressed. This is autodetected.
538
If the tarball has a single root directory, that directory is stripped
539
when extracting the tarball.
547
If the tarball or zip has a single root directory, that directory is
548
stripped when extracting the tarball. This is not done for directories.
542
551
takes_args = ['source', 'tree?']
543
552
def run(self, source, tree=None):
544
553
from upstream_import import do_import
548
557
class cmd_cdiff(bzrlib.commands.Command):
549
558
"""A color version of bzr's diff"""
550
559
takes_args = property(lambda x: get_cmd_object('diff').takes_args)
551
takes_options = property(lambda x: get_cmd_object('diff').takes_options)
552
def run(*args, **kwargs):
561
def _takes_options(self):
562
options = list(get_cmd_object('diff').takes_options)
563
options.append(Option('check-style',
564
help='Warn if trailing whitespace or spurious changes have been'
568
takes_options = property(_takes_options)
570
def run(self, check_style=False, *args, **kwargs):
553
571
from colordiff import colordiff
554
colordiff(*args, **kwargs)
572
colordiff(check_style, *args, **kwargs)
557
575
class cmd_baz_import(bzrlib.commands.Command):
560
578
This command should be used on local archives (or mirrors) only. It is
561
579
quite slow on remote archives.
563
reuse_history allows you to specify any previous imports you
581
reuse_history allows you to specify any previous imports you
564
582
have done of different archives, which this archive has branches
565
tagged from. This will dramatically reduce the time to convert
583
tagged from. This will dramatically reduce the time to convert
566
584
the archive as it will not have to convert the history already
567
585
converted in that other branch.
582
600
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
583
601
takes_options = ['verbose', Option('prefixes', type=str,
584
602
help="Prefixes of branches to import, colon-separated"),
585
Option('encoding', type=str,
603
Option('encoding', type=str,
586
604
help='Force encoding to specified value. See WARNING.')]
588
606
def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
609
627
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
610
628
takes_options = ['verbose', Option('max-count', type=int),
611
Option('encoding', type=str,
629
Option('encoding', type=str,
612
630
help='Force encoding to specified value. See WARNING.')]
614
632
def run(self, to_location, from_branch=None, fast=False, max_count=None,
617
635
from errors import NoPyBaz
619
637
import baz_import
620
baz_import.baz_import_branch(to_location, from_branch, fast,
638
baz_import.baz_import_branch(to_location, from_branch, fast,
621
639
max_count, verbose, encoding, dry_run,
622
640
reuse_history_list)
627
645
class cmd_rspush(bzrlib.commands.Command):
628
646
"""Upload this branch to another location using rsync.
630
If no location is specified, the last-used location will be used. To
631
prevent dirty trees from being uploaded, rspush will error out if there are
632
unknown files or local changes. It will also error out if the upstream
633
directory is non-empty and not an earlier version of the branch.
648
If no location is specified, the last-used location will be used. To
649
prevent dirty trees from being uploaded, rspush will error out if there are
650
unknown files or local changes. It will also error out if the upstream
651
directory is non-empty and not an earlier version of the branch.
635
653
takes_args = ['location?']
636
654
takes_options = [Option('overwrite', help='Ignore differences between'
642
660
from bzrlib import workingtree
644
662
cur_branch = workingtree.WorkingTree.open_containing(".")[0]
645
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
663
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
646
664
working_tree=not no_tree)
707
726
result.addTest(tests.test_suite())
708
727
result.addTest(TestLoader().loadTestsFromModule(tests.shelf_tests))
709
728
result.addTest(tests.blackbox.test_suite())
710
result.addTest(upstream_import.test_suite())
729
result.addTest(tests.upstream_import.test_suite())
711
730
result.addTest(zap.test_suite())
731
result.addTest(TestLoader().loadTestsFromModule(tests.is_clean))