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'
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.'),
102
Option('detritus', help='delete conflict files, merge'
103
' backups, and failed selftest dirs.'),
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.'),
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
148
155
If available, rsvg is used to antialias PNG and JPEG output, but this can
149
156
be disabled with --no-antialias.
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",
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),
168
help='Source branch to use (default is current'
173
def run(self, file, merge_branch=None, no_collapse=False,
174
no_antialias=False, cluster=False, max_distance=100,
176
if max_distance == -1:
164
180
ranking = "cluster"
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)
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.
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:
198
return patch(wt, filename, strip)
215
return patch(wt, filename, strip, silent)
201
218
class cmd_shelve(bzrlib.commands.Command):
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),
253
Option('all', help='Shelve all changes without prompting.'),
254
Option('no-color', help='Never display changes in color.')]
236
256
def run(self, all=False, file_list=None, message=None, revision=None,
362
385
See 'shelve' for more information.
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.')
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)
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).
425
takes_options = [Option("branch", help="Remove associtated branch from"
448
takes_options = [Option("branch", help="Remove associated branch from"
427
450
takes_args = ["checkout"]
428
451
def run(self, checkout, branch=False):
429
452
from zap import zap
443
466
cbranch_target:policy = appendpath
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"
449
472
NOTE: cbranch also supports "cbranch_root", but that behaviour is
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)
518
541
These marks can be used to track a branch's status.
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)
527
550
class cmd_import(bzrlib.commands.Command):
528
551
"""Import sources from a directory, tarball or zip file
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.
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'
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)
556
583
class cmd_baz_import(bzrlib.commands.Command):
559
586
This command should be used on local archives (or mirrors) only. It is
560
587
quite slow on remote archives.
562
reuse_history allows you to specify any previous imports you
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.
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.')]
587
614
def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
606
633
are incompatible.
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.')]
613
642
def run(self, to_location, from_branch=None, fast=False, max_count=None,
616
645
from errors import NoPyBaz
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)
626
655
class cmd_rspush(bzrlib.commands.Command):
627
656
"""Upload this branch to another location using rsync.
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.
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.')]
641
670
from bzrlib import workingtree
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)