118
118
# which allows access to this old info.
119
119
self.inventory_store = get_store('inventory-store')
120
120
self._text_store = get_store('text-store')
121
super(AllInOneRepository, self).__init__(_format, a_controldir, a_controldir._control_files)
121
super(AllInOneRepository, self).__init__(
122
_format, a_controldir, a_controldir._control_files)
123
124
def _all_possible_ids(self):
124
125
"""Return all the possible revisions that we could find."""
161
162
revision_id=None, lossy=False):
162
163
self._check_ascii_revisionid(revision_id, self.get_commit_builder)
163
164
result = VersionedFileCommitBuilder(self, parents, config, timestamp,
164
timezone, committer, revprops, revision_id, lossy=lossy)
165
timezone, committer, revprops, revision_id, lossy=lossy)
165
166
self.start_write_group()
168
169
def _inventory_add_lines(self, revision_id, parents, lines,
170
171
"""Store lines in inv_vf and return the sha1 of the inventory."""
171
172
present_parents = self.get_graph().get_parent_map(parents)
172
173
final_parents = []
174
175
if parent in present_parents:
175
176
final_parents.append((parent,))
176
177
return self.inventories.add_lines((revision_id,), final_parents, lines,
177
check_content=check_content)[0]
178
check_content=check_content)[0]
179
180
def is_shared(self):
180
181
"""AllInOne repositories cannot be shared."""
202
203
def __init__(self, _format, a_controldir, control_files):
203
204
super(WeaveMetaDirRepository, self).__init__(
204
_format, a_controldir, control_files)
205
_format, a_controldir, control_files)
205
206
self._serializer = _format._serializer
207
208
def _all_possible_ids(self):
245
246
revision_id=None, lossy=False):
246
247
self._check_ascii_revisionid(revision_id, self.get_commit_builder)
247
248
result = VersionedFileCommitBuilder(self, parents, config, timestamp,
248
timezone, committer, revprops, revision_id, lossy=lossy)
249
timezone, committer, revprops, revision_id, lossy=lossy)
249
250
self.start_write_group()
255
256
return self.get_revision_reconcile(revision_id)
257
258
def _inventory_add_lines(self, revision_id, parents, lines,
259
260
"""Store lines in inv_vf and return the sha1 of the inventory."""
260
261
present_parents = self.get_graph().get_parent_map(parents)
261
262
final_parents = []
263
264
if parent in present_parents:
264
265
final_parents.append((parent,))
265
266
return self.inventories.add_lines((revision_id,), final_parents, lines,
266
check_content=check_content)[0]
267
check_content=check_content)[0]
269
270
class PreSplitOutRepositoryFormat(VersionedFileRepositoryFormat):
303
304
# FIXME: RBC 20060125 don't peek under the covers
304
305
# NB: no need to escape relative paths that are url safe.
305
306
control_files = lockable_files.LockableFiles(a_controldir.transport,
306
'branch-lock', lockable_files.TransportLock)
307
'branch-lock', lockable_files.TransportLock)
307
308
control_files.create_lock()
308
309
control_files.lock_write()
309
310
transport = a_controldir.transport
312
313
mode=a_controldir._get_dir_mode())
313
314
transport.mkdir('weaves', mode=a_controldir._get_dir_mode())
314
315
transport.put_bytes_non_atomic('inventory.weave', empty_weave,
315
mode=a_controldir._get_file_mode())
316
mode=a_controldir._get_file_mode())
317
318
control_files.unlock()
318
319
repository = self.open(a_controldir, _found=True)
378
379
def _get_revisions(self, repo_transport, repo):
379
380
from .xml4 import serializer_v4
380
381
return RevisionTextStore(repo_transport.clone('revision-store'),
381
serializer_v4, True, versionedfile.PrefixMapper(),
382
repo.is_locked, repo.is_write_locked)
382
serializer_v4, True, versionedfile.PrefixMapper(),
383
repo.is_locked, repo.is_write_locked)
384
385
def _get_signatures(self, repo_transport, repo):
385
386
return SignatureTextStore(repo_transport.clone('revision-store'),
386
False, versionedfile.PrefixMapper(),
387
repo.is_locked, repo.is_write_locked)
387
False, versionedfile.PrefixMapper(),
388
repo.is_locked, repo.is_write_locked)
389
390
def _get_texts(self, repo_transport, repo):
418
419
def _get_inventories(self, repo_transport, repo, name='inventory'):
419
420
mapper = versionedfile.ConstantMapper(name)
420
421
return versionedfile.ThunkedVersionedFiles(repo_transport,
421
weave.WeaveFile, mapper, repo.is_locked)
422
weave.WeaveFile, mapper, repo.is_locked)
423
424
def _get_revisions(self, repo_transport, repo):
424
425
return RevisionTextStore(repo_transport.clone('revision-store'),
425
xml5.serializer_v5, False, versionedfile.PrefixMapper(),
426
repo.is_locked, repo.is_write_locked)
426
xml5.serializer_v5, False, versionedfile.PrefixMapper(),
427
repo.is_locked, repo.is_write_locked)
428
429
def _get_signatures(self, repo_transport, repo):
429
430
return SignatureTextStore(repo_transport.clone('revision-store'),
430
False, versionedfile.PrefixMapper(),
431
repo.is_locked, repo.is_write_locked)
431
False, versionedfile.PrefixMapper(),
432
repo.is_locked, repo.is_write_locked)
433
434
def _get_texts(self, repo_transport, repo):
434
435
mapper = versionedfile.PrefixMapper()
435
436
base_transport = repo_transport.clone('weaves')
436
437
return versionedfile.ThunkedVersionedFiles(base_transport,
437
weave.WeaveFile, mapper, repo.is_locked)
438
weave.WeaveFile, mapper, repo.is_locked)
440
441
class RepositoryFormat6(PreSplitOutRepositoryFormat):
464
466
def _get_inventories(self, repo_transport, repo, name='inventory'):
465
467
mapper = versionedfile.ConstantMapper(name)
466
468
return versionedfile.ThunkedVersionedFiles(repo_transport,
467
weave.WeaveFile, mapper, repo.is_locked)
469
weave.WeaveFile, mapper, repo.is_locked)
469
471
def _get_revisions(self, repo_transport, repo):
470
472
return RevisionTextStore(repo_transport.clone('revision-store'),
471
xml5.serializer_v5, False, versionedfile.HashPrefixMapper(),
472
repo.is_locked, repo.is_write_locked)
473
xml5.serializer_v5, False, versionedfile.HashPrefixMapper(),
474
repo.is_locked, repo.is_write_locked)
474
476
def _get_signatures(self, repo_transport, repo):
475
477
return SignatureTextStore(repo_transport.clone('revision-store'),
476
False, versionedfile.HashPrefixMapper(),
477
repo.is_locked, repo.is_write_locked)
478
False, versionedfile.HashPrefixMapper(),
479
repo.is_locked, repo.is_write_locked)
479
481
def _get_texts(self, repo_transport, repo):
480
482
mapper = versionedfile.HashPrefixMapper()
481
483
base_transport = repo_transport.clone('weaves')
482
484
return versionedfile.ThunkedVersionedFiles(base_transport,
483
weave.WeaveFile, mapper, repo.is_locked)
485
weave.WeaveFile, mapper, repo.is_locked)
486
488
class RepositoryFormat7(MetaDirVersionedFileRepositoryFormat):
520
523
def _get_inventories(self, repo_transport, repo, name='inventory'):
521
524
mapper = versionedfile.ConstantMapper(name)
522
525
return versionedfile.ThunkedVersionedFiles(repo_transport,
523
weave.WeaveFile, mapper, repo.is_locked)
526
weave.WeaveFile, mapper, repo.is_locked)
525
528
def _get_revisions(self, repo_transport, repo):
526
529
return RevisionTextStore(repo_transport.clone('revision-store'),
527
xml5.serializer_v5, True, versionedfile.HashPrefixMapper(),
528
repo.is_locked, repo.is_write_locked)
530
xml5.serializer_v5, True, versionedfile.HashPrefixMapper(),
531
repo.is_locked, repo.is_write_locked)
530
533
def _get_signatures(self, repo_transport, repo):
531
534
return SignatureTextStore(repo_transport.clone('revision-store'),
532
True, versionedfile.HashPrefixMapper(),
533
repo.is_locked, repo.is_write_locked)
535
True, versionedfile.HashPrefixMapper(),
536
repo.is_locked, repo.is_write_locked)
535
538
def _get_texts(self, repo_transport, repo):
536
539
mapper = versionedfile.HashPrefixMapper()
537
540
base_transport = repo_transport.clone('weaves')
538
541
return versionedfile.ThunkedVersionedFiles(base_transport,
539
weave.WeaveFile, mapper, repo.is_locked)
542
weave.WeaveFile, mapper, repo.is_locked)
541
544
def initialize(self, a_controldir, shared=False):
542
545
"""Create a weave repository.
556
559
utf8_files = [('format', self.get_format_string())]
558
self._upload_blank_content(a_controldir, dirs, files, utf8_files, shared)
561
self._upload_blank_content(
562
a_controldir, dirs, files, utf8_files, shared)
559
563
return self.open(a_controldir=a_controldir, _found=True)
561
565
def open(self, a_controldir, _found=False, _override_transport=None):
573
577
repo_transport = a_controldir.get_repository_transport(None)
574
578
control_files = lockable_files.LockableFiles(repo_transport,
575
'lock', lockdir.LockDir)
579
'lock', lockdir.LockDir)
576
580
result = WeaveMetaDirRepository(_format=self, a_controldir=a_controldir,
577
control_files=control_files)
581
control_files=control_files)
578
582
result.revisions = self._get_revisions(repo_transport, result)
579
583
result.signatures = self._get_signatures(repo_transport, result)
580
584
result.inventories = self._get_inventories(repo_transport, result)
614
618
chunks = tuned_gzip.chunks_to_gzip(chunks)
615
619
path = self._map(key)
616
620
self._transport.put_file_non_atomic(
617
path, BytesIO(b''.join(chunks)),
618
create_parent_dir=True)
621
path, BytesIO(b''.join(chunks)),
622
create_parent_dir=True)
620
624
def insert_record_stream(self, stream):
626
630
# adapt to non-tuple interface
627
631
if record.storage_kind == 'fulltext':
628
632
self.add_lines(record.key, None,
629
osutils.split_lines(record.get_bytes_as('fulltext')))
633
osutils.split_lines(record.get_bytes_as('fulltext')))
631
635
adapter_key = record.storage_kind, 'fulltext'
672
676
"""Legacy thunk for format 4 repositories."""
674
678
def __init__(self, transport, serializer, compressed, mapper, is_locked,
676
680
"""Create a RevisionTextStore at transport with serializer."""
677
681
TextVersionedFiles.__init__(self, transport, compressed, mapper,
678
is_locked, can_write)
682
is_locked, can_write)
679
683
self._serializer = serializer
681
685
def _load_text_parents(self, key):
730
734
def __init__(self, transport, compressed, mapper, is_locked, can_write):
731
735
TextVersionedFiles.__init__(self, transport, compressed, mapper,
732
is_locked, can_write)
736
is_locked, can_write)
733
737
self._ext = '.sig' + self._ext
735
739
def get_parent_map(self, keys):
785
789
return (isinstance(source._format, (RepositoryFormat5,
786
790
RepositoryFormat6,
787
RepositoryFormat7)) and
788
isinstance(target._format, (RepositoryFormat5,
792
and isinstance(target._format, (RepositoryFormat5,
791
795
except AttributeError:
796
800
with self.lock_write():
797
801
# weave specific optimised path:
799
self.target.set_make_working_trees(self.source.make_working_trees())
803
self.target.set_make_working_trees(
804
self.source.make_working_trees())
800
805
except (errors.RepositoryUpgradeRequired, NotImplementedError):
802
807
# FIXME do not peek!
843
848
# know we do not have a revision as that would be pointless.
844
849
target_ids = set(self.target._all_possible_ids())
845
850
possibly_present_revisions = target_ids.intersection(
847
852
actually_present_revisions = set(
848
853
self.target._eliminate_revisions_not_present(
849
854
possibly_present_revisions))
850
855
required_revisions = source_ids_set.difference(
851
actually_present_revisions)
856
actually_present_revisions)
852
857
if revision_ids is not None:
853
858
# we used get_ancestry to determine source_ids then we are
854
859
# assured all revisions referenced are present as they are
874
879
def get_extra_interrepo_test_combinations():
875
880
from ...bzr import knitrepo
876
881
return [(InterRepository, RepositoryFormat5(),
877
knitrepo.RepositoryFormatKnit3())]
882
knitrepo.RepositoryFormatKnit3())]