1
# Copyright (C) 2005, 2006 Aaron Bentley <aaron.bentley@utoronto.ca>
2
# Copyright (C) 2005, 2006 Canonical Limited.
3
# Copyright (C) 2006 Michael Ellerman.
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
3
Various useful plugins for working with bzr.
26
__version__ = '0.13.0'
29
version_info = tuple(int(n) for n in __version__.split('.'))
32
def check_bzrlib_version(desired):
33
"""Check that bzrlib is compatible.
35
If version is < bzrtools version, assume incompatible.
36
If version == bzrtools version, assume completely compatible
37
If version == bzrtools version + 1, assume compatible, with deprecations
38
Otherwise, assume incompatible.
40
desired_plus = (desired[0], desired[1]+1)
41
bzrlib_version = bzrlib.version_info[:2]
42
if bzrlib_version == desired:
45
from bzrlib.trace import warning
47
# get the message out any way we can
48
from warnings import warn as warning
49
if bzrlib_version < desired:
50
warning('Installed bzr version %s is too old to be used with bzrtools'
51
' %s.' % (bzrlib.__version__, __version__))
52
# Not using BzrNewError, because it may not exist.
53
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
% (bzrlib.__version__, bzrlib_version[0], bzrlib_version[1]))
58
if bzrlib_version != desired_plus:
59
raise Exception, 'Version mismatch'
62
check_bzrlib_version(version_info[:2])
65
from errors import CommandError, NoPyBaz
6
from errors import CommandError
66
7
from patchsource import BzrPatchSource
67
8
from shelf import Shelf
9
from switch import cmd_switch
13
from bzrlib import DEFAULT_IGNORE
71
14
import bzrlib.builtins
72
16
import bzrlib.commands
73
17
from bzrlib.commands import get_cmd_object
74
18
from bzrlib.errors import BzrCommandError
75
19
from bzrlib.help import command_usage
77
20
from bzrlib.option import Option
78
21
sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__),
81
bzrlib.ignores.add_runtime_ignores(['./.shelf'])
25
DEFAULT_IGNORE.append('./.shelf')
26
DEFAULT_IGNORE.append('./.bzr-shelf*')
84
29
class cmd_clean_tree(bzrlib.commands.Command):
551
499
from colordiff import colordiff
552
500
colordiff(*args, **kwargs)
555
class cmd_baz_import(bzrlib.commands.Command):
556
"""Import an Arch or Baz archive into a bzr repository.
558
This command should be used on local archives (or mirrors) only. It is
559
quite slow on remote archives.
561
reuse_history allows you to specify any previous imports you
562
have done of different archives, which this archive has branches
563
tagged from. This will dramatically reduce the time to convert
564
the archive as it will not have to convert the history already
565
converted in that other branch.
567
If you specify prefixes, only branches whose names start with that prefix
568
will be imported. Skipped branches will be listed, so you can import any
569
branches you missed by accident. Here's an example of doing a partial
570
import from thelove@canonical.com:
571
bzr baz-import thelove thelove@canonical.com --prefixes dists:talloc-except
573
takes_args = ['to_root_dir', 'from_archive', 'reuse_history*']
574
takes_options = ['verbose', Option('prefixes', type=str,
575
help="Prefixes of branches to import, colon-separated")]
577
def run(self, to_root_dir, from_archive, encoding=None, verbose=False,
578
reuse_history_list=[], prefixes=None):
579
from errors import NoPyBaz
582
baz_import.baz_import(to_root_dir, from_archive, encoding,
583
verbose, reuse_history_list, prefixes)
585
print "This command is disabled. Please install PyBaz."
588
class cmd_baz_import_branch(bzrlib.commands.Command):
589
"""Import an Arch or Baz branch into a bzr branch."""
590
takes_args = ['to_location', 'from_branch?', 'reuse_history*']
591
takes_options = ['verbose', Option('max-count', type=int)]
593
def run(self, to_location, from_branch=None, fast=False, max_count=None,
594
encoding=None, verbose=False, dry_run=False,
595
reuse_history_list=[]):
596
from errors import NoPyBaz
599
baz_import.baz_import_branch(to_location, from_branch, fast,
600
max_count, verbose, encoding, dry_run,
603
print "This command is disabled. Please install PyBaz."
606
class cmd_rspush(bzrlib.commands.Command):
607
"""Upload this branch to another location using rsync.
609
If no location is specified, the last-used location will be used. To
610
prevent dirty trees from being uploaded, rspush will error out if there are
611
unknown files or local changes. It will also error out if the upstream
612
directory is non-empty and not an earlier version of the branch.
614
takes_args = ['location?']
615
takes_options = [Option('overwrite', help='Ignore differences between'
616
' branches and overwrite unconditionally'),
617
Option('no-tree', help='Do not push the working tree,'
620
def run(self, location=None, overwrite=False, no_tree=False):
621
from bzrlib import workingtree
623
cur_branch = workingtree.WorkingTree.open_containing(".")[0]
624
bzrtools.rspush(cur_branch, location, overwrite=overwrite,
625
working_tree=not no_tree)
628
class cmd_switch(bzrlib.commands.Command):
629
"""Set the branch of a lightweight checkout and update."""
631
takes_args = ['to_location']
633
def run(self, to_location):
634
from switch import cmd_switch
635
cmd_switch().run(to_location)
640
cmd_baz_import_branch,
502
commands = [cmd_shelve, cmd_unshelve, cmd_shelf, cmd_clean_tree,
503
cmd_graph_ancestry, cmd_fetch_ghosts, cmd_patch, cmd_shell,
504
cmd_branch_history, cmd_zap, cmd_cbranch, cmd_branches,
505
cmd_multi_pull, cmd_switch, cmd_branch_mark, cmd_import, cmd_shove,
509
commands.append(rspush.cmd_rspush)
511
from errors import NoPyBaz
514
commands.append(baz_import.cmd_baz_import_branch)
515
commands.append(baz_import.cmd_baz_import)
518
class cmd_baz_import_branch(bzrlib.commands.Command):
519
"""Disabled. (Requires PyBaz)"""
520
takes_args = ['to_location?', 'from_branch?', 'reuse_history*']
521
takes_options = ['verbose', Option('max-count', type=int)]
522
def run(self, to_location=None, from_branch=None, fast=False,
523
max_count=None, verbose=False, dry_run=False,
524
reuse_history_list=[]):
525
print "This command is disabled. Please install PyBaz."
528
class cmd_baz_import(bzrlib.commands.Command):
529
"""Disabled. (Requires PyBaz)"""
530
takes_args = ['to_root_dir?', 'from_archive?', 'reuse_history*']
531
takes_options = ['verbose', Option('prefixes', type=str,
532
help="Prefixes of branches to import")]
533
def run(self, to_root_dir=None, from_archive=None, verbose=False,
534
reuse_history_list=[], prefixes=None):
535
print "This command is disabled. Please install PyBaz."
536
commands.extend((cmd_baz_import_branch, cmd_baz_import))
662
539
if hasattr(bzrlib.commands, 'register_command'):