13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""bzr upgrade logic."""
20
from bzrlib.bzrdir import BzrDir, BzrDirFormat, format_registry
19
# change upgrade from .bzr to create a '.bzr-new', then do a bait and switch.
22
from bzrlib.bzrdir import ConvertBzrDir4To5, ConvertBzrDir5To6, BzrDir, BzrDirFormat4, BzrDirFormat5, BzrDirFormat
21
23
import bzrlib.errors as errors
22
24
from bzrlib.remote import RemoteBzrDir
23
25
from bzrlib.transport import get_transport
46
48
branch = self.bzrdir.open_branch()
47
49
if branch.bzrdir.root_transport.base != \
48
50
self.bzrdir.root_transport.base:
49
ui.ui_factory.note("This is a checkout. The branch (%s) needs to be "
50
"upgraded separately." %
51
self.pb.note("This is a checkout. The branch (%s) needs to be "
52
"upgraded separately.",
51
53
branch.bzrdir.root_transport.base)
53
55
except (errors.NotBranchError, errors.IncompatibleRepositories):
54
# might not be a format we can open without upgrading; see e.g.
56
# might not be a format we can open without upgrading; see e.g.
55
57
# https://bugs.launchpad.net/bzr/+bug/253891
57
if self.format is None:
59
rich_root = self.bzrdir.find_repository()._format.rich_root_data
60
except errors.NoRepositoryPresent:
61
rich_root = False # assume no rich roots
63
format_name = "default-rich-root"
65
format_name = "default"
66
format = format_registry.make_bzrdir(format_name)
69
if not self.bzrdir.needs_format_conversion(format):
59
if not self.bzrdir.needs_format_conversion(self.format):
70
60
raise errors.UpToDateFormat(self.bzrdir._format)
71
61
if not self.bzrdir.can_convert_format():
72
62
raise errors.BzrError("cannot upgrade from bzrdir format %s" %
73
63
self.bzrdir._format)
74
self.bzrdir.check_conversion_target(format)
75
ui.ui_factory.note('starting upgrade of %s' % self.transport.base)
77
self.bzrdir.backup_bzrdir()
78
while self.bzrdir.needs_format_conversion(format):
79
converter = self.bzrdir._format.get_converter(format)
64
if self.format is None:
65
target_format = BzrDirFormat.get_default_format()
67
target_format = self.format
68
self.bzrdir.check_conversion_target(target_format)
69
self.pb.note('starting upgrade of %s', self.transport.base)
70
self._backup_control_dir()
71
while self.bzrdir.needs_format_conversion(self.format):
72
converter = self.bzrdir._format.get_converter(self.format)
80
73
self.bzrdir = converter.convert(self.bzrdir, self.pb)
81
ui.ui_factory.note("finished")
74
self.pb.note("finished")
76
def _backup_control_dir(self):
77
self.pb.note('making backup of tree history')
78
self.transport.copy_tree('.bzr', 'backup.bzr')
79
self.pb.note('%s.bzr has been backed up to %sbackup.bzr',
82
self.pb.note('if conversion fails, you can move this directory back to .bzr')
83
self.pb.note('if it succeeds, you can remove this directory if you wish')
84
85
def upgrade(url, format=None):
85
86
"""Upgrade to format, or the default bzrdir format if not supplied."""