233
233
def convert(self, to_convert, pb):
234
234
"""See Converter.convert()."""
235
self.bzrdir = to_convert
235
self.controldir = to_convert
236
236
if pb is not None:
237
237
warnings.warn(gettext("pb parameter to convert() is deprecated"))
238
238
self.pb = ui.ui_factory.nested_progress_bar()
240
240
ui.ui_factory.note(gettext('starting upgrade from format 4 to 5'))
241
if isinstance(self.bzrdir.transport, local.LocalTransport):
242
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
241
if isinstance(self.controldir.transport, local.LocalTransport):
242
self.controldir.get_workingtree_transport(None).delete('stat-cache')
243
243
self._convert_to_weaves()
244
return ControlDir.open(self.bzrdir.user_url)
244
return ControlDir.open(self.controldir.user_url)
246
246
self.pb.finished()
250
250
'note: upgrade may be faster if all store files are ungzipped first'))
252
252
# TODO permissions
253
stat = self.bzrdir.transport.stat('weaves')
253
stat = self.controldir.transport.stat('weaves')
254
254
if not S_ISDIR(stat.st_mode):
255
self.bzrdir.transport.delete('weaves')
256
self.bzrdir.transport.mkdir('weaves')
255
self.controldir.transport.delete('weaves')
256
self.controldir.transport.mkdir('weaves')
257
257
except errors.NoSuchFile:
258
self.bzrdir.transport.mkdir('weaves')
258
self.controldir.transport.mkdir('weaves')
259
259
# deliberately not a WeaveFile as we want to build it up slowly.
260
260
self.inv_weave = weave.Weave('inventory')
261
261
# holds in-memory weaves for all files
262
262
self.text_weaves = {}
263
self.bzrdir.transport.delete('branch-format')
264
self.branch = self.bzrdir.open_branch()
263
self.controldir.transport.delete('branch-format')
264
self.branch = self.controldir.open_branch()
265
265
self._convert_working_inv()
266
266
rev_history = self.branch._revision_history()
267
267
# to_read is a stack holding the revisions we still need to process;
291
291
self.branch._transport.put_bytes(
293
293
BzrDirFormat5().get_format_string(),
294
mode=self.bzrdir._get_file_mode())
294
mode=self.controldir._get_file_mode())
296
296
def _cleanup_spare_files_after_format4(self):
297
297
# FIXME working tree upgrade foo.
298
298
for n in 'merged-patches', 'pending-merged-patches':
300
300
## assert os.path.getsize(p) == 0
301
self.bzrdir.transport.delete(n)
301
self.controldir.transport.delete(n)
302
302
except errors.NoSuchFile:
304
self.bzrdir.transport.delete_tree('inventory-store')
305
self.bzrdir.transport.delete_tree('text-store')
304
self.controldir.transport.delete_tree('inventory-store')
305
self.controldir.transport.delete_tree('text-store')
307
307
def _convert_working_inv(self):
308
308
inv = xml4.serializer_v4.read_inventory(
309
309
self.branch._transport.get('inventory'))
310
310
new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
311
311
self.branch._transport.put_bytes('inventory', new_inv_xml,
312
mode=self.bzrdir._get_file_mode())
312
mode=self.controldir._get_file_mode())
314
314
def _write_all_weaves(self):
315
controlweaves = VersionedFileStore(self.bzrdir.transport, prefixed=False,
315
controlweaves = VersionedFileStore(self.controldir.transport, prefixed=False,
316
316
versionedfile_class=weave.WeaveFile)
317
weave_transport = self.bzrdir.transport.clone('weaves')
317
weave_transport = self.controldir.transport.clone('weaves')
318
318
weaves = VersionedFileStore(weave_transport, prefixed=False,
319
319
versionedfile_class=weave.WeaveFile)
320
320
transaction = WriteTransaction()
335
335
def _write_all_revs(self):
336
336
"""Write all revisions out in new form."""
337
self.bzrdir.transport.delete_tree('revision-store')
338
self.bzrdir.transport.mkdir('revision-store')
339
revision_transport = self.bzrdir.transport.clone('revision-store')
337
self.controldir.transport.delete_tree('revision-store')
338
self.controldir.transport.mkdir('revision-store')
339
revision_transport = self.controldir.transport.clone('revision-store')
340
340
# TODO permissions
341
341
from ...xml5 import serializer_v5
342
342
from .repository import RevisionTextStore
502
502
def convert(self, to_convert, pb):
503
503
"""See Converter.convert()."""
504
self.bzrdir = to_convert
504
self.controldir = to_convert
505
505
pb = ui.ui_factory.nested_progress_bar()
507
507
ui.ui_factory.note(gettext('starting upgrade from format 5 to 6'))
508
508
self._convert_to_prefixed()
509
return ControlDir.open(self.bzrdir.user_url)
509
return ControlDir.open(self.controldir.user_url)
513
513
def _convert_to_prefixed(self):
514
514
from ...store import TransportStore
515
self.bzrdir.transport.delete('branch-format')
515
self.controldir.transport.delete('branch-format')
516
516
for store_name in ["weaves", "revision-store"]:
517
517
ui.ui_factory.note(gettext("adding prefixes to %s") % store_name)
518
store_transport = self.bzrdir.transport.clone(store_name)
518
store_transport = self.controldir.transport.clone(store_name)
519
519
store = TransportStore(store_transport, prefixed=True)
520
520
for urlfilename in store_transport.list_dir('.'):
521
521
filename = urlutils.unescape(urlfilename)
533
533
except errors.NoSuchFile: # catches missing dirs strangely enough
534
534
store_transport.mkdir(osutils.dirname(new_name))
535
535
store_transport.move(filename, new_name)
536
self.bzrdir.transport.put_bytes(
536
self.controldir.transport.put_bytes(
538
538
BzrDirFormat6().get_format_string(),
539
mode=self.bzrdir._get_file_mode())
539
mode=self.controldir._get_file_mode())
542
542
class ConvertBzrDir6ToMeta(Converter):
546
546
"""See Converter.convert()."""
547
547
from .repository import RepositoryFormat7
548
548
from ...branchfmt.fullhistory import BzrBranchFormat5
549
self.bzrdir = to_convert
549
self.controldir = to_convert
550
550
self.pb = ui.ui_factory.nested_progress_bar()
552
552
self.total = 20 # the steps we know about
553
553
self.garbage_inventories = []
554
self.dir_mode = self.bzrdir._get_dir_mode()
555
self.file_mode = self.bzrdir._get_file_mode()
554
self.dir_mode = self.controldir._get_dir_mode()
555
self.file_mode = self.controldir._get_file_mode()
557
557
ui.ui_factory.note(gettext('starting upgrade from format 6 to metadir'))
558
self.bzrdir.transport.put_bytes(
558
self.controldir.transport.put_bytes(
560
560
"Converting to format 6",
561
561
mode=self.file_mode)
563
563
# first off, nuke ancestry.weave, it was never used.
565
565
self.step(gettext('Removing ancestry.weave'))
566
self.bzrdir.transport.delete('ancestry.weave')
566
self.controldir.transport.delete('ancestry.weave')
567
567
except errors.NoSuchFile:
569
569
# find out whats there
570
570
self.step(gettext('Finding branch files'))
571
last_revision = self.bzrdir.open_branch().last_revision()
572
bzrcontents = self.bzrdir.transport.list_dir('.')
571
last_revision = self.controldir.open_branch().last_revision()
572
bzrcontents = self.controldir.transport.list_dir('.')
573
573
for name in bzrcontents:
574
574
if name.startswith('basis-inventory.'):
575
575
self.garbage_inventories.append(name)
578
578
('revision-store', True),
579
579
('weaves', True)]
580
580
self.step(gettext('Upgrading repository') + ' ')
581
self.bzrdir.transport.mkdir('repository', mode=self.dir_mode)
581
self.controldir.transport.mkdir('repository', mode=self.dir_mode)
582
582
self.make_lock('repository')
583
583
# we hard code the formats here because we are converting into
584
584
# the meta format. The meta format upgrader can take this to a
588
588
self.move_entry('repository', entry)
590
590
self.step(gettext('Upgrading branch') + ' ')
591
self.bzrdir.transport.mkdir('branch', mode=self.dir_mode)
591
self.controldir.transport.mkdir('branch', mode=self.dir_mode)
592
592
self.make_lock('branch')
593
593
self.put_format('branch', BzrBranchFormat5())
594
594
branch_files = [('revision-history', True),
614
614
# If some checkout files are there, we may as well get rid of them.
615
615
for name, mandatory in checkout_files:
616
616
if name in bzrcontents:
617
self.bzrdir.transport.delete(name)
617
self.controldir.transport.delete(name)
619
619
from ...workingtree_3 import WorkingTreeFormat3
620
620
self.step(gettext('Upgrading working tree'))
621
self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
621
self.controldir.transport.mkdir('checkout', mode=self.dir_mode)
622
622
self.make_lock('checkout')
624
624
'checkout', WorkingTreeFormat3())
625
self.bzrdir.transport.delete_multi(
625
self.controldir.transport.delete_multi(
626
626
self.garbage_inventories, self.pb)
627
627
for entry in checkout_files:
628
628
self.move_entry('checkout', entry)
629
629
if last_revision is not None:
630
self.bzrdir.transport.put_bytes(
630
self.controldir.transport.put_bytes(
631
631
'checkout/last-revision', last_revision)
632
self.bzrdir.transport.put_bytes(
632
self.controldir.transport.put_bytes(
634
634
BzrDirMetaFormat1().get_format_string(),
635
635
mode=self.file_mode)
636
636
self.pb.finished()
637
return ControlDir.open(self.bzrdir.user_url)
637
return ControlDir.open(self.controldir.user_url)
639
639
def make_lock(self, name):
640
640
"""Make a lock for the new control dir name."""
641
641
self.step(gettext('Make %s lock') % name)
642
ld = lockdir.LockDir(self.bzrdir.transport,
642
ld = lockdir.LockDir(self.controldir.transport,
643
643
'%s/lock' % name,
644
644
file_modebits=self.file_mode,
645
645
dir_modebits=self.dir_mode)
651
651
mandatory = entry[1]
652
652
self.step(gettext('Moving %s') % name)
654
self.bzrdir.transport.move(name, '%s/%s' % (new_dir, name))
654
self.controldir.transport.move(name, '%s/%s' % (new_dir, name))
655
655
except errors.NoSuchFile:
659
659
def put_format(self, dirname, format):
660
self.bzrdir.transport.put_bytes('%s/format' % dirname,
660
self.controldir.transport.put_bytes('%s/format' % dirname,
661
661
format.get_format_string(),