80
74
if require_stacking:
81
75
format = BzrDirMetaFormat1()
82
76
return format.initialize_on_transport_ex(transport,
83
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
84
force_new_repo=force_new_repo, stacked_on=stacked_on,
85
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
86
make_working_trees=make_working_trees, shared_repo=shared_repo)
77
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
78
force_new_repo=force_new_repo, stacked_on=stacked_on,
79
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
80
make_working_trees=make_working_trees, shared_repo=shared_repo)
87
81
return BzrDirFormat.initialize_on_transport_ex(self, transport,
88
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
89
force_new_repo=force_new_repo, stacked_on=stacked_on,
90
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
91
make_working_trees=make_working_trees, shared_repo=shared_repo)
82
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
83
force_new_repo=force_new_repo, stacked_on=stacked_on,
84
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
85
make_working_trees=make_working_trees, shared_repo=shared_repo)
94
88
def from_string(cls, format_string):
175
169
_lock_class = lockable_files.TransportLock
177
171
def __eq__(self, other):
178
return isinstance(self, type(other))
172
return type(self) == type(other)
181
175
def get_format_string(cls):
182
176
"""See BzrDirFormat.get_format_string()."""
183
return b"Bazaar-NG branch, format 6\n"
177
return "Bazaar-NG branch, format 6\n"
185
179
def get_format_description(self):
186
180
"""See ControlDirFormat.get_format_description()."""
187
181
return "All-in-one format 6"
189
183
def get_branch_format(self):
190
from .branch import BzrBranchFormat4
184
from brzlib.plugins.weave_fmt.branch import BzrBranchFormat4
191
185
return BzrBranchFormat4()
193
187
def get_converter(self, format=None):
239
233
def convert(self, to_convert, pb):
240
234
"""See Converter.convert()."""
241
self.controldir = to_convert
235
self.bzrdir = to_convert
242
236
if pb is not None:
243
237
warnings.warn(gettext("pb parameter to convert() is deprecated"))
244
with ui.ui_factory.nested_progress_bar() as self.pb:
238
self.pb = ui.ui_factory.nested_progress_bar()
245
240
ui.ui_factory.note(gettext('starting upgrade from format 4 to 5'))
246
if isinstance(self.controldir.transport, local.LocalTransport):
247
self.controldir.get_workingtree_transport(
248
None).delete('stat-cache')
241
if isinstance(self.bzrdir.transport, local.LocalTransport):
242
self.bzrdir.get_workingtree_transport(None).delete('stat-cache')
249
243
self._convert_to_weaves()
250
return ControlDir.open(self.controldir.user_url)
244
return ControlDir.open(self.bzrdir.user_url)
252
248
def _convert_to_weaves(self):
253
249
ui.ui_factory.note(gettext(
254
'note: upgrade may be faster if all store files are ungzipped first'))
250
'note: upgrade may be faster if all store files are ungzipped first'))
256
252
# TODO permissions
257
stat = self.controldir.transport.stat('weaves')
253
stat = self.bzrdir.transport.stat('weaves')
258
254
if not S_ISDIR(stat.st_mode):
259
self.controldir.transport.delete('weaves')
260
self.controldir.transport.mkdir('weaves')
255
self.bzrdir.transport.delete('weaves')
256
self.bzrdir.transport.mkdir('weaves')
261
257
except errors.NoSuchFile:
262
self.controldir.transport.mkdir('weaves')
258
self.bzrdir.transport.mkdir('weaves')
263
259
# deliberately not a WeaveFile as we want to build it up slowly.
264
260
self.inv_weave = weave.Weave('inventory')
265
261
# holds in-memory weaves for all files
266
262
self.text_weaves = {}
267
self.controldir.transport.delete('branch-format')
268
self.branch = self.controldir.open_branch()
263
self.bzrdir.transport.delete('branch-format')
264
self.branch = self.bzrdir.open_branch()
269
265
self._convert_working_inv()
270
266
rev_history = self.branch._revision_history()
271
267
# to_read is a stack holding the revisions we still need to process;
287
283
self._write_all_revs()
288
284
ui.ui_factory.note(gettext('upgraded to weaves:'))
289
285
ui.ui_factory.note(' ' + gettext('%6d revisions and inventories') %
291
287
ui.ui_factory.note(' ' + gettext('%6d revisions not present') %
292
len(self.absent_revisions))
288
len(self.absent_revisions))
293
289
ui.ui_factory.note(' ' + gettext('%6d texts') % self.text_count)
294
290
self._cleanup_spare_files_after_format4()
295
291
self.branch._transport.put_bytes(
297
293
BzrDirFormat5().get_format_string(),
298
mode=self.controldir._get_file_mode())
294
mode=self.bzrdir._get_file_mode())
300
296
def _cleanup_spare_files_after_format4(self):
301
297
# FIXME working tree upgrade foo.
302
298
for n in 'merged-patches', 'pending-merged-patches':
304
300
## assert os.path.getsize(p) == 0
305
self.controldir.transport.delete(n)
301
self.bzrdir.transport.delete(n)
306
302
except errors.NoSuchFile:
308
self.controldir.transport.delete_tree('inventory-store')
309
self.controldir.transport.delete_tree('text-store')
304
self.bzrdir.transport.delete_tree('inventory-store')
305
self.bzrdir.transport.delete_tree('text-store')
311
307
def _convert_working_inv(self):
312
308
inv = xml4.serializer_v4.read_inventory(
313
self.branch._transport.get('inventory'))
315
xml5.serializer_v5.write_inventory(inv, f, working=True)
316
self.branch._transport.put_bytes('inventory', f.getvalue(),
317
mode=self.controldir._get_file_mode())
309
self.branch._transport.get('inventory'))
310
new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
311
self.branch._transport.put_bytes('inventory', new_inv_xml,
312
mode=self.bzrdir._get_file_mode())
319
314
def _write_all_weaves(self):
320
controlweaves = VersionedFileStore(self.controldir.transport, prefixed=False,
321
versionedfile_class=weave.WeaveFile)
322
weave_transport = self.controldir.transport.clone('weaves')
315
controlweaves = VersionedFileStore(self.bzrdir.transport, prefixed=False,
316
versionedfile_class=weave.WeaveFile)
317
weave_transport = self.bzrdir.transport.clone('weaves')
323
318
weaves = VersionedFileStore(weave_transport, prefixed=False,
324
versionedfile_class=weave.WeaveFile)
319
versionedfile_class=weave.WeaveFile)
325
320
transaction = WriteTransaction()
329
324
for file_id, file_weave in self.text_weaves.items():
330
325
self.pb.update(gettext('writing weave'), i,
331
len(self.text_weaves))
326
len(self.text_weaves))
332
327
weaves._put_weave(file_id, file_weave, transaction)
334
329
self.pb.update(gettext('inventory'), 0, 1)
335
controlweaves._put_weave(b'inventory', self.inv_weave, transaction)
330
controlweaves._put_weave('inventory', self.inv_weave, transaction)
336
331
self.pb.update(gettext('inventory'), 1, 1)
340
335
def _write_all_revs(self):
341
336
"""Write all revisions out in new form."""
342
self.controldir.transport.delete_tree('revision-store')
343
self.controldir.transport.mkdir('revision-store')
344
revision_transport = self.controldir.transport.clone('revision-store')
337
self.bzrdir.transport.delete_tree('revision-store')
338
self.bzrdir.transport.mkdir('revision-store')
339
revision_transport = self.bzrdir.transport.clone('revision-store')
345
340
# TODO permissions
346
from ...bzr.xml5 import serializer_v5
347
from .repository import RevisionTextStore
341
from brzlib.xml5 import serializer_v5
342
from brzlib.plugins.weave_fmt.repository import RevisionTextStore
348
343
revision_store = RevisionTextStore(revision_transport,
349
serializer_v5, False, versionedfile.PrefixMapper(),
350
lambda: True, lambda: True)
344
serializer_v5, False, versionedfile.PrefixMapper(),
345
lambda:True, lambda:True)
352
347
for i, rev_id in enumerate(self.converted_revs):
353
348
self.pb.update(gettext('write revision'), i,
354
len(self.converted_revs))
355
lines = serializer_v5.write_revision_to_lines(
349
len(self.converted_revs))
350
text = serializer_v5.write_revision_to_string(
356
351
self.revisions[rev_id])
358
revision_store.add_lines(key, None, lines)
353
revision_store.add_lines(key, None, osutils.split_lines(text))
436
435
self.text_weaves[file_id] = w
437
436
text_changed = False
438
437
parent_candiate_entries = ie.parent_candidates(parent_invs)
439
heads = graph.Graph(self).heads(parent_candiate_entries)
438
heads = graph.Graph(self).heads(parent_candiate_entries.keys())
440
439
# XXX: Note that this is unordered - and this is tolerable because
441
440
# the previous code was also unordered.
442
previous_entries = {head: parent_candiate_entries[head]
441
previous_entries = dict((head, parent_candiate_entries[head]) for head
444
443
self.snapshot_ie(previous_entries, ie, w, rev_id)
446
445
def get_parent_map(self, revision_ids):
447
446
"""See graph.StackedParentsProvider.get_parent_map"""
448
447
return dict((revision_id, self.revisions[revision_id])
449
448
for revision_id in revision_ids
450
if revision_id in self.revisions)
449
if revision_id in self.revisions)
452
451
def snapshot_ie(self, previous_revisions, ie, w, rev_id):
453
452
# TODO: convert this logic, which is ~= snapshot to
500
502
def convert(self, to_convert, pb):
501
503
"""See Converter.convert()."""
502
self.controldir = to_convert
503
with ui.ui_factory.nested_progress_bar() as pb:
504
self.bzrdir = to_convert
505
pb = ui.ui_factory.nested_progress_bar()
504
507
ui.ui_factory.note(gettext('starting upgrade from format 5 to 6'))
505
508
self._convert_to_prefixed()
506
return ControlDir.open(self.controldir.user_url)
509
return ControlDir.open(self.bzrdir.user_url)
508
513
def _convert_to_prefixed(self):
509
from .store import TransportStore
510
self.controldir.transport.delete('branch-format')
514
from brzlib.store import TransportStore
515
self.bzrdir.transport.delete('branch-format')
511
516
for store_name in ["weaves", "revision-store"]:
512
517
ui.ui_factory.note(gettext("adding prefixes to %s") % store_name)
513
store_transport = self.controldir.transport.clone(store_name)
518
store_transport = self.bzrdir.transport.clone(store_name)
514
519
store = TransportStore(store_transport, prefixed=True)
515
520
for urlfilename in store_transport.list_dir('.'):
516
521
filename = urlutils.unescape(urlfilename)
517
if (filename.endswith(".weave")
518
or filename.endswith(".gz")
519
or filename.endswith(".sig")):
522
if (filename.endswith(".weave") or
523
filename.endswith(".gz") or
524
filename.endswith(".sig")):
520
525
file_id, suffix = os.path.splitext(filename)
522
527
file_id = filename
524
new_name = store._mapper.map(
525
(file_id.encode('utf-8'),)) + suffix
529
new_name = store._mapper.map((file_id,)) + suffix
526
530
# FIXME keep track of the dirs made RBC 20060121
528
532
store_transport.move(filename, new_name)
529
except errors.NoSuchFile: # catches missing dirs strangely enough
533
except errors.NoSuchFile: # catches missing dirs strangely enough
530
534
store_transport.mkdir(osutils.dirname(new_name))
531
535
store_transport.move(filename, new_name)
532
self.controldir.transport.put_bytes(
536
self.bzrdir.transport.put_bytes(
534
538
BzrDirFormat6().get_format_string(),
535
mode=self.controldir._get_file_mode())
539
mode=self.bzrdir._get_file_mode())
538
542
class ConvertBzrDir6ToMeta(Converter):
541
545
def convert(self, to_convert, pb):
542
546
"""See Converter.convert()."""
543
from .repository import RepositoryFormat7
544
from ...bzr.fullhistory import BzrBranchFormat5
545
self.controldir = to_convert
547
from brzlib.plugins.weave_fmt.repository import RepositoryFormat7
548
from brzlib.branchfmt.fullhistory import BzrBranchFormat5
549
self.bzrdir = to_convert
546
550
self.pb = ui.ui_factory.nested_progress_bar()
548
self.total = 20 # the steps we know about
552
self.total = 20 # the steps we know about
549
553
self.garbage_inventories = []
550
self.dir_mode = self.controldir._get_dir_mode()
551
self.file_mode = self.controldir._get_file_mode()
554
self.dir_mode = self.bzrdir._get_dir_mode()
555
self.file_mode = self.bzrdir._get_file_mode()
554
gettext('starting upgrade from format 6 to metadir'))
555
self.controldir.transport.put_bytes(
557
b"Converting to format 6",
557
ui.ui_factory.note(gettext('starting upgrade from format 6 to metadir'))
558
self.bzrdir.transport.put_bytes(
560
"Converting to format 6",
559
562
# its faster to move specific files around than to open and use the apis...
560
563
# first off, nuke ancestry.weave, it was never used.
562
565
self.step(gettext('Removing ancestry.weave'))
563
self.controldir.transport.delete('ancestry.weave')
566
self.bzrdir.transport.delete('ancestry.weave')
564
567
except errors.NoSuchFile:
566
569
# find out whats there
567
570
self.step(gettext('Finding branch files'))
568
last_revision = self.controldir.open_branch().last_revision()
569
bzrcontents = self.controldir.transport.list_dir('.')
571
last_revision = self.bzrdir.open_branch().last_revision()
572
bzrcontents = self.bzrdir.transport.list_dir('.')
570
573
for name in bzrcontents:
571
574
if name.startswith('basis-inventory.'):
572
575
self.garbage_inventories.append(name)
611
614
# If some checkout files are there, we may as well get rid of them.
612
615
for name, mandatory in checkout_files:
613
616
if name in bzrcontents:
614
self.controldir.transport.delete(name)
617
self.bzrdir.transport.delete(name)
616
from ...bzr.workingtree_3 import WorkingTreeFormat3
619
from brzlib.workingtree_3 import WorkingTreeFormat3
617
620
self.step(gettext('Upgrading working tree'))
618
self.controldir.transport.mkdir('checkout', mode=self.dir_mode)
621
self.bzrdir.transport.mkdir('checkout', mode=self.dir_mode)
619
622
self.make_lock('checkout')
620
self.put_format('checkout', WorkingTreeFormat3())
621
for path in self.garbage_inventories:
622
self.controldir.transport.delete(path)
624
'checkout', WorkingTreeFormat3())
625
self.bzrdir.transport.delete_multi(
626
self.garbage_inventories, self.pb)
623
627
for entry in checkout_files:
624
628
self.move_entry('checkout', entry)
625
629
if last_revision is not None:
626
self.controldir.transport.put_bytes(
630
self.bzrdir.transport.put_bytes(
627
631
'checkout/last-revision', last_revision)
628
self.controldir.transport.put_bytes(
632
self.bzrdir.transport.put_bytes(
630
634
BzrDirMetaFormat1().get_format_string(),
631
635
mode=self.file_mode)
632
636
self.pb.finished()
633
return ControlDir.open(self.controldir.user_url)
637
return ControlDir.open(self.bzrdir.user_url)
635
639
def make_lock(self, name):
636
640
"""Make a lock for the new control dir name."""
637
641
self.step(gettext('Make %s lock') % name)
638
ld = lockdir.LockDir(self.controldir.transport,
642
ld = lockdir.LockDir(self.bzrdir.transport,
639
643
'%s/lock' % name,
640
644
file_modebits=self.file_mode,
641
645
dir_modebits=self.dir_mode)
870
874
return self.transport
871
875
raise errors.IncompatibleFormat(workingtree_format, self._format)
873
def needs_format_conversion(self, format):
877
def needs_format_conversion(self, format=None):
874
878
"""See ControlDir.needs_format_conversion()."""
875
879
# if the format is not the same as the system default,
876
880
# an upgrade is needed.
882
symbol_versioning.warn(symbol_versioning.deprecated_in((1, 13, 0))
883
% 'needs_format_conversion(format=None)')
884
format = BzrDirFormat.get_default_format()
877
885
return not isinstance(self._format, format.__class__)
879
887
def open_branch(self, name=None, unsupported=False,
880
888
ignore_fallbacks=False, possible_transports=None):
881
889
"""See ControlDir.open_branch."""
882
from .branch import BzrBranchFormat4
890
from brzlib.plugins.weave_fmt.branch import BzrBranchFormat4
883
891
format = BzrBranchFormat4()
884
892
format.check_support_status(unsupported)
885
893
return format.open(self, name, _found=True,
886
possible_transports=possible_transports)
894
possible_transports=possible_transports)
888
896
def sprout(self, url, revision_id=None, force_new_repo=False,
889
recurse=None, possible_transports=None, accelerator_tree=None,
897
possible_transports=None, accelerator_tree=None,
890
898
hardlink=False, stacked=False, create_tree_if_local=True,
891
899
source_branch=None):
892
900
"""See ControlDir.sprout()."""