~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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1080 by Martin Pool
- test tool for converting history to weave files
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
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
20
from bzrlib.bzrdir import BzrDir, BzrDirFormat, format_registry
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
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
29
    def __init__(self, url, format=None):
1534.5.13 by Robert Collins
Correct buggy test.
30
        self.format = format
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
31
        self.bzrdir = BzrDir.open_unsupported(url)
3577.4.1 by Andrew Bennetts
Make 'bzr upgrade' work over HPSS.
32
        if isinstance(self.bzrdir, RemoteBzrDir):
33
            self.bzrdir._ensure_real()
34
            self.bzrdir = self.bzrdir._real_bzrdir
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
35
        if self.bzrdir.root_transport.is_readonly():
36
            raise errors.UpgradeReadonly
37
        self.transport = self.bzrdir.root_transport
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
38
        self.pb = ui.ui_factory.nested_progress_bar()
39
        try:
40
            self.convert()
41
        finally:
42
            self.pb.finished()
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
43
44
    def convert(self):
1558.7.2 by Aaron Bentley
Upgrade works in repositories
45
        try:
46
            branch = self.bzrdir.open_branch()
47
            if branch.bzrdir.root_transport.base != \
48
                self.bzrdir.root_transport.base:
49
                self.pb.note("This is a checkout. The branch (%s) needs to be "
50
                             "upgraded separately.",
51
                             branch.bzrdir.root_transport.base)
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
52
            del branch
53
        except (errors.NotBranchError, errors.IncompatibleRepositories):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
54
            # 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
55
            # https://bugs.launchpad.net/bzr/+bug/253891
1558.7.2 by Aaron Bentley
Upgrade works in repositories
56
            pass
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
57
        if self.format is None:
4170.3.5 by Jelmer Vernooij
Fix upgrade if there is no local repository present.
58
            try:
59
                rich_root = self.bzrdir.find_repository()._format.rich_root_data
60
            except errors.NoRepositoryPresent:
61
                rich_root = False # assume no rich roots
62
            if rich_root:
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
63
                format_name = "default-rich-root"
64
            else:
65
                format_name = "default"
66
            format = format_registry.make_bzrdir(format_name)
67
        else:
68
            format = self.format
69
        if not self.bzrdir.needs_format_conversion(format):
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
70
            raise errors.UpToDateFormat(self.bzrdir._format)
1534.5.16 by Robert Collins
Review feedback.
71
        if not self.bzrdir.can_convert_format():
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
72
            raise errors.BzrError("cannot upgrade from bzrdir format %s" %
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
73
                           self.bzrdir._format)
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
74
        self.bzrdir.check_conversion_target(format)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
75
        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
76
        self.bzrdir.backup_bzrdir()
4170.3.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
77
        while self.bzrdir.needs_format_conversion(format):
78
            converter = self.bzrdir._format.get_converter(format)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
79
            self.bzrdir = converter.convert(self.bzrdir, self.pb)
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
80
        self.pb.note("finished")
81
82
1534.5.13 by Robert Collins
Correct buggy test.
83
def upgrade(url, format=None):
84
    """Upgrade to format, or the default bzrdir format if not supplied."""
85
    Convert(url, format)