~bzr-pqm/bzr/bzr.dev

3943.2.2 by Martin Pool
Small refactoring to upgrade
1
# Copyright (C) 2005, 2008, 2009 Canonical Ltd
1267 by Martin Pool
- notes on conversion of existing history to weaves
2
#
1080 by Martin Pool
- test tool for converting history to weave files
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1267 by Martin Pool
- notes on conversion of existing history to weaves
7
#
1080 by Martin Pool
- test tool for converting history to weave files
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1267 by Martin Pool
- notes on conversion of existing history to weaves
12
#
1080 by Martin Pool
- test tool for converting history to weave files
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1534.4.34 by Robert Collins
Fix remaining uses of deprecated apis within bzrlib.
17
"""bzr upgrade logic."""
18
3943.2.1 by Martin Pool
doc/import cleanups
19
20
from bzrlib.bzrdir import BzrDir, BzrDirFormat
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
21
import bzrlib.errors as errors
3577.4.1 by Andrew Bennetts
Make 'bzr upgrade' work over HPSS.
22
from bzrlib.remote import RemoteBzrDir
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
23
from bzrlib.transport import get_transport
1534.5.9 by Robert Collins
Advise users running upgrade on a checkout to also run it on the branch.
24
import bzrlib.ui as ui
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
25
26
27
class Convert(object):
28
1534.5.13 by Robert Collins
Correct buggy test.
29
    def __init__(self, url, format):
3943.2.2 by Martin Pool
Small refactoring to upgrade
30
        if format is None:
31
            format = BzrDirFormat.get_default_format()
1534.5.13 by Robert Collins
Correct buggy test.
32
        self.format = format
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
33
        self.bzrdir = BzrDir.open_unsupported(url)
3577.4.1 by Andrew Bennetts
Make 'bzr upgrade' work over HPSS.
34
        if isinstance(self.bzrdir, RemoteBzrDir):
35
            self.bzrdir._ensure_real()
36
            self.bzrdir = self.bzrdir._real_bzrdir
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
37
        if self.bzrdir.root_transport.is_readonly():
38
            raise errors.UpgradeReadonly
39
        self.transport = self.bzrdir.root_transport
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
40
        self.pb = ui.ui_factory.nested_progress_bar()
41
        try:
42
            self.convert()
43
        finally:
44
            self.pb.finished()
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
45
46
    def convert(self):
1558.7.2 by Aaron Bentley
Upgrade works in repositories
47
        try:
48
            branch = self.bzrdir.open_branch()
49
            if branch.bzrdir.root_transport.base != \
50
                self.bzrdir.root_transport.base:
51
                self.pb.note("This is a checkout. The branch (%s) needs to be "
52
                             "upgraded separately.",
53
                             branch.bzrdir.root_transport.base)
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
54
            del branch
55
        except (errors.NotBranchError, errors.IncompatibleRepositories):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
56
            # might not be a format we can open without upgrading; see e.g.
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
57
            # https://bugs.launchpad.net/bzr/+bug/253891
1558.7.2 by Aaron Bentley
Upgrade works in repositories
58
            pass
1534.5.16 by Robert Collins
Review feedback.
59
        if not self.bzrdir.needs_format_conversion(self.format):
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
60
            raise errors.UpToDateFormat(self.bzrdir._format)
1534.5.16 by Robert Collins
Review feedback.
61
        if not self.bzrdir.can_convert_format():
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
62
            raise errors.BzrError("cannot upgrade from bzrdir format %s" %
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
63
                           self.bzrdir._format)
3943.2.2 by Martin Pool
Small refactoring to upgrade
64
        self.bzrdir.check_conversion_target(self.format)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
65
        self.pb.note('starting upgrade of %s', self.transport.base)
3943.2.4 by Martin Pool
Move backup progress indicators from upgrade.py into backup_bzrdir, and tweak text
66
        self.bzrdir.backup_bzrdir()
1534.5.16 by Robert Collins
Review feedback.
67
        while self.bzrdir.needs_format_conversion(self.format):
68
            converter = self.bzrdir._format.get_converter(self.format)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
69
            self.bzrdir = converter.convert(self.bzrdir, self.pb)
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
70
        self.pb.note("finished")
71
72
1534.5.13 by Robert Collins
Correct buggy test.
73
def upgrade(url, format=None):
74
    """Upgrade to format, or the default bzrdir format if not supplied."""
75
    Convert(url, format)