1
# Copyright (C) 2005, 2006, 2007 Aaron Bentley <aaron.bentley@utoronto.ca>
1
# Copyright (C) 2005, 2006 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 or (bzrlib_version == desired_plus and
43
bzrlib.version_info[3] == 'dev'):
42
if bzrlib_version == desired:
46
45
from bzrlib.trace import warning
48
47
# get the message out any way we can
49
48
from warnings import warn as warning
50
49
if bzrlib_version < desired:
51
warning('Installed Bazaar version %s is too old to be used with'
53
'"Bzrtools" %s.' % (bzrlib.__version__, __version__))
50
warning('Installed bzr version %s is too old to be used with bzrtools'
51
' %s.' % (bzrlib.__version__, __version__))
54
52
# Not using BzrNewError, because it may not exist.
55
53
raise Exception, ('Version mismatch', version_info)
57
warning('Plugin "Bzrtools" is not up to date with installed Bazaar'
59
' There should be a newer version of Bzrtools available, e.g.'
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.'
61
57
% (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
62
58
if bzrlib_version != desired_plus:
63
59
raise Exception, 'Version mismatch'
66
62
check_bzrlib_version(version_info[:2])
68
from bzrlib.lazy_import import lazy_import
69
lazy_import(globals(), """
70
from bzrlib import help
74
65
from errors import CommandError, NoPyBaz
75
66
from patchsource import BzrPatchSource
67
from shelf import Shelf
80
72
import bzrlib.commands
81
73
from bzrlib.commands import get_cmd_object
82
74
from bzrlib.errors import BzrCommandError
75
from bzrlib.help import command_usage
83
76
import bzrlib.ignores
84
77
from bzrlib.option import Option
85
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
78
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
90
81
bzrlib.ignores.add_runtime_ignores(['./.shelf'])
106
97
To check what clean-tree will do, use --dry-run.
108
takes_options = [Option('ignored', help='delete all ignored files.'),
99
takes_options = [Option('ignored', help='delete all ignored files.'),
109
100
Option('detritus', help='delete conflict files, merge'
110
' backups, and failed selftest dirs.'),
101
' backups, and failed selftest dirs.'),
112
103
help='delete files unknown to bzr. (default)'),
113
104
Option('dry-run', help='show files to delete instead of'
114
105
' deleting them.')]
156
147
be disabled with --no-antialias.
158
149
takes_args = ['branch', 'file']
159
takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
150
takes_options = [Option('no-collapse', help="Do not skip simple nodes"),
160
151
Option('no-antialias',
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",
152
help="Do not use rsvg to produce antialiased output"),
153
Option('merge-branch', type=str,
154
help="Use this branch to calcuate a merge base"),
155
Option('cluster', help="Use clustered output.")]
167
156
def run(self, branch, file, no_collapse=False, no_antialias=False,
168
merge_branch=None, cluster=False, max_distance=None):
157
merge_branch=None, cluster=False):
171
160
ranking = "cluster"
173
162
ranking = "forced"
174
graph.write_ancestry_file(branch, file, not no_collapse,
175
not no_antialias, merge_branch, ranking,
176
max_distance=max_distance)
163
graph.write_ancestry_file(branch, file, not no_collapse,
164
not no_antialias, merge_branch, ranking)
179
167
class cmd_fetch_ghosts(bzrlib.commands.Command):
190
178
strip_help="""Strip the smallest prefix containing num leading slashes from \
191
179
each file name found in the patch file."""
180
Option.OPTIONS['bzrdiff'] = Option('bzrdiff',type=None,
181
help="""Handle extra bzr tags""")
194
184
class cmd_patch(bzrlib.commands.Command):
195
185
"""Apply a named patch to the current tree.
197
187
takes_args = ['filename?']
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):
188
takes_options = [Option('strip', type=int, help=strip_help)]
189
def run(self, filename=None, strip=-1, bzrdiff=0):
201
190
from patch import patch
202
191
from bzrlib.workingtree import WorkingTree
203
192
wt = WorkingTree.open_containing('.')[0]
206
return patch(wt, filename, strip, silent)
194
if bzrdiff: strip = 0
197
return patch(wt, filename, strip, legacy= not bzrdiff)
209
200
class cmd_shelve(bzrlib.commands.Command):
239
230
takes_args = ['file*']
240
231
takes_options = ['message', 'revision',
241
Option('all', help='Shelve all changes without prompting'),
232
Option('all', help='Shelve all changes without prompting'),
242
233
Option('no-color', help='Never display changes in color')]
244
235
def run(self, all=False, file_list=None, message=None, revision=None,
279
270
aliases = ['switch']
280
271
takes_args = ['othershelf']
281
272
def run(self, othershelf):
282
s = shelf.Shelf(self.shelf.base, othershelf)
273
s = Shelf(self.shelf.base, othershelf)
313
304
cmd = self._get_cmd_object(subcommand)
314
305
source = BzrPatchSource()
315
s = shelf.Shelf(source.base)
306
s = Shelf(source.base)
318
if args_list is None:
320
308
return cmd.run_argv_aliases(args_list)
322
310
def _get_cmd_object(self, cmd_name):
380
368
takes_args = ['patch?']
381
369
def run(self, patch=None, all=False, force=False, no_color=False):
382
370
source = BzrPatchSource()
383
s = shelf.Shelf(source.base)
371
s = Shelf(source.base)
384
372
s.unshelve(source, patch, all, force, no_color)
444
432
class cmd_cbranch(bzrlib.commands.Command):
446
434
Create a new checkout, associated with a new repository branch.
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
436
When you cbranch, bzr looks up the repository associated with your current
437
directory in locations.conf. It creates a new branch in that repository
438
with the same name and relative path as the checkout you request.
440
The locations.conf parameter is "cbranch_root". So if you want
441
cbranch operations in /home/jrandom/bigproject to produce branches in
442
/home/jrandom/bigproject/repository, you'd add this:
444
[/home/jrandom/bigproject]
445
cbranch_root = /home/jrandom/bigproject/repository
447
Note that if "/home/jrandom/bigproject/repository" isn't a repository,
448
standalone branches will be produced. Standalone branches will also
449
be produced if the source branch is in 0.7 format (or earlier).
463
takes_options = [Option("lightweight",
451
takes_options = [Option("lightweight",
464
452
help="Create a lightweight checkout"), 'revision']
465
453
takes_args = ["source", "target?"]
466
454
def run(self, source, target=None, lightweight=False, revision=None):
467
455
from cbranch import cbranch
468
return cbranch(source, target, lightweight=lightweight,
456
return cbranch(source, target, lightweight=lightweight,
469
457
revision=revision)
538
526
class cmd_import(bzrlib.commands.Command):
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.
527
"""Import sources from a tarball
529
This command will import a tarball into a bzr tree, replacing any versioned
530
files already present. If a directory is specified, it is used as the
531
target. If the directory does not exist, or is not versioned, it is
546
534
Tarballs may be gzip or bzip2 compressed. This is autodetected.
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.
536
If the tarball has a single root directory, that directory is stripped
537
when extracting the tarball.
552
540
takes_args = ['source', 'tree?']
553
541
def run(self, source, tree=None):
554
542
from upstream_import import do_import
558
546
class cmd_cdiff(bzrlib.commands.Command):
559
547
"""A color version of bzr's diff"""
560
548
takes_args = property(lambda x: get_cmd_object('diff').takes_args)
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
takes_options = property(lambda x: get_cmd_object('diff').takes_options)
550
def run(*args, **kwargs):
572
551
from colordiff import colordiff
573
colordiff(check_style, *args, **kwargs)
552
colordiff(*args, **kwargs)
576
555
class cmd_baz_import(bzrlib.commands.Command):
579
558
This command should be used on local archives (or mirrors) only. It is
580
559
quite slow on remote archives.
582
reuse_history allows you to specify any previous imports you
561
reuse_history allows you to specify any previous imports you
583
562
have done of different archives, which this archive has branches
584
tagged from. This will dramatically reduce the time to convert
563
tagged from. This will dramatically reduce the time to convert
585
564
the archive as it will not have to convert the history already
586
565
converted in that other branch.
601
580
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
602
581
takes_options = ['verbose', Option('prefixes', type=str,
603
582
help="Prefixes of branches to import, colon-separated"),
604
Option('encoding', type=str,
583
Option('encoding', type=str,
605
584
help='Force encoding to specified value. See WARNING.')]
607
586
def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
628
607
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
629
608
takes_options = ['verbose', Option('max-count', type=int),
630
Option('encoding', type=str,
609
Option('encoding', type=str,
631
610
help='Force encoding to specified value. See WARNING.')]
633
612
def run(self, to_location, from_branch=None, fast=False, max_count=None,
636
615
from errors import NoPyBaz
638
617
import baz_import
639
baz_import.baz_import_branch(to_location, from_branch, fast,
618
baz_import.baz_import_branch(to_location, from_branch, fast,
640
619
max_count, verbose, encoding, dry_run,
641
620
reuse_history_list)
646
625
class cmd_rspush(bzrlib.commands.Command):
647
626
"""Upload this branch to another location using rsync.
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.
628
If no location is specified, the last-used location will be used. To
629
prevent dirty trees from being uploaded, rspush will error out if there are
630
unknown files or local changes. It will also error out if the upstream
631
directory is non-empty and not an earlier version of the branch.
654
633
takes_args = ['location?']
655
634
takes_options = [Option('overwrite', help='Ignore differences between'
661
640
from bzrlib import workingtree
663
642
cur_branch = workingtree.WorkingTree.open_containing(".")[0]
664
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
643
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
665
644
working_tree=not no_tree)
727
705
result.addTest(tests.test_suite())
728
706
result.addTest(TestLoader().loadTestsFromModule(tests.shelf_tests))
729
707
result.addTest(tests.blackbox.test_suite())
730
result.addTest(tests.upstream_import.test_suite())
708
result.addTest(upstream_import.test_suite())
731
709
result.addTest(zap.test_suite())
732
result.addTest(TestLoader().loadTestsFromModule(tests.is_clean))