~bzr-pqm/bzr/bzr.dev

1080 by Martin Pool
- test tool for converting history to weave files
1
# Copyright (C) 2005 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
19
# change upgrade from .bzr to create a '.bzr-new', then do a bait and switch.
20
1080 by Martin Pool
- test tool for converting history to weave files
21
1910.2.12 by Aaron Bentley
Implement knit repo format 2
22
from bzrlib.bzrdir import ConvertBzrDir4To5, ConvertBzrDir5To6, BzrDir, BzrDirFormat4, BzrDirFormat5, BzrDirFormat
1534.4.44 by Robert Collins
Make a new BzrDir format that uses a versioned branch format in a branch/ subdirectory.
23
import bzrlib.errors as errors
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
24
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.
25
import bzrlib.ui as ui
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
26
27
28
class Convert(object):
29
1534.5.13 by Robert Collins
Correct buggy test.
30
    def __init__(self, url, format):
31
        self.format = format
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
32
        self.bzrdir = BzrDir.open_unsupported(url)
33
        if self.bzrdir.root_transport.is_readonly():
34
            raise errors.UpgradeReadonly
35
        self.transport = self.bzrdir.root_transport
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
36
        self.pb = ui.ui_factory.nested_progress_bar()
37
        try:
38
            self.convert()
39
        finally:
40
            self.pb.finished()
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
41
42
    def convert(self):
1558.7.2 by Aaron Bentley
Upgrade works in repositories
43
        try:
44
            branch = self.bzrdir.open_branch()
45
            if branch.bzrdir.root_transport.base != \
46
                self.bzrdir.root_transport.base:
47
                self.pb.note("This is a checkout. The branch (%s) needs to be "
48
                             "upgraded separately.",
49
                             branch.bzrdir.root_transport.base)
50
        except errors.NotBranchError:
51
            pass
1534.5.16 by Robert Collins
Review feedback.
52
        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.
53
            raise errors.UpToDateFormat(self.bzrdir._format)
1534.5.16 by Robert Collins
Review feedback.
54
        if not self.bzrdir.can_convert_format():
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
55
            raise errors.BzrError("cannot upgrade from branch format %s" %
56
                           self.bzrdir._format)
1910.2.12 by Aaron Bentley
Implement knit repo format 2
57
        if self.format is None:
58
            target_format = BzrDirFormat.get_default_format()
59
        else:
60
            target_format = self.format
61
        self.bzrdir.check_conversion_target(target_format)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
62
        self.pb.note('starting upgrade of %s', self.transport.base)
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
63
        self._backup_control_dir()
1534.5.16 by Robert Collins
Review feedback.
64
        while self.bzrdir.needs_format_conversion(self.format):
65
            converter = self.bzrdir._format.get_converter(self.format)
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
66
            self.bzrdir = converter.convert(self.bzrdir, self.pb)
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
67
        self.pb.note("finished")
68
69
    def _backup_control_dir(self):
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
70
        self.pb.note('making backup of tree history')
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
71
        self.transport.copy_tree('.bzr', '.bzr.backup')
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
72
        self.pb.note('%s.bzr has been backed up to %s.bzr.backup',
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
73
             self.transport.base,
74
             self.transport.base)
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
75
        self.pb.note('if conversion fails, you can move this directory back to .bzr')
76
        self.pb.note('if it succeeds, you can remove this directory if you wish')
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
77
1534.5.13 by Robert Collins
Correct buggy test.
78
def upgrade(url, format=None):
79
    """Upgrade to format, or the default bzrdir format if not supplied."""
80
    Convert(url, format)