235
235
def convert(self, to_convert, pb):
236
236
"""See Converter.convert()."""
237
self.bzrdir = to_convert
237
self.controldir = to_convert
238
238
if pb is not None:
239
239
warnings.warn(gettext("pb parameter to convert() is deprecated"))
240
240
self.pb = ui.ui_factory.nested_progress_bar()
242
242
ui.ui_factory.note(gettext('starting upgrade from format 4 to 5'))
243
if isinstance(self.bzrdir.transport, local.LocalTransport):
244
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
243
if isinstance(self.controldir.transport, local.LocalTransport):
244
self.controldir.get_workingtree_transport(None).delete('stat-cache')
245
245
self._convert_to_weaves()
246
return ControlDir.open(self.bzrdir.user_url)
246
return ControlDir.open(self.controldir.user_url)
248
248
self.pb.finished()
252
252
'note: upgrade may be faster if all store files are ungzipped first'))
254
254
# TODO permissions
255
stat = self.bzrdir.transport.stat('weaves')
255
stat = self.controldir.transport.stat('weaves')
256
256
if not S_ISDIR(stat.st_mode):
257
self.bzrdir.transport.delete('weaves')
258
self.bzrdir.transport.mkdir('weaves')
257
self.controldir.transport.delete('weaves')
258
self.controldir.transport.mkdir('weaves')
259
259
except errors.NoSuchFile:
260
self.bzrdir.transport.mkdir('weaves')
260
self.controldir.transport.mkdir('weaves')
261
261
# deliberately not a WeaveFile as we want to build it up slowly.
262
262
self.inv_weave = weave.Weave('inventory')
263
263
# holds in-memory weaves for all files
264
264
self.text_weaves = {}
265
self.bzrdir.transport.delete('branch-format')
266
self.branch = self.bzrdir.open_branch()
265
self.controldir.transport.delete('branch-format')
266
self.branch = self.controldir.open_branch()
267
267
self._convert_working_inv()
268
268
rev_history = self.branch._revision_history()
269
269
# to_read is a stack holding the revisions we still need to process;
293
293
self.branch._transport.put_bytes(
295
295
BzrDirFormat5().get_format_string(),
296
mode=self.bzrdir._get_file_mode())
296
mode=self.controldir._get_file_mode())
298
298
def _cleanup_spare_files_after_format4(self):
299
299
# FIXME working tree upgrade foo.
300
300
for n in 'merged-patches', 'pending-merged-patches':
302
302
## assert os.path.getsize(p) == 0
303
self.bzrdir.transport.delete(n)
303
self.controldir.transport.delete(n)
304
304
except errors.NoSuchFile:
306
self.bzrdir.transport.delete_tree('inventory-store')
307
self.bzrdir.transport.delete_tree('text-store')
306
self.controldir.transport.delete_tree('inventory-store')
307
self.controldir.transport.delete_tree('text-store')
309
309
def _convert_working_inv(self):
310
310
inv = xml4.serializer_v4.read_inventory(
311
311
self.branch._transport.get('inventory'))
312
312
new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
313
313
self.branch._transport.put_bytes('inventory', new_inv_xml,
314
mode=self.bzrdir._get_file_mode())
314
mode=self.controldir._get_file_mode())
316
316
def _write_all_weaves(self):
317
controlweaves = VersionedFileStore(self.bzrdir.transport, prefixed=False,
317
controlweaves = VersionedFileStore(self.controldir.transport, prefixed=False,
318
318
versionedfile_class=weave.WeaveFile)
319
weave_transport = self.bzrdir.transport.clone('weaves')
319
weave_transport = self.controldir.transport.clone('weaves')
320
320
weaves = VersionedFileStore(weave_transport, prefixed=False,
321
321
versionedfile_class=weave.WeaveFile)
322
322
transaction = WriteTransaction()
337
337
def _write_all_revs(self):
338
338
"""Write all revisions out in new form."""
339
self.bzrdir.transport.delete_tree('revision-store')
340
self.bzrdir.transport.mkdir('revision-store')
341
revision_transport = self.bzrdir.transport.clone('revision-store')
339
self.controldir.transport.delete_tree('revision-store')
340
self.controldir.transport.mkdir('revision-store')
341
revision_transport = self.controldir.transport.clone('revision-store')
342
342
# TODO permissions
343
343
from ...xml5 import serializer_v5
344
344
from .repository import RevisionTextStore
504
504
def convert(self, to_convert, pb):
505
505
"""See Converter.convert()."""
506
self.bzrdir = to_convert
506
self.controldir = to_convert
507
507
pb = ui.ui_factory.nested_progress_bar()
509
509
ui.ui_factory.note(gettext('starting upgrade from format 5 to 6'))
510
510
self._convert_to_prefixed()
511
return ControlDir.open(self.bzrdir.user_url)
511
return ControlDir.open(self.controldir.user_url)
515
515
def _convert_to_prefixed(self):
516
516
from ...store import TransportStore
517
self.bzrdir.transport.delete('branch-format')
517
self.controldir.transport.delete('branch-format')
518
518
for store_name in ["weaves", "revision-store"]:
519
519
ui.ui_factory.note(gettext("adding prefixes to %s") % store_name)
520
store_transport = self.bzrdir.transport.clone(store_name)
520
store_transport = self.controldir.transport.clone(store_name)
521
521
store = TransportStore(store_transport, prefixed=True)
522
522
for urlfilename in store_transport.list_dir('.'):
523
523
filename = urlutils.unescape(urlfilename)
535
535
except errors.NoSuchFile: # catches missing dirs strangely enough
536
536
store_transport.mkdir(osutils.dirname(new_name))
537
537
store_transport.move(filename, new_name)
538
self.bzrdir.transport.put_bytes(
538
self.controldir.transport.put_bytes(
540
540
BzrDirFormat6().get_format_string(),
541
mode=self.bzrdir._get_file_mode())
541
mode=self.controldir._get_file_mode())
544
544
class ConvertBzrDir6ToMeta(Converter):
548
548
"""See Converter.convert()."""
549
549
from .repository import RepositoryFormat7
550
550
from ...bzr.fullhistory import BzrBranchFormat5
551
self.bzrdir = to_convert
551
self.controldir = to_convert
552
552
self.pb = ui.ui_factory.nested_progress_bar()
554
554
self.total = 20 # the steps we know about
555
555
self.garbage_inventories = []
556
self.dir_mode = self.bzrdir._get_dir_mode()
557
self.file_mode = self.bzrdir._get_file_mode()
556
self.dir_mode = self.controldir._get_dir_mode()
557
self.file_mode = self.controldir._get_file_mode()
559
559
ui.ui_factory.note(gettext('starting upgrade from format 6 to metadir'))
560
self.bzrdir.transport.put_bytes(
560
self.controldir.transport.put_bytes(
562
562
"Converting to format 6",
563
563
mode=self.file_mode)
565
565
# first off, nuke ancestry.weave, it was never used.
567
567
self.step(gettext('Removing ancestry.weave'))
568
self.bzrdir.transport.delete('ancestry.weave')
568
self.controldir.transport.delete('ancestry.weave')
569
569
except errors.NoSuchFile:
571
571
# find out whats there
572
572
self.step(gettext('Finding branch files'))
573
last_revision = self.bzrdir.open_branch().last_revision()
574
bzrcontents = self.bzrdir.transport.list_dir('.')
573
last_revision = self.controldir.open_branch().last_revision()
574
bzrcontents = self.controldir.transport.list_dir('.')
575
575
for name in bzrcontents:
576
576
if name.startswith('basis-inventory.'):
577
577
self.garbage_inventories.append(name)
580
580
('revision-store', True),
581
581
('weaves', True)]
582
582
self.step(gettext('Upgrading repository') + ' ')
583
self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
583
self.controldir.transport.mkdir('repository', mode=self.dir_mode)
584
584
self.make_lock('repository')
585
585
# we hard code the formats here because we are converting into
586
586
# the meta format. The meta format upgrader can take this to a
590
590
self.move_entry('repository', entry)
592
592
self.step(gettext('Upgrading branch') + ' ')
593
self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
593
self.controldir.transport.mkdir('branch', mode=self.dir_mode)
594
594
self.make_lock('branch')
595
595
self.put_format('branch', BzrBranchFormat5())
596
596
branch_files = [('revision-history', True),
616
616
# If some checkout files are there, we may as well get rid of them.
617
617
for name, mandatory in checkout_files:
618
618
if name in bzrcontents:
619
self.bzrdir.transport.delete(name)
619
self.controldir.transport.delete(name)
621
621
from ...bzr.workingtree_3 import WorkingTreeFormat3
622
622
self.step(gettext('Upgrading working tree'))
623
self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
623
self.controldir.transport.mkdir('checkout', mode=self.dir_mode)
624
624
self.make_lock('checkout')
626
626
'checkout', WorkingTreeFormat3())
627
self.bzrdir.transport.delete_multi(
627
self.controldir.transport.delete_multi(
628
628
self.garbage_inventories, self.pb)
629
629
for entry in checkout_files:
630
630
self.move_entry('checkout', entry)
631
631
if last_revision is not None:
632
self.bzrdir.transport.put_bytes(
632
self.controldir.transport.put_bytes(
633
633
'checkout/last-revision', last_revision)
634
self.bzrdir.transport.put_bytes(
634
self.controldir.transport.put_bytes(
636
636
BzrDirMetaFormat1().get_format_string(),
637
637
mode=self.file_mode)
638
638
self.pb.finished()
639
return ControlDir.open(self.bzrdir.user_url)
639
return ControlDir.open(self.controldir.user_url)
641
641
def make_lock(self, name):
642
642
"""Make a lock for the new control dir name."""
643
643
self.step(gettext('Make %s lock') % name)
644
ld = lockdir.LockDir(self.bzrdir.transport,
644
ld = lockdir.LockDir(self.controldir.transport,
645
645
'%s/lock' % name,
646
646
file_modebits=self.file_mode,
647
647
dir_modebits=self.dir_mode)
653
653
mandatory = entry[1]
654
654
self.step(gettext('Moving %s') % name)
656
self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
656
self.controldir.transport.move(name, '%s/%s' % (new_dir, name))
657
657
except errors.NoSuchFile:
661
661
def put_format(self, dirname, format):
662
self.bzrdir.transport.put_bytes('%s/format' % dirname,
662
self.controldir.transport.put_bytes('%s/format' % dirname,
663
663
format.get_format_string(),
747
747
def cloning_metadir(self, require_stacking=False):
748
748
"""Produce a metadir suitable for cloning with."""
749
749
if require_stacking:
750
return format_registry.make_bzrdir('1.6')
750
return format_registry.make_controldir('1.6')
751
751
return self._format.__class__()
753
753
def clone(self, url, revision_id=None, force_new_repo=False,