72
70
fixed_components = True
74
72
def initialize_on_transport_ex(self, transport, use_existing_dir=False,
75
create_prefix=False, force_new_repo=False, stacked_on=None,
76
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
73
create_prefix=False, force_new_repo=False, stacked_on=None,
74
stack_on_pwd=None, repo_format_name=None, make_working_trees=None,
78
76
"""See ControlDir.initialize_on_transport_ex."""
79
77
require_stacking = (stacked_on is not None)
80
78
# Format 5 cannot stack, but we've been asked to - actually init
82
80
if require_stacking:
83
81
format = BzrDirMetaFormat1()
84
82
return format.initialize_on_transport_ex(transport,
85
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
86
force_new_repo=force_new_repo, stacked_on=stacked_on,
87
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
88
make_working_trees=make_working_trees, shared_repo=shared_repo)
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)
89
87
return BzrDirFormat.initialize_on_transport_ex(self, transport,
90
use_existing_dir=use_existing_dir, create_prefix=create_prefix,
91
force_new_repo=force_new_repo, stacked_on=stacked_on,
92
stack_on_pwd=stack_on_pwd, repo_format_name=repo_format_name,
93
make_working_trees=make_working_trees, shared_repo=shared_repo)
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)
96
94
def from_string(cls, format_string):
246
244
with ui.ui_factory.nested_progress_bar() as self.pb:
247
245
ui.ui_factory.note(gettext('starting upgrade from format 4 to 5'))
248
246
if isinstance(self.controldir.transport, local.LocalTransport):
249
self.controldir.get_workingtree_transport(
250
None).delete('stat-cache')
247
self.controldir.get_workingtree_transport(None).delete('stat-cache')
251
248
self._convert_to_weaves()
252
249
return ControlDir.open(self.controldir.user_url)
254
251
def _convert_to_weaves(self):
255
252
ui.ui_factory.note(gettext(
256
'note: upgrade may be faster if all store files are ungzipped first'))
253
'note: upgrade may be faster if all store files are ungzipped first'))
258
255
# TODO permissions
259
256
stat = self.controldir.transport.stat('weaves')
276
273
self.to_read = rev_history[-1:]
277
274
while self.to_read:
278
275
rev_id = self.to_read.pop()
279
if (rev_id not in self.revisions and
280
rev_id not in self.absent_revisions):
276
if (rev_id not in self.revisions
277
and rev_id not in self.absent_revisions):
281
278
self._load_one_rev(rev_id)
283
280
to_import = self._make_order()
289
286
self._write_all_revs()
290
287
ui.ui_factory.note(gettext('upgraded to weaves:'))
291
288
ui.ui_factory.note(' ' + gettext('%6d revisions and inventories') %
293
290
ui.ui_factory.note(' ' + gettext('%6d revisions not present') %
294
len(self.absent_revisions))
291
len(self.absent_revisions))
295
292
ui.ui_factory.note(' ' + gettext('%6d texts') % self.text_count)
296
293
self._cleanup_spare_files_after_format4()
297
294
self.branch._transport.put_bytes(
313
310
def _convert_working_inv(self):
314
311
inv = xml4.serializer_v4.read_inventory(
315
self.branch._transport.get('inventory'))
317
xml5.serializer_v5.write_inventory(inv, f, working=True)
318
self.branch._transport.put_bytes('inventory', f.getvalue(),
319
mode=self.controldir._get_file_mode())
312
self.branch._transport.get('inventory'))
313
new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv, working=True)
314
self.branch._transport.put_bytes('inventory', new_inv_xml,
315
mode=self.controldir._get_file_mode())
321
317
def _write_all_weaves(self):
322
318
controlweaves = VersionedFileStore(self.controldir.transport, prefixed=False,
323
versionedfile_class=weave.WeaveFile)
319
versionedfile_class=weave.WeaveFile)
324
320
weave_transport = self.controldir.transport.clone('weaves')
325
321
weaves = VersionedFileStore(weave_transport, prefixed=False,
326
versionedfile_class=weave.WeaveFile)
322
versionedfile_class=weave.WeaveFile)
327
323
transaction = WriteTransaction()
331
327
for file_id, file_weave in self.text_weaves.items():
332
328
self.pb.update(gettext('writing weave'), i,
333
len(self.text_weaves))
329
len(self.text_weaves))
334
330
weaves._put_weave(file_id, file_weave, transaction)
336
332
self.pb.update(gettext('inventory'), 0, 1)
337
controlweaves._put_weave(b'inventory', self.inv_weave, transaction)
333
controlweaves._put_weave('inventory', self.inv_weave, transaction)
338
334
self.pb.update(gettext('inventory'), 1, 1)
348
344
from ...bzr.xml5 import serializer_v5
349
345
from .repository import RevisionTextStore
350
346
revision_store = RevisionTextStore(revision_transport,
351
serializer_v5, False, versionedfile.PrefixMapper(),
352
lambda: True, lambda: True)
347
serializer_v5, False, versionedfile.PrefixMapper(),
348
lambda:True, lambda:True)
354
350
for i, rev_id in enumerate(self.converted_revs):
355
351
self.pb.update(gettext('write revision'), i,
356
len(self.converted_revs))
357
lines = serializer_v5.write_revision_to_lines(
352
len(self.converted_revs))
353
text = serializer_v5.write_revision_to_string(
358
354
self.revisions[rev_id])
360
revision_store.add_lines(key, None, lines)
356
revision_store.add_lines(key, None, osutils.split_lines(text))
372
368
if not self.branch.repository.has_revision(rev_id):
374
370
ui.ui_factory.note(gettext('revision {%s} not present in branch; '
375
'will be converted as a ghost') %
371
'will be converted as a ghost') %
377
373
self.absent_revisions.add(rev_id)
379
375
rev = self.branch.repository.get_revision(rev_id)
383
379
self.revisions[rev_id] = rev
385
381
def _load_old_inventory(self, rev_id):
386
with self.branch.repository.inventory_store.get(rev_id) as f:
387
inv = xml4.serializer_v4.read_inventory(f)
382
f = self.branch.repository.inventory_store.get(rev_id)
384
old_inv_xml = f.read()
387
inv = xml4.serializer_v4.read_inventory_from_string(old_inv_xml)
388
388
inv.revision_id = rev_id
389
389
rev = self.revisions[rev_id]
392
392
def _load_updated_inventory(self, rev_id):
393
inv_xml = self.inv_weave.get_lines(rev_id)
394
inv = xml5.serializer_v5.read_inventory_from_lines(inv_xml, rev_id)
393
inv_xml = self.inv_weave.get_text(rev_id)
394
inv = xml5.serializer_v5.read_inventory_from_string(inv_xml, rev_id)
397
397
def _convert_one_rev(self, rev_id):
405
405
self.converted_revs.add(rev_id)
407
407
def _store_new_inv(self, rev, inv, present_parents):
408
new_inv_xml = xml5.serializer_v5.write_inventory_to_lines(inv)
409
new_inv_sha1 = osutils.sha_strings(new_inv_xml)
408
new_inv_xml = xml5.serializer_v5.write_inventory_to_string(inv)
409
new_inv_sha1 = osutils.sha_string(new_inv_xml)
410
410
self.inv_weave.add_lines(rev.revision_id,
412
new_inv_xml.splitlines(True))
413
413
rev.inventory_sha1 = new_inv_sha1
415
415
def _convert_revision_contents(self, rev, inv, present_parents):
441
441
heads = graph.Graph(self).heads(parent_candiate_entries)
442
442
# XXX: Note that this is unordered - and this is tolerable because
443
443
# the previous code was also unordered.
444
previous_entries = {head: parent_candiate_entries[head]
444
previous_entries = dict((head, parent_candiate_entries[head]) for head
446
446
self.snapshot_ie(previous_entries, ie, w, rev_id)
448
448
def get_parent_map(self, revision_ids):
449
449
"""See graph.StackedParentsProvider.get_parent_map"""
450
450
return dict((revision_id, self.revisions[revision_id])
451
451
for revision_id in revision_ids
452
if revision_id in self.revisions)
452
if revision_id in self.revisions)
454
454
def snapshot_ie(self, previous_revisions, ie, w, rev_id):
455
455
# TODO: convert this logic, which is ~= snapshot to
465
465
ie.revision = previous_ie.revision
467
467
if ie.has_text():
468
with self.branch.repository._text_store.get(ie.text_id) as f:
468
f = self.branch.repository._text_store.get(ie.text_id)
469
470
file_lines = f.readlines()
470
473
w.add_lines(rev_id, previous_revisions, file_lines)
471
474
self.text_count += 1
516
519
store = TransportStore(store_transport, prefixed=True)
517
520
for urlfilename in store_transport.list_dir('.'):
518
521
filename = urlutils.unescape(urlfilename)
519
if (filename.endswith(".weave")
520
or filename.endswith(".gz")
521
or filename.endswith(".sig")):
522
if (filename.endswith(".weave") or
523
filename.endswith(".gz") or
524
filename.endswith(".sig")):
522
525
file_id, suffix = os.path.splitext(filename)
524
527
file_id = filename
526
new_name = store._mapper.map(
527
(file_id.encode('utf-8'),)) + suffix
529
new_name = store._mapper.map((file_id,)) + suffix
528
530
# FIXME keep track of the dirs made RBC 20060121
530
532
store_transport.move(filename, new_name)
531
except errors.NoSuchFile: # catches missing dirs strangely enough
533
except errors.NoSuchFile: # catches missing dirs strangely enough
532
534
store_transport.mkdir(osutils.dirname(new_name))
533
535
store_transport.move(filename, new_name)
534
536
self.controldir.transport.put_bytes(
547
549
self.controldir = to_convert
548
550
self.pb = ui.ui_factory.nested_progress_bar()
550
self.total = 20 # the steps we know about
552
self.total = 20 # the steps we know about
551
553
self.garbage_inventories = []
552
554
self.dir_mode = self.controldir._get_dir_mode()
553
555
self.file_mode = self.controldir._get_file_mode()
556
gettext('starting upgrade from format 6 to metadir'))
557
ui.ui_factory.note(gettext('starting upgrade from format 6 to metadir'))
557
558
self.controldir.transport.put_bytes(
559
b"Converting to format 6",
560
"Converting to format 6",
561
562
# its faster to move specific files around than to open and use the apis...
562
563
# first off, nuke ancestry.weave, it was never used.
657
658
def put_format(self, dirname, format):
658
659
self.controldir.transport.put_bytes('%s/format' % dirname,
659
format.get_format_string(),
660
format.get_format_string(),
663
664
class BzrDirFormat4(BzrDirFormat):
732
733
"""See ControlDir.__init__."""
733
734
super(BzrDirPreSplitOut, self).__init__(_transport, _format)
734
735
self._control_files = lockable_files.LockableFiles(
735
self.get_branch_transport(None),
736
self._format._lock_file_name,
737
self._format._lock_class)
736
self.get_branch_transport(None),
737
self._format._lock_file_name,
738
self._format._lock_class)
739
740
def break_lock(self):
740
741
"""Pre-splitout bzrdirs do not suffer from stale locks."""
747
748
return self._format.__class__()
749
750
def clone(self, url, revision_id=None, force_new_repo=False,
750
preserve_stacking=False, tag_selector=None):
751
preserve_stacking=False):
751
752
"""See ControlDir.clone().
753
754
force_new_repo has no effect, since this family of formats always
759
760
result = self._format._initialize_for_clone(url)
760
761
self.open_repository().clone(result, revision_id=revision_id)
761
762
from_branch = self.open_branch()
762
from_branch.clone(result, revision_id=revision_id, tag_selector=tag_selector)
763
from_branch.clone(result, revision_id=revision_id)
764
765
tree = self.open_workingtree()
765
766
except errors.NotLocalUrl:
776
777
raise NotImplementedError(
777
778
"create_branch(repository=<not None>) on %r" % (self,))
778
779
return self._format.get_branch_format().initialize(self, name=name,
779
append_revisions_only=append_revisions_only)
780
append_revisions_only=append_revisions_only)
781
782
def destroy_branch(self, name=None):
782
783
"""See ControlDir.destroy_branch."""
843
844
def get_branch_transport(self, branch_format, name=None):
844
845
"""See BzrDir.get_branch_transport()."""
846
847
raise errors.NoColocatedBranchSupport(self)
847
848
if branch_format is None:
848
849
return self.transport
885
886
format = BzrBranchFormat4()
886
887
format.check_support_status(unsupported)
887
888
return format.open(self, name, _found=True,
888
possible_transports=possible_transports)
889
possible_transports=possible_transports)
890
891
def sprout(self, url, revision_id=None, force_new_repo=False,
891
recurse=None, possible_transports=None, accelerator_tree=None,
892
possible_transports=None, accelerator_tree=None,
892
893
hardlink=False, stacked=False, create_tree_if_local=True,
893
894
source_branch=None):
894
895
"""See ControlDir.sprout()."""
958
959
def has_workingtree(self):
959
960
"""See ControlDir.has_workingtree."""
962
963
def open_repository(self):
963
964
"""See ControlDir.open_repository."""
964
965
from .repository import RepositoryFormat5
965
966
return RepositoryFormat5().open(self, _found=True)
967
968
def open_workingtree(self, unsupported=False,
968
recommend_upgrade=True):
969
recommend_upgrade=True):
969
970
"""See ControlDir.create_workingtree."""
970
971
from .workingtree import WorkingTreeFormat2
971
972
wt_format = WorkingTreeFormat2()